15b504601Sjiang wu - Sun Microsystems - Beijing China /*
25b504601Sjiang wu - Sun Microsystems - Beijing China * CDDL HEADER START
35b504601Sjiang wu - Sun Microsystems - Beijing China *
45b504601Sjiang wu - Sun Microsystems - Beijing China * The contents of this file are subject to the terms of the
55b504601Sjiang wu - Sun Microsystems - Beijing China * Common Development and Distribution License (the "License").
65b504601Sjiang wu - Sun Microsystems - Beijing China * You may not use this file except in compliance with the License.
75b504601Sjiang wu - Sun Microsystems - Beijing China *
85b504601Sjiang wu - Sun Microsystems - Beijing China * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
95b504601Sjiang wu - Sun Microsystems - Beijing China * or http://www.opensolaris.org/os/licensing.
105b504601Sjiang wu - Sun Microsystems - Beijing China * See the License for the specific language governing permissions
115b504601Sjiang wu - Sun Microsystems - Beijing China * and limitations under the License.
125b504601Sjiang wu - Sun Microsystems - Beijing China *
135b504601Sjiang wu - Sun Microsystems - Beijing China * When distributing Covered Code, include this CDDL HEADER in each
145b504601Sjiang wu - Sun Microsystems - Beijing China * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
155b504601Sjiang wu - Sun Microsystems - Beijing China * If applicable, add the following below this CDDL HEADER, with the
165b504601Sjiang wu - Sun Microsystems - Beijing China * fields enclosed by brackets "[]" replaced with your own identifying
175b504601Sjiang wu - Sun Microsystems - Beijing China * information: Portions Copyright [yyyy] [name of copyright owner]
185b504601Sjiang wu - Sun Microsystems - Beijing China *
195b504601Sjiang wu - Sun Microsystems - Beijing China * CDDL HEADER END
205b504601Sjiang wu - Sun Microsystems - Beijing China */
215b504601Sjiang wu - Sun Microsystems - Beijing China
225b504601Sjiang wu - Sun Microsystems - Beijing China /*
239814ff7fSYong-Feng Du * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
24e18306b1SDan McDonald * Copyright 2012 Nexenta Systems, Inc. All rights reserved.
25f7d0d869SDan McDonald * Copyright 2014 OmniTI Computer Consulting, Inc. All rights reserved.
26ed7418aeSAndy Giles * Copyright (c) 2014, Tegile Systems Inc. All rights reserved.
27882fdc88SHans Rosenfeld * Copyright (c) 2019, Joyent, Inc.
28*72a2c484SHans Rosenfeld * Copyright 2023 Racktop Systems, Inc.
295b504601Sjiang wu - Sun Microsystems - Beijing China */
305b504601Sjiang wu - Sun Microsystems - Beijing China
315b504601Sjiang wu - Sun Microsystems - Beijing China /*
32c8f74a56SAda * Copyright (c) 2000 to 2010, LSI Corporation.
335b504601Sjiang wu - Sun Microsystems - Beijing China * All rights reserved.
345b504601Sjiang wu - Sun Microsystems - Beijing China *
355b504601Sjiang wu - Sun Microsystems - Beijing China * Redistribution and use in source and binary forms of all code within
365b504601Sjiang wu - Sun Microsystems - Beijing China * this file that is exclusively owned by LSI, with or without
375b504601Sjiang wu - Sun Microsystems - Beijing China * modification, is permitted provided that, in addition to the CDDL 1.0
385b504601Sjiang wu - Sun Microsystems - Beijing China * License requirements, the following conditions are met:
395b504601Sjiang wu - Sun Microsystems - Beijing China *
405b504601Sjiang wu - Sun Microsystems - Beijing China * Neither the name of the author nor the names of its contributors may be
415b504601Sjiang wu - Sun Microsystems - Beijing China * used to endorse or promote products derived from this software without
425b504601Sjiang wu - Sun Microsystems - Beijing China * specific prior written permission.
435b504601Sjiang wu - Sun Microsystems - Beijing China *
445b504601Sjiang wu - Sun Microsystems - Beijing China * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
455b504601Sjiang wu - Sun Microsystems - Beijing China * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
465b504601Sjiang wu - Sun Microsystems - Beijing China * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
475b504601Sjiang wu - Sun Microsystems - Beijing China * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
485b504601Sjiang wu - Sun Microsystems - Beijing China * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
495b504601Sjiang wu - Sun Microsystems - Beijing China * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
505b504601Sjiang wu - Sun Microsystems - Beijing China * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
515b504601Sjiang wu - Sun Microsystems - Beijing China * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
525b504601Sjiang wu - Sun Microsystems - Beijing China * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
535b504601Sjiang wu - Sun Microsystems - Beijing China * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
545b504601Sjiang wu - Sun Microsystems - Beijing China * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
555b504601Sjiang wu - Sun Microsystems - Beijing China * DAMAGE.
565b504601Sjiang wu - Sun Microsystems - Beijing China */
575b504601Sjiang wu - Sun Microsystems - Beijing China
585b504601Sjiang wu - Sun Microsystems - Beijing China /*
595b504601Sjiang wu - Sun Microsystems - Beijing China * mptsas_impl - This file contains all the basic functions for communicating
605b504601Sjiang wu - Sun Microsystems - Beijing China * to MPT based hardware.
615b504601Sjiang wu - Sun Microsystems - Beijing China */
625b504601Sjiang wu - Sun Microsystems - Beijing China
635b504601Sjiang wu - Sun Microsystems - Beijing China #if defined(lint) || defined(DEBUG)
645b504601Sjiang wu - Sun Microsystems - Beijing China #define MPTSAS_DEBUG
655b504601Sjiang wu - Sun Microsystems - Beijing China #endif
665b504601Sjiang wu - Sun Microsystems - Beijing China
675b504601Sjiang wu - Sun Microsystems - Beijing China /*
685b504601Sjiang wu - Sun Microsystems - Beijing China * standard header files
695b504601Sjiang wu - Sun Microsystems - Beijing China */
705b504601Sjiang wu - Sun Microsystems - Beijing China #include <sys/note.h>
715b504601Sjiang wu - Sun Microsystems - Beijing China #include <sys/scsi/scsi.h>
725b504601Sjiang wu - Sun Microsystems - Beijing China #include <sys/pci.h>
735b504601Sjiang wu - Sun Microsystems - Beijing China
745b504601Sjiang wu - Sun Microsystems - Beijing China #pragma pack(1)
75*72a2c484SHans Rosenfeld #include <sys/scsi/adapters/mpi/mpi2_type.h>
76*72a2c484SHans Rosenfeld #include <sys/scsi/adapters/mpi/mpi2.h>
77*72a2c484SHans Rosenfeld #include <sys/scsi/adapters/mpi/mpi2_cnfg.h>
78*72a2c484SHans Rosenfeld #include <sys/scsi/adapters/mpi/mpi2_init.h>
79*72a2c484SHans Rosenfeld #include <sys/scsi/adapters/mpi/mpi2_ioc.h>
80*72a2c484SHans Rosenfeld #include <sys/scsi/adapters/mpi/mpi2_sas.h>
81*72a2c484SHans Rosenfeld #include <sys/scsi/adapters/mpi/mpi2_tool.h>
825b504601Sjiang wu - Sun Microsystems - Beijing China #pragma pack()
835b504601Sjiang wu - Sun Microsystems - Beijing China
845b504601Sjiang wu - Sun Microsystems - Beijing China /*
855b504601Sjiang wu - Sun Microsystems - Beijing China * private header files.
865b504601Sjiang wu - Sun Microsystems - Beijing China */
875b504601Sjiang wu - Sun Microsystems - Beijing China #include <sys/scsi/adapters/mpt_sas/mptsas_var.h>
88f2e8686eSxun ni - Sun Microsystems - Beijing China #include <sys/scsi/adapters/mpt_sas/mptsas_smhba.h>
895b504601Sjiang wu - Sun Microsystems - Beijing China
905b504601Sjiang wu - Sun Microsystems - Beijing China /*
915b504601Sjiang wu - Sun Microsystems - Beijing China * FMA header files.
925b504601Sjiang wu - Sun Microsystems - Beijing China */
935b504601Sjiang wu - Sun Microsystems - Beijing China #include <sys/fm/io/ddi.h>
945b504601Sjiang wu - Sun Microsystems - Beijing China
955b504601Sjiang wu - Sun Microsystems - Beijing China /*
965b504601Sjiang wu - Sun Microsystems - Beijing China * prototypes
975b504601Sjiang wu - Sun Microsystems - Beijing China */
985b504601Sjiang wu - Sun Microsystems - Beijing China static void mptsas_ioc_event_cmdq_add(mptsas_t *mpt, m_event_struct_t *cmd);
995b504601Sjiang wu - Sun Microsystems - Beijing China static void mptsas_ioc_event_cmdq_delete(mptsas_t *mpt, m_event_struct_t *cmd);
1005b504601Sjiang wu - Sun Microsystems - Beijing China static m_event_struct_t *mptsas_ioc_event_find_by_cmd(mptsas_t *mpt,
1015b504601Sjiang wu - Sun Microsystems - Beijing China struct mptsas_cmd *cmd);
1025b504601Sjiang wu - Sun Microsystems - Beijing China
1035b504601Sjiang wu - Sun Microsystems - Beijing China /*
1045b504601Sjiang wu - Sun Microsystems - Beijing China * add ioc evnet cmd into the queue
1055b504601Sjiang wu - Sun Microsystems - Beijing China */
1065b504601Sjiang wu - Sun Microsystems - Beijing China static void
mptsas_ioc_event_cmdq_add(mptsas_t * mpt,m_event_struct_t * cmd)1075b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_ioc_event_cmdq_add(mptsas_t *mpt, m_event_struct_t *cmd)
1085b504601Sjiang wu - Sun Microsystems - Beijing China {
1095b504601Sjiang wu - Sun Microsystems - Beijing China if ((cmd->m_event_linkp = mpt->m_ioc_event_cmdq) == NULL) {
1105b504601Sjiang wu - Sun Microsystems - Beijing China mpt->m_ioc_event_cmdtail = &cmd->m_event_linkp;
1115b504601Sjiang wu - Sun Microsystems - Beijing China mpt->m_ioc_event_cmdq = cmd;
1125b504601Sjiang wu - Sun Microsystems - Beijing China } else {
1135b504601Sjiang wu - Sun Microsystems - Beijing China cmd->m_event_linkp = NULL;
1145b504601Sjiang wu - Sun Microsystems - Beijing China *(mpt->m_ioc_event_cmdtail) = cmd;
1155b504601Sjiang wu - Sun Microsystems - Beijing China mpt->m_ioc_event_cmdtail = &cmd->m_event_linkp;
1165b504601Sjiang wu - Sun Microsystems - Beijing China }
1175b504601Sjiang wu - Sun Microsystems - Beijing China }
1185b504601Sjiang wu - Sun Microsystems - Beijing China
1195b504601Sjiang wu - Sun Microsystems - Beijing China /*
1205b504601Sjiang wu - Sun Microsystems - Beijing China * remove specified cmd from the ioc event queue
1215b504601Sjiang wu - Sun Microsystems - Beijing China */
1225b504601Sjiang wu - Sun Microsystems - Beijing China static void
mptsas_ioc_event_cmdq_delete(mptsas_t * mpt,m_event_struct_t * cmd)1235b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_ioc_event_cmdq_delete(mptsas_t *mpt, m_event_struct_t *cmd)
1245b504601Sjiang wu - Sun Microsystems - Beijing China {
1255b504601Sjiang wu - Sun Microsystems - Beijing China m_event_struct_t *prev = mpt->m_ioc_event_cmdq;
1265b504601Sjiang wu - Sun Microsystems - Beijing China if (prev == cmd) {
1275b504601Sjiang wu - Sun Microsystems - Beijing China if ((mpt->m_ioc_event_cmdq = cmd->m_event_linkp) == NULL) {
1285b504601Sjiang wu - Sun Microsystems - Beijing China mpt->m_ioc_event_cmdtail = &mpt->m_ioc_event_cmdq;
1295b504601Sjiang wu - Sun Microsystems - Beijing China }
1305b504601Sjiang wu - Sun Microsystems - Beijing China cmd->m_event_linkp = NULL;
1315b504601Sjiang wu - Sun Microsystems - Beijing China return;
1325b504601Sjiang wu - Sun Microsystems - Beijing China }
1335b504601Sjiang wu - Sun Microsystems - Beijing China while (prev != NULL) {
1345b504601Sjiang wu - Sun Microsystems - Beijing China if (prev->m_event_linkp == cmd) {
1355b504601Sjiang wu - Sun Microsystems - Beijing China prev->m_event_linkp = cmd->m_event_linkp;
1365b504601Sjiang wu - Sun Microsystems - Beijing China if (cmd->m_event_linkp == NULL) {
1375b504601Sjiang wu - Sun Microsystems - Beijing China mpt->m_ioc_event_cmdtail = &prev->m_event_linkp;
1385b504601Sjiang wu - Sun Microsystems - Beijing China }
1395b504601Sjiang wu - Sun Microsystems - Beijing China
1405b504601Sjiang wu - Sun Microsystems - Beijing China cmd->m_event_linkp = NULL;
1415b504601Sjiang wu - Sun Microsystems - Beijing China return;
1425b504601Sjiang wu - Sun Microsystems - Beijing China }
1435b504601Sjiang wu - Sun Microsystems - Beijing China prev = prev->m_event_linkp;
1445b504601Sjiang wu - Sun Microsystems - Beijing China }
1455b504601Sjiang wu - Sun Microsystems - Beijing China }
1465b504601Sjiang wu - Sun Microsystems - Beijing China
1475b504601Sjiang wu - Sun Microsystems - Beijing China static m_event_struct_t *
mptsas_ioc_event_find_by_cmd(mptsas_t * mpt,struct mptsas_cmd * cmd)1485b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_ioc_event_find_by_cmd(mptsas_t *mpt, struct mptsas_cmd *cmd)
1495b504601Sjiang wu - Sun Microsystems - Beijing China {
1505b504601Sjiang wu - Sun Microsystems - Beijing China m_event_struct_t *ioc_cmd = NULL;
1515b504601Sjiang wu - Sun Microsystems - Beijing China
1525b504601Sjiang wu - Sun Microsystems - Beijing China ioc_cmd = mpt->m_ioc_event_cmdq;
1535b504601Sjiang wu - Sun Microsystems - Beijing China while (ioc_cmd != NULL) {
1545b504601Sjiang wu - Sun Microsystems - Beijing China if (&(ioc_cmd->m_event_cmd) == cmd) {
1555b504601Sjiang wu - Sun Microsystems - Beijing China return (ioc_cmd);
1565b504601Sjiang wu - Sun Microsystems - Beijing China }
1575b504601Sjiang wu - Sun Microsystems - Beijing China ioc_cmd = ioc_cmd->m_event_linkp;
1585b504601Sjiang wu - Sun Microsystems - Beijing China }
1595b504601Sjiang wu - Sun Microsystems - Beijing China ioc_cmd = NULL;
1605b504601Sjiang wu - Sun Microsystems - Beijing China return (ioc_cmd);
1615b504601Sjiang wu - Sun Microsystems - Beijing China }
1625b504601Sjiang wu - Sun Microsystems - Beijing China
1635b504601Sjiang wu - Sun Microsystems - Beijing China void
mptsas_destroy_ioc_event_cmd(mptsas_t * mpt)1645b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_destroy_ioc_event_cmd(mptsas_t *mpt)
1655b504601Sjiang wu - Sun Microsystems - Beijing China {
1665b504601Sjiang wu - Sun Microsystems - Beijing China m_event_struct_t *ioc_cmd = NULL;
1675b504601Sjiang wu - Sun Microsystems - Beijing China m_event_struct_t *ioc_cmd_tmp = NULL;
1685b504601Sjiang wu - Sun Microsystems - Beijing China ioc_cmd = mpt->m_ioc_event_cmdq;
1695b504601Sjiang wu - Sun Microsystems - Beijing China
1705b504601Sjiang wu - Sun Microsystems - Beijing China /*
1715b504601Sjiang wu - Sun Microsystems - Beijing China * because the IOC event queue is resource of per instance for driver,
1725b504601Sjiang wu - Sun Microsystems - Beijing China * it's not only ACK event commands used it, but also some others used
1735b504601Sjiang wu - Sun Microsystems - Beijing China * it. We need destroy all ACK event commands when IOC reset, but can't
1745b504601Sjiang wu - Sun Microsystems - Beijing China * disturb others.So we use filter to clear the ACK event cmd in ioc
1755b504601Sjiang wu - Sun Microsystems - Beijing China * event queue, and other requests should be reserved, and they would
1765b504601Sjiang wu - Sun Microsystems - Beijing China * be free by its owner.
1775b504601Sjiang wu - Sun Microsystems - Beijing China */
1785b504601Sjiang wu - Sun Microsystems - Beijing China while (ioc_cmd != NULL) {
1795b504601Sjiang wu - Sun Microsystems - Beijing China if (ioc_cmd->m_event_cmd.cmd_flags & CFLAG_CMDACK) {
1805b504601Sjiang wu - Sun Microsystems - Beijing China NDBG20(("destroy!! remove Ack Flag ioc_cmd\n"));
1815b504601Sjiang wu - Sun Microsystems - Beijing China if ((mpt->m_ioc_event_cmdq =
1825b504601Sjiang wu - Sun Microsystems - Beijing China ioc_cmd->m_event_linkp) == NULL)
1835b504601Sjiang wu - Sun Microsystems - Beijing China mpt->m_ioc_event_cmdtail =
1845b504601Sjiang wu - Sun Microsystems - Beijing China &mpt->m_ioc_event_cmdq;
1855b504601Sjiang wu - Sun Microsystems - Beijing China ioc_cmd_tmp = ioc_cmd;
1865b504601Sjiang wu - Sun Microsystems - Beijing China ioc_cmd = ioc_cmd->m_event_linkp;
1875b504601Sjiang wu - Sun Microsystems - Beijing China kmem_free(ioc_cmd_tmp, M_EVENT_STRUCT_SIZE);
1885b504601Sjiang wu - Sun Microsystems - Beijing China } else {
1895b504601Sjiang wu - Sun Microsystems - Beijing China /*
1905b504601Sjiang wu - Sun Microsystems - Beijing China * it's not ack cmd, so continue to check next one
1915b504601Sjiang wu - Sun Microsystems - Beijing China */
1925b504601Sjiang wu - Sun Microsystems - Beijing China
1935b504601Sjiang wu - Sun Microsystems - Beijing China NDBG20(("destroy!! it's not Ack Flag, continue\n"));
1945b504601Sjiang wu - Sun Microsystems - Beijing China ioc_cmd = ioc_cmd->m_event_linkp;
1955b504601Sjiang wu - Sun Microsystems - Beijing China }
1965b504601Sjiang wu - Sun Microsystems - Beijing China
1975b504601Sjiang wu - Sun Microsystems - Beijing China }
1985b504601Sjiang wu - Sun Microsystems - Beijing China }
1995b504601Sjiang wu - Sun Microsystems - Beijing China
2005b504601Sjiang wu - Sun Microsystems - Beijing China void
mptsas_start_config_page_access(mptsas_t * mpt,mptsas_cmd_t * cmd)2015b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_start_config_page_access(mptsas_t *mpt, mptsas_cmd_t *cmd)
2025b504601Sjiang wu - Sun Microsystems - Beijing China {
2035b504601Sjiang wu - Sun Microsystems - Beijing China pMpi2ConfigRequest_t request;
2045b504601Sjiang wu - Sun Microsystems - Beijing China pMpi2SGESimple64_t sge;
2055b504601Sjiang wu - Sun Microsystems - Beijing China struct scsi_pkt *pkt = cmd->cmd_pkt;
2065b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_config_request_t *config = pkt->pkt_ha_private;
2075b504601Sjiang wu - Sun Microsystems - Beijing China uint8_t direction;
208940efceeSAndy Giles uint32_t length, flagslength;
209940efceeSAndy Giles uint64_t request_desc;
2105b504601Sjiang wu - Sun Microsystems - Beijing China
2115b504601Sjiang wu - Sun Microsystems - Beijing China ASSERT(mutex_owned(&mpt->m_mutex));
2125b504601Sjiang wu - Sun Microsystems - Beijing China
2135b504601Sjiang wu - Sun Microsystems - Beijing China /*
2145b504601Sjiang wu - Sun Microsystems - Beijing China * Point to the correct message and clear it as well as the global
2155b504601Sjiang wu - Sun Microsystems - Beijing China * config page memory.
2165b504601Sjiang wu - Sun Microsystems - Beijing China */
2175b504601Sjiang wu - Sun Microsystems - Beijing China request = (pMpi2ConfigRequest_t)(mpt->m_req_frame +
2185b504601Sjiang wu - Sun Microsystems - Beijing China (mpt->m_req_frame_size * cmd->cmd_slot));
2195b504601Sjiang wu - Sun Microsystems - Beijing China bzero(request, mpt->m_req_frame_size);
2205b504601Sjiang wu - Sun Microsystems - Beijing China
2215b504601Sjiang wu - Sun Microsystems - Beijing China /*
2225b504601Sjiang wu - Sun Microsystems - Beijing China * Form the request message.
2235b504601Sjiang wu - Sun Microsystems - Beijing China */
2245b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put8(mpt->m_acc_req_frame_hdl, &request->Function,
2255b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_FUNCTION_CONFIG);
2265b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put8(mpt->m_acc_req_frame_hdl, &request->Action, config->action);
2275b504601Sjiang wu - Sun Microsystems - Beijing China direction = MPI2_SGE_FLAGS_IOC_TO_HOST;
2285b504601Sjiang wu - Sun Microsystems - Beijing China length = 0;
2295b504601Sjiang wu - Sun Microsystems - Beijing China sge = (pMpi2SGESimple64_t)&request->PageBufferSGE;
2305b504601Sjiang wu - Sun Microsystems - Beijing China if (config->action == MPI2_CONFIG_ACTION_PAGE_HEADER) {
2315b504601Sjiang wu - Sun Microsystems - Beijing China if (config->page_type > MPI2_CONFIG_PAGETYPE_MASK) {
2325b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put8(mpt->m_acc_req_frame_hdl,
2335b504601Sjiang wu - Sun Microsystems - Beijing China &request->Header.PageType,
2345b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_CONFIG_PAGETYPE_EXTENDED);
2355b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put8(mpt->m_acc_req_frame_hdl,
2365b504601Sjiang wu - Sun Microsystems - Beijing China &request->ExtPageType, config->page_type);
2375b504601Sjiang wu - Sun Microsystems - Beijing China } else {
2385b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put8(mpt->m_acc_req_frame_hdl,
2395b504601Sjiang wu - Sun Microsystems - Beijing China &request->Header.PageType, config->page_type);
2405b504601Sjiang wu - Sun Microsystems - Beijing China }
2415b504601Sjiang wu - Sun Microsystems - Beijing China } else {
2425b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put8(mpt->m_acc_req_frame_hdl, &request->ExtPageType,
2435b504601Sjiang wu - Sun Microsystems - Beijing China config->ext_page_type);
2445b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put16(mpt->m_acc_req_frame_hdl, &request->ExtPageLength,
2455b504601Sjiang wu - Sun Microsystems - Beijing China config->ext_page_length);
2465b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put8(mpt->m_acc_req_frame_hdl, &request->Header.PageType,
2475b504601Sjiang wu - Sun Microsystems - Beijing China config->page_type);
2485b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put8(mpt->m_acc_req_frame_hdl, &request->Header.PageLength,
2495b504601Sjiang wu - Sun Microsystems - Beijing China config->page_length);
2505b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put8(mpt->m_acc_req_frame_hdl,
2515b504601Sjiang wu - Sun Microsystems - Beijing China &request->Header.PageVersion, config->page_version);
2525b504601Sjiang wu - Sun Microsystems - Beijing China if ((config->page_type & MPI2_CONFIG_PAGETYPE_MASK) ==
2535b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_CONFIG_PAGETYPE_EXTENDED) {
2545b504601Sjiang wu - Sun Microsystems - Beijing China length = config->ext_page_length * 4;
2555b504601Sjiang wu - Sun Microsystems - Beijing China } else {
2565b504601Sjiang wu - Sun Microsystems - Beijing China length = config->page_length * 4;
2575b504601Sjiang wu - Sun Microsystems - Beijing China }
2585b504601Sjiang wu - Sun Microsystems - Beijing China
2595b504601Sjiang wu - Sun Microsystems - Beijing China if (config->action == MPI2_CONFIG_ACTION_PAGE_WRITE_NVRAM) {
2605b504601Sjiang wu - Sun Microsystems - Beijing China direction = MPI2_SGE_FLAGS_HOST_TO_IOC;
2615b504601Sjiang wu - Sun Microsystems - Beijing China }
2625b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put32(mpt->m_acc_req_frame_hdl, &sge->Address.Low,
2635b504601Sjiang wu - Sun Microsystems - Beijing China (uint32_t)cmd->cmd_dma_addr);
2645b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put32(mpt->m_acc_req_frame_hdl, &sge->Address.High,
2655b504601Sjiang wu - Sun Microsystems - Beijing China (uint32_t)(cmd->cmd_dma_addr >> 32));
2665b504601Sjiang wu - Sun Microsystems - Beijing China }
2675b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put8(mpt->m_acc_req_frame_hdl, &request->Header.PageNumber,
2685b504601Sjiang wu - Sun Microsystems - Beijing China config->page_number);
2695b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put32(mpt->m_acc_req_frame_hdl, &request->PageAddress,
2705b504601Sjiang wu - Sun Microsystems - Beijing China config->page_address);
2715b504601Sjiang wu - Sun Microsystems - Beijing China flagslength = ((uint32_t)(MPI2_SGE_FLAGS_LAST_ELEMENT |
2725b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_SGE_FLAGS_END_OF_BUFFER |
2735b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_SGE_FLAGS_SIMPLE_ELEMENT |
2745b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_SGE_FLAGS_SYSTEM_ADDRESS |
2755b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_SGE_FLAGS_64_BIT_ADDRESSING |
2765b504601Sjiang wu - Sun Microsystems - Beijing China direction |
2775b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_SGE_FLAGS_END_OF_LIST) << MPI2_SGE_FLAGS_SHIFT);
2785b504601Sjiang wu - Sun Microsystems - Beijing China flagslength |= length;
2795b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put32(mpt->m_acc_req_frame_hdl, &sge->FlagsLength, flagslength);
2805b504601Sjiang wu - Sun Microsystems - Beijing China
2815b504601Sjiang wu - Sun Microsystems - Beijing China (void) ddi_dma_sync(mpt->m_dma_req_frame_hdl, 0, 0,
2825b504601Sjiang wu - Sun Microsystems - Beijing China DDI_DMA_SYNC_FORDEV);
283940efceeSAndy Giles request_desc = (cmd->cmd_slot << 16) +
2845b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_REQ_DESCRIPT_FLAGS_DEFAULT_TYPE;
285a0ac5a9eSToomas Soome cmd->cmd_rfm = 0;
286940efceeSAndy Giles MPTSAS_START_CMD(mpt, request_desc);
2875b504601Sjiang wu - Sun Microsystems - Beijing China if ((mptsas_check_dma_handle(mpt->m_dma_req_frame_hdl) !=
2885b504601Sjiang wu - Sun Microsystems - Beijing China DDI_SUCCESS) ||
2895b504601Sjiang wu - Sun Microsystems - Beijing China (mptsas_check_acc_handle(mpt->m_acc_req_frame_hdl) !=
2905b504601Sjiang wu - Sun Microsystems - Beijing China DDI_SUCCESS)) {
2915b504601Sjiang wu - Sun Microsystems - Beijing China ddi_fm_service_impact(mpt->m_dip, DDI_SERVICE_UNAFFECTED);
2925b504601Sjiang wu - Sun Microsystems - Beijing China }
2935b504601Sjiang wu - Sun Microsystems - Beijing China }
2945b504601Sjiang wu - Sun Microsystems - Beijing China
2955b504601Sjiang wu - Sun Microsystems - Beijing China int
mptsas_access_config_page(mptsas_t * mpt,uint8_t action,uint8_t page_type,uint8_t page_number,uint32_t page_address,int (* callback)(mptsas_t *,caddr_t,ddi_acc_handle_t,uint16_t,uint32_t,va_list),...)2965b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_access_config_page(mptsas_t *mpt, uint8_t action, uint8_t page_type,
2975b504601Sjiang wu - Sun Microsystems - Beijing China uint8_t page_number, uint32_t page_address, int (*callback) (mptsas_t *,
2985b504601Sjiang wu - Sun Microsystems - Beijing China caddr_t, ddi_acc_handle_t, uint16_t, uint32_t, va_list), ...)
2995b504601Sjiang wu - Sun Microsystems - Beijing China {
3005b504601Sjiang wu - Sun Microsystems - Beijing China va_list ap;
3015b504601Sjiang wu - Sun Microsystems - Beijing China ddi_dma_attr_t attrs;
3025b504601Sjiang wu - Sun Microsystems - Beijing China ddi_dma_cookie_t cookie;
3035b504601Sjiang wu - Sun Microsystems - Beijing China ddi_acc_handle_t accessp;
304a9b51062SAda size_t len = 0;
3055b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_config_request_t config;
3065b504601Sjiang wu - Sun Microsystems - Beijing China int rval = DDI_SUCCESS, config_flags = 0;
3075b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_cmd_t *cmd;
3085b504601Sjiang wu - Sun Microsystems - Beijing China struct scsi_pkt *pkt;
3095b504601Sjiang wu - Sun Microsystems - Beijing China pMpi2ConfigReply_t reply;
3105b504601Sjiang wu - Sun Microsystems - Beijing China uint16_t iocstatus = 0;
3115b504601Sjiang wu - Sun Microsystems - Beijing China uint32_t iocloginfo;
3125b504601Sjiang wu - Sun Microsystems - Beijing China caddr_t page_memp;
313f7d0d869SDan McDonald boolean_t free_dma = B_FALSE;
3145b504601Sjiang wu - Sun Microsystems - Beijing China
3155b504601Sjiang wu - Sun Microsystems - Beijing China va_start(ap, callback);
3165b504601Sjiang wu - Sun Microsystems - Beijing China ASSERT(mutex_owned(&mpt->m_mutex));
3175b504601Sjiang wu - Sun Microsystems - Beijing China
3185b504601Sjiang wu - Sun Microsystems - Beijing China /*
3195b504601Sjiang wu - Sun Microsystems - Beijing China * Get a command from the pool.
3205b504601Sjiang wu - Sun Microsystems - Beijing China */
3215b504601Sjiang wu - Sun Microsystems - Beijing China if ((rval = (mptsas_request_from_pool(mpt, &cmd, &pkt))) == -1) {
3225b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_log(mpt, CE_NOTE, "command pool is full for config "
3235b504601Sjiang wu - Sun Microsystems - Beijing China "page request");
3245b504601Sjiang wu - Sun Microsystems - Beijing China rval = DDI_FAILURE;
3255b504601Sjiang wu - Sun Microsystems - Beijing China goto page_done;
3265b504601Sjiang wu - Sun Microsystems - Beijing China }
3275b504601Sjiang wu - Sun Microsystems - Beijing China config_flags |= MPTSAS_REQUEST_POOL_CMD;
3285b504601Sjiang wu - Sun Microsystems - Beijing China
3295b504601Sjiang wu - Sun Microsystems - Beijing China bzero((caddr_t)cmd, sizeof (*cmd));
3305b504601Sjiang wu - Sun Microsystems - Beijing China bzero((caddr_t)pkt, scsi_pkt_size());
3315b504601Sjiang wu - Sun Microsystems - Beijing China bzero((caddr_t)&config, sizeof (config));
3325b504601Sjiang wu - Sun Microsystems - Beijing China
3335b504601Sjiang wu - Sun Microsystems - Beijing China /*
3345b504601Sjiang wu - Sun Microsystems - Beijing China * Save the data for this request to be used in the call to start the
3355b504601Sjiang wu - Sun Microsystems - Beijing China * config header request.
3365b504601Sjiang wu - Sun Microsystems - Beijing China */
3375b504601Sjiang wu - Sun Microsystems - Beijing China config.action = MPI2_CONFIG_ACTION_PAGE_HEADER;
3385b504601Sjiang wu - Sun Microsystems - Beijing China config.page_type = page_type;
3395b504601Sjiang wu - Sun Microsystems - Beijing China config.page_number = page_number;
3405b504601Sjiang wu - Sun Microsystems - Beijing China config.page_address = page_address;
3415b504601Sjiang wu - Sun Microsystems - Beijing China
3425b504601Sjiang wu - Sun Microsystems - Beijing China /*
3435b504601Sjiang wu - Sun Microsystems - Beijing China * Form a blank cmd/pkt to store the acknowledgement message
3445b504601Sjiang wu - Sun Microsystems - Beijing China */
3455b504601Sjiang wu - Sun Microsystems - Beijing China pkt->pkt_ha_private = (opaque_t)&config;
3465b504601Sjiang wu - Sun Microsystems - Beijing China pkt->pkt_flags = FLAG_HEAD;
3475b504601Sjiang wu - Sun Microsystems - Beijing China pkt->pkt_time = 60;
3485b504601Sjiang wu - Sun Microsystems - Beijing China cmd->cmd_pkt = pkt;
3495b504601Sjiang wu - Sun Microsystems - Beijing China cmd->cmd_flags = CFLAG_CMDIOC | CFLAG_CONFIG;
3505b504601Sjiang wu - Sun Microsystems - Beijing China
3515b504601Sjiang wu - Sun Microsystems - Beijing China /*
3525b504601Sjiang wu - Sun Microsystems - Beijing China * Save the config header request message in a slot.
3535b504601Sjiang wu - Sun Microsystems - Beijing China */
3545b504601Sjiang wu - Sun Microsystems - Beijing China if (mptsas_save_cmd(mpt, cmd) == TRUE) {
3555b504601Sjiang wu - Sun Microsystems - Beijing China cmd->cmd_flags |= CFLAG_PREPARED;
3565b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_start_config_page_access(mpt, cmd);
3575b504601Sjiang wu - Sun Microsystems - Beijing China } else {
3585b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_waitq_add(mpt, cmd);
3595b504601Sjiang wu - Sun Microsystems - Beijing China }
3605b504601Sjiang wu - Sun Microsystems - Beijing China
3615b504601Sjiang wu - Sun Microsystems - Beijing China /*
362c8f74a56SAda * If this is a request for a RAID info page, or any page called during
363c8f74a56SAda * the RAID info page request, poll because these config page requests
364c8f74a56SAda * are nested. Poll to avoid data corruption due to one page's data
365c8f74a56SAda * overwriting the outer page request's data. This can happen when
366c8f74a56SAda * the mutex is released in cv_wait.
3675b504601Sjiang wu - Sun Microsystems - Beijing China */
368c8f74a56SAda if ((page_type == MPI2_CONFIG_EXTPAGETYPE_RAID_CONFIG) ||
369c8f74a56SAda (page_type == MPI2_CONFIG_PAGETYPE_RAID_VOLUME) ||
370c8f74a56SAda (page_type == MPI2_CONFIG_PAGETYPE_RAID_PHYSDISK)) {
371c8f74a56SAda (void) mptsas_poll(mpt, cmd, pkt->pkt_time * 1000);
372c8f74a56SAda } else {
373c8f74a56SAda while ((cmd->cmd_flags & CFLAG_FINISHED) == 0) {
374c8f74a56SAda cv_wait(&mpt->m_config_cv, &mpt->m_mutex);
375c8f74a56SAda }
3765b504601Sjiang wu - Sun Microsystems - Beijing China }
3775b504601Sjiang wu - Sun Microsystems - Beijing China
3785b504601Sjiang wu - Sun Microsystems - Beijing China /*
3795b504601Sjiang wu - Sun Microsystems - Beijing China * Check if the header request completed without timing out
3805b504601Sjiang wu - Sun Microsystems - Beijing China */
3815b504601Sjiang wu - Sun Microsystems - Beijing China if (cmd->cmd_flags & CFLAG_TIMEOUT) {
382882fdc88SHans Rosenfeld config_flags |= MPTSAS_CMD_TIMEOUT;
3835b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN, "config header request timeout");
3845b504601Sjiang wu - Sun Microsystems - Beijing China rval = DDI_FAILURE;
3855b504601Sjiang wu - Sun Microsystems - Beijing China goto page_done;
3865b504601Sjiang wu - Sun Microsystems - Beijing China }
3875b504601Sjiang wu - Sun Microsystems - Beijing China
3885b504601Sjiang wu - Sun Microsystems - Beijing China /*
3895b504601Sjiang wu - Sun Microsystems - Beijing China * cmd_rfm points to the reply message if a reply was given. Check the
3905b504601Sjiang wu - Sun Microsystems - Beijing China * IOCStatus to make sure everything went OK with the header request.
3915b504601Sjiang wu - Sun Microsystems - Beijing China */
3925b504601Sjiang wu - Sun Microsystems - Beijing China if (cmd->cmd_rfm) {
3935b504601Sjiang wu - Sun Microsystems - Beijing China config_flags |= MPTSAS_ADDRESS_REPLY;
3945b504601Sjiang wu - Sun Microsystems - Beijing China (void) ddi_dma_sync(mpt->m_dma_reply_frame_hdl, 0, 0,
3955b504601Sjiang wu - Sun Microsystems - Beijing China DDI_DMA_SYNC_FORCPU);
3965b504601Sjiang wu - Sun Microsystems - Beijing China reply = (pMpi2ConfigReply_t)(mpt->m_reply_frame + (cmd->cmd_rfm
397940efceeSAndy Giles - (mpt->m_reply_frame_dma_addr & 0xffffffffu)));
3985b504601Sjiang wu - Sun Microsystems - Beijing China config.page_type = ddi_get8(mpt->m_acc_reply_frame_hdl,
3995b504601Sjiang wu - Sun Microsystems - Beijing China &reply->Header.PageType);
4005b504601Sjiang wu - Sun Microsystems - Beijing China config.page_number = ddi_get8(mpt->m_acc_reply_frame_hdl,
4015b504601Sjiang wu - Sun Microsystems - Beijing China &reply->Header.PageNumber);
4025b504601Sjiang wu - Sun Microsystems - Beijing China config.page_length = ddi_get8(mpt->m_acc_reply_frame_hdl,
4035b504601Sjiang wu - Sun Microsystems - Beijing China &reply->Header.PageLength);
4045b504601Sjiang wu - Sun Microsystems - Beijing China config.page_version = ddi_get8(mpt->m_acc_reply_frame_hdl,
4055b504601Sjiang wu - Sun Microsystems - Beijing China &reply->Header.PageVersion);
4065b504601Sjiang wu - Sun Microsystems - Beijing China config.ext_page_type = ddi_get8(mpt->m_acc_reply_frame_hdl,
4075b504601Sjiang wu - Sun Microsystems - Beijing China &reply->ExtPageType);
4085b504601Sjiang wu - Sun Microsystems - Beijing China config.ext_page_length = ddi_get16(mpt->m_acc_reply_frame_hdl,
4095b504601Sjiang wu - Sun Microsystems - Beijing China &reply->ExtPageLength);
4105b504601Sjiang wu - Sun Microsystems - Beijing China
4115b504601Sjiang wu - Sun Microsystems - Beijing China iocstatus = ddi_get16(mpt->m_acc_reply_frame_hdl,
4125b504601Sjiang wu - Sun Microsystems - Beijing China &reply->IOCStatus);
4135b504601Sjiang wu - Sun Microsystems - Beijing China iocloginfo = ddi_get32(mpt->m_acc_reply_frame_hdl,
4145b504601Sjiang wu - Sun Microsystems - Beijing China &reply->IOCLogInfo);
4155b504601Sjiang wu - Sun Microsystems - Beijing China
4165b504601Sjiang wu - Sun Microsystems - Beijing China if (iocstatus) {
4175b504601Sjiang wu - Sun Microsystems - Beijing China NDBG13(("mptsas_access_config_page header: "
4185b504601Sjiang wu - Sun Microsystems - Beijing China "IOCStatus=0x%x, IOCLogInfo=0x%x", iocstatus,
4195b504601Sjiang wu - Sun Microsystems - Beijing China iocloginfo));
4205b504601Sjiang wu - Sun Microsystems - Beijing China rval = DDI_FAILURE;
4215b504601Sjiang wu - Sun Microsystems - Beijing China goto page_done;
4225b504601Sjiang wu - Sun Microsystems - Beijing China }
4235b504601Sjiang wu - Sun Microsystems - Beijing China
4245b504601Sjiang wu - Sun Microsystems - Beijing China if ((config.page_type & MPI2_CONFIG_PAGETYPE_MASK) ==
4255b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_CONFIG_PAGETYPE_EXTENDED)
4265b504601Sjiang wu - Sun Microsystems - Beijing China len = (config.ext_page_length * 4);
4275b504601Sjiang wu - Sun Microsystems - Beijing China else
4285b504601Sjiang wu - Sun Microsystems - Beijing China len = (config.page_length * 4);
4295b504601Sjiang wu - Sun Microsystems - Beijing China
4305b504601Sjiang wu - Sun Microsystems - Beijing China }
4315b504601Sjiang wu - Sun Microsystems - Beijing China
4325b504601Sjiang wu - Sun Microsystems - Beijing China if (pkt->pkt_reason == CMD_RESET) {
4335b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN, "ioc reset abort config header "
4345b504601Sjiang wu - Sun Microsystems - Beijing China "request");
4355b504601Sjiang wu - Sun Microsystems - Beijing China rval = DDI_FAILURE;
4365b504601Sjiang wu - Sun Microsystems - Beijing China goto page_done;
4375b504601Sjiang wu - Sun Microsystems - Beijing China }
4385b504601Sjiang wu - Sun Microsystems - Beijing China
4395b504601Sjiang wu - Sun Microsystems - Beijing China /*
4405b504601Sjiang wu - Sun Microsystems - Beijing China * Put the reply frame back on the free queue, increment the free
4415b504601Sjiang wu - Sun Microsystems - Beijing China * index, and write the new index to the free index register. But only
4425b504601Sjiang wu - Sun Microsystems - Beijing China * if this reply is an ADDRESS reply.
4435b504601Sjiang wu - Sun Microsystems - Beijing China */
4445b504601Sjiang wu - Sun Microsystems - Beijing China if (config_flags & MPTSAS_ADDRESS_REPLY) {
4455b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put32(mpt->m_acc_free_queue_hdl,
44608eb0b82SYong-Feng Du &((uint32_t *)(void *)mpt->m_free_queue)[mpt->m_free_index],
4475b504601Sjiang wu - Sun Microsystems - Beijing China cmd->cmd_rfm);
4485b504601Sjiang wu - Sun Microsystems - Beijing China (void) ddi_dma_sync(mpt->m_dma_free_queue_hdl, 0, 0,
4495b504601Sjiang wu - Sun Microsystems - Beijing China DDI_DMA_SYNC_FORDEV);
45008eb0b82SYong-Feng Du if (++mpt->m_free_index == mpt->m_free_queue_depth) {
45108eb0b82SYong-Feng Du mpt->m_free_index = 0;
4525b504601Sjiang wu - Sun Microsystems - Beijing China }
4535b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put32(mpt->m_datap, &mpt->m_reg->ReplyFreeHostIndex,
45408eb0b82SYong-Feng Du mpt->m_free_index);
4555b504601Sjiang wu - Sun Microsystems - Beijing China config_flags &= (~MPTSAS_ADDRESS_REPLY);
4565b504601Sjiang wu - Sun Microsystems - Beijing China }
4575b504601Sjiang wu - Sun Microsystems - Beijing China
4585b504601Sjiang wu - Sun Microsystems - Beijing China /*
4595b504601Sjiang wu - Sun Microsystems - Beijing China * Allocate DMA buffer here. Store the info regarding this buffer in
4605b504601Sjiang wu - Sun Microsystems - Beijing China * the cmd struct so that it can be used for this specific command and
4615b504601Sjiang wu - Sun Microsystems - Beijing China * de-allocated after the command completes. The size of the reply
4625b504601Sjiang wu - Sun Microsystems - Beijing China * will not be larger than the reply frame size.
4635b504601Sjiang wu - Sun Microsystems - Beijing China */
4645b504601Sjiang wu - Sun Microsystems - Beijing China attrs = mpt->m_msg_dma_attr;
4655b504601Sjiang wu - Sun Microsystems - Beijing China attrs.dma_attr_sgllen = 1;
4665b504601Sjiang wu - Sun Microsystems - Beijing China attrs.dma_attr_granular = (uint32_t)len;
4675b504601Sjiang wu - Sun Microsystems - Beijing China
468a9b51062SAda if (mptsas_dma_addr_create(mpt, attrs,
469a9b51062SAda &cmd->cmd_dmahandle, &accessp, &page_memp,
470a9b51062SAda len, &cookie) == FALSE) {
471f7d0d869SDan McDonald rval = DDI_FAILURE;
472ed7418aeSAndy Giles mptsas_log(mpt, CE_WARN,
473ed7418aeSAndy Giles "mptsas_dma_addr_create(len=0x%x) failed", (int)len);
4745b504601Sjiang wu - Sun Microsystems - Beijing China goto page_done;
4755b504601Sjiang wu - Sun Microsystems - Beijing China }
476f7d0d869SDan McDonald /* NOW we can safely call mptsas_dma_addr_destroy(). */
477f7d0d869SDan McDonald free_dma = B_TRUE;
478f7d0d869SDan McDonald
4795b504601Sjiang wu - Sun Microsystems - Beijing China cmd->cmd_dma_addr = cookie.dmac_laddress;
4805b504601Sjiang wu - Sun Microsystems - Beijing China bzero(page_memp, len);
4815b504601Sjiang wu - Sun Microsystems - Beijing China
4825b504601Sjiang wu - Sun Microsystems - Beijing China /*
4835b504601Sjiang wu - Sun Microsystems - Beijing China * Save the data for this request to be used in the call to start the
4845b504601Sjiang wu - Sun Microsystems - Beijing China * config page read
4855b504601Sjiang wu - Sun Microsystems - Beijing China */
4865b504601Sjiang wu - Sun Microsystems - Beijing China config.action = action;
4875b504601Sjiang wu - Sun Microsystems - Beijing China config.page_address = page_address;
4885b504601Sjiang wu - Sun Microsystems - Beijing China
4895b504601Sjiang wu - Sun Microsystems - Beijing China /*
4905b504601Sjiang wu - Sun Microsystems - Beijing China * Re-use the cmd that was used to get the header. Reset some of the
4915b504601Sjiang wu - Sun Microsystems - Beijing China * values.
4925b504601Sjiang wu - Sun Microsystems - Beijing China */
4935b504601Sjiang wu - Sun Microsystems - Beijing China bzero((caddr_t)pkt, scsi_pkt_size());
4945b504601Sjiang wu - Sun Microsystems - Beijing China pkt->pkt_ha_private = (opaque_t)&config;
4955b504601Sjiang wu - Sun Microsystems - Beijing China pkt->pkt_flags = FLAG_HEAD;
4965b504601Sjiang wu - Sun Microsystems - Beijing China pkt->pkt_time = 60;
4975b504601Sjiang wu - Sun Microsystems - Beijing China cmd->cmd_flags = CFLAG_PREPARED | CFLAG_CMDIOC | CFLAG_CONFIG;
4985b504601Sjiang wu - Sun Microsystems - Beijing China
4995b504601Sjiang wu - Sun Microsystems - Beijing China /*
5005b504601Sjiang wu - Sun Microsystems - Beijing China * Send the config page request. cmd is re-used from header request.
5015b504601Sjiang wu - Sun Microsystems - Beijing China */
5025b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_start_config_page_access(mpt, cmd);
5035b504601Sjiang wu - Sun Microsystems - Beijing China
5045b504601Sjiang wu - Sun Microsystems - Beijing China /*
505c8f74a56SAda * If this is a request for a RAID info page, or any page called during
506c8f74a56SAda * the RAID info page request, poll because these config page requests
507c8f74a56SAda * are nested. Poll to avoid data corruption due to one page's data
508c8f74a56SAda * overwriting the outer page request's data. This can happen when
509c8f74a56SAda * the mutex is released in cv_wait.
5105b504601Sjiang wu - Sun Microsystems - Beijing China */
511c8f74a56SAda if ((page_type == MPI2_CONFIG_EXTPAGETYPE_RAID_CONFIG) ||
512c8f74a56SAda (page_type == MPI2_CONFIG_PAGETYPE_RAID_VOLUME) ||
513c8f74a56SAda (page_type == MPI2_CONFIG_PAGETYPE_RAID_PHYSDISK)) {
514c8f74a56SAda (void) mptsas_poll(mpt, cmd, pkt->pkt_time * 1000);
515c8f74a56SAda } else {
516c8f74a56SAda while ((cmd->cmd_flags & CFLAG_FINISHED) == 0) {
517c8f74a56SAda cv_wait(&mpt->m_config_cv, &mpt->m_mutex);
518c8f74a56SAda }
5195b504601Sjiang wu - Sun Microsystems - Beijing China }
5205b504601Sjiang wu - Sun Microsystems - Beijing China
5215b504601Sjiang wu - Sun Microsystems - Beijing China /*
5225b504601Sjiang wu - Sun Microsystems - Beijing China * Check if the request completed without timing out
5235b504601Sjiang wu - Sun Microsystems - Beijing China */
5245b504601Sjiang wu - Sun Microsystems - Beijing China if (cmd->cmd_flags & CFLAG_TIMEOUT) {
525882fdc88SHans Rosenfeld config_flags |= MPTSAS_CMD_TIMEOUT;
5265b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN, "config page request timeout");
5275b504601Sjiang wu - Sun Microsystems - Beijing China rval = DDI_FAILURE;
5285b504601Sjiang wu - Sun Microsystems - Beijing China goto page_done;
5295b504601Sjiang wu - Sun Microsystems - Beijing China }
5305b504601Sjiang wu - Sun Microsystems - Beijing China
5315b504601Sjiang wu - Sun Microsystems - Beijing China /*
5325b504601Sjiang wu - Sun Microsystems - Beijing China * cmd_rfm points to the reply message if a reply was given. The reply
5335b504601Sjiang wu - Sun Microsystems - Beijing China * frame and the config page are returned from this function in the
5345b504601Sjiang wu - Sun Microsystems - Beijing China * param list.
5355b504601Sjiang wu - Sun Microsystems - Beijing China */
5365b504601Sjiang wu - Sun Microsystems - Beijing China if (cmd->cmd_rfm) {
5375b504601Sjiang wu - Sun Microsystems - Beijing China config_flags |= MPTSAS_ADDRESS_REPLY;
5385b504601Sjiang wu - Sun Microsystems - Beijing China (void) ddi_dma_sync(mpt->m_dma_reply_frame_hdl, 0, 0,
5395b504601Sjiang wu - Sun Microsystems - Beijing China DDI_DMA_SYNC_FORCPU);
5405b504601Sjiang wu - Sun Microsystems - Beijing China (void) ddi_dma_sync(cmd->cmd_dmahandle, 0, 0,
5415b504601Sjiang wu - Sun Microsystems - Beijing China DDI_DMA_SYNC_FORCPU);
5425b504601Sjiang wu - Sun Microsystems - Beijing China reply = (pMpi2ConfigReply_t)(mpt->m_reply_frame + (cmd->cmd_rfm
543940efceeSAndy Giles - (mpt->m_reply_frame_dma_addr & 0xffffffffu)));
5445b504601Sjiang wu - Sun Microsystems - Beijing China iocstatus = ddi_get16(mpt->m_acc_reply_frame_hdl,
5455b504601Sjiang wu - Sun Microsystems - Beijing China &reply->IOCStatus);
5465b504601Sjiang wu - Sun Microsystems - Beijing China iocstatus = MPTSAS_IOCSTATUS(iocstatus);
5475b504601Sjiang wu - Sun Microsystems - Beijing China iocloginfo = ddi_get32(mpt->m_acc_reply_frame_hdl,
5485b504601Sjiang wu - Sun Microsystems - Beijing China &reply->IOCLogInfo);
5495b504601Sjiang wu - Sun Microsystems - Beijing China }
5505b504601Sjiang wu - Sun Microsystems - Beijing China
5515b504601Sjiang wu - Sun Microsystems - Beijing China if (callback(mpt, page_memp, accessp, iocstatus, iocloginfo, ap)) {
5525b504601Sjiang wu - Sun Microsystems - Beijing China rval = DDI_FAILURE;
5535b504601Sjiang wu - Sun Microsystems - Beijing China goto page_done;
5545b504601Sjiang wu - Sun Microsystems - Beijing China }
5555b504601Sjiang wu - Sun Microsystems - Beijing China
5565b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_fma_check(mpt, cmd);
5575b504601Sjiang wu - Sun Microsystems - Beijing China /*
5585b504601Sjiang wu - Sun Microsystems - Beijing China * Check the DMA/ACC handles and then free the DMA buffer.
5595b504601Sjiang wu - Sun Microsystems - Beijing China */
5605b504601Sjiang wu - Sun Microsystems - Beijing China if ((mptsas_check_dma_handle(cmd->cmd_dmahandle) != DDI_SUCCESS) ||
5615b504601Sjiang wu - Sun Microsystems - Beijing China (mptsas_check_acc_handle(accessp) != DDI_SUCCESS)) {
5625b504601Sjiang wu - Sun Microsystems - Beijing China ddi_fm_service_impact(mpt->m_dip, DDI_SERVICE_UNAFFECTED);
5635b504601Sjiang wu - Sun Microsystems - Beijing China rval = DDI_FAILURE;
5645b504601Sjiang wu - Sun Microsystems - Beijing China }
5655b504601Sjiang wu - Sun Microsystems - Beijing China
5665b504601Sjiang wu - Sun Microsystems - Beijing China if (pkt->pkt_reason == CMD_TRAN_ERR) {
5675b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN, "config fma error");
5685b504601Sjiang wu - Sun Microsystems - Beijing China rval = DDI_FAILURE;
5695b504601Sjiang wu - Sun Microsystems - Beijing China goto page_done;
5705b504601Sjiang wu - Sun Microsystems - Beijing China }
5715b504601Sjiang wu - Sun Microsystems - Beijing China if (pkt->pkt_reason == CMD_RESET) {
5725b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN, "ioc reset abort config request");
5735b504601Sjiang wu - Sun Microsystems - Beijing China rval = DDI_FAILURE;
5745b504601Sjiang wu - Sun Microsystems - Beijing China goto page_done;
5755b504601Sjiang wu - Sun Microsystems - Beijing China }
5765b504601Sjiang wu - Sun Microsystems - Beijing China
5775b504601Sjiang wu - Sun Microsystems - Beijing China page_done:
5785b504601Sjiang wu - Sun Microsystems - Beijing China va_end(ap);
5795b504601Sjiang wu - Sun Microsystems - Beijing China /*
5805b504601Sjiang wu - Sun Microsystems - Beijing China * Put the reply frame back on the free queue, increment the free
5815b504601Sjiang wu - Sun Microsystems - Beijing China * index, and write the new index to the free index register. But only
5825b504601Sjiang wu - Sun Microsystems - Beijing China * if this reply is an ADDRESS reply.
5835b504601Sjiang wu - Sun Microsystems - Beijing China */
5845b504601Sjiang wu - Sun Microsystems - Beijing China if (config_flags & MPTSAS_ADDRESS_REPLY) {
5855b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put32(mpt->m_acc_free_queue_hdl,
58608eb0b82SYong-Feng Du &((uint32_t *)(void *)mpt->m_free_queue)[mpt->m_free_index],
5875b504601Sjiang wu - Sun Microsystems - Beijing China cmd->cmd_rfm);
5885b504601Sjiang wu - Sun Microsystems - Beijing China (void) ddi_dma_sync(mpt->m_dma_free_queue_hdl, 0, 0,
5895b504601Sjiang wu - Sun Microsystems - Beijing China DDI_DMA_SYNC_FORDEV);
59008eb0b82SYong-Feng Du if (++mpt->m_free_index == mpt->m_free_queue_depth) {
59108eb0b82SYong-Feng Du mpt->m_free_index = 0;
5925b504601Sjiang wu - Sun Microsystems - Beijing China }
5935b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put32(mpt->m_datap, &mpt->m_reg->ReplyFreeHostIndex,
59408eb0b82SYong-Feng Du mpt->m_free_index);
5955b504601Sjiang wu - Sun Microsystems - Beijing China }
5965b504601Sjiang wu - Sun Microsystems - Beijing China
597f7d0d869SDan McDonald if (free_dma)
598f7d0d869SDan McDonald mptsas_dma_addr_destroy(&cmd->cmd_dmahandle, &accessp);
5995b504601Sjiang wu - Sun Microsystems - Beijing China
6005b504601Sjiang wu - Sun Microsystems - Beijing China if (cmd && (cmd->cmd_flags & CFLAG_PREPARED)) {
6015b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_remove_cmd(mpt, cmd);
6025b504601Sjiang wu - Sun Microsystems - Beijing China config_flags &= (~MPTSAS_REQUEST_POOL_CMD);
6035b504601Sjiang wu - Sun Microsystems - Beijing China }
6045b504601Sjiang wu - Sun Microsystems - Beijing China if (config_flags & MPTSAS_REQUEST_POOL_CMD)
6055b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_return_to_pool(mpt, cmd);
6065b504601Sjiang wu - Sun Microsystems - Beijing China
6075b504601Sjiang wu - Sun Microsystems - Beijing China if (config_flags & MPTSAS_CMD_TIMEOUT) {
608a9b51062SAda mpt->m_softstate &= ~MPTSAS_SS_MSG_UNIT_RESET;
6095b504601Sjiang wu - Sun Microsystems - Beijing China if ((mptsas_restart_ioc(mpt)) == DDI_FAILURE) {
6105b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN, "mptsas_restart_ioc failed");
6115b504601Sjiang wu - Sun Microsystems - Beijing China }
6125b504601Sjiang wu - Sun Microsystems - Beijing China }
6135b504601Sjiang wu - Sun Microsystems - Beijing China
6145b504601Sjiang wu - Sun Microsystems - Beijing China return (rval);
6155b504601Sjiang wu - Sun Microsystems - Beijing China }
6165b504601Sjiang wu - Sun Microsystems - Beijing China
6175b504601Sjiang wu - Sun Microsystems - Beijing China int
mptsas_send_config_request_msg(mptsas_t * mpt,uint8_t action,uint8_t pagetype,uint32_t pageaddress,uint8_t pagenumber,uint8_t pageversion,uint8_t pagelength,uint32_t SGEflagslength,uint64_t SGEaddress)6185b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_send_config_request_msg(mptsas_t *mpt, uint8_t action, uint8_t pagetype,
61915ada8fcSRobert Mustacchi uint32_t pageaddress, uint8_t pagenumber, uint8_t pageversion,
62015ada8fcSRobert Mustacchi uint8_t pagelength, uint32_t SGEflagslength, uint64_t SGEaddress)
6215b504601Sjiang wu - Sun Microsystems - Beijing China {
6225b504601Sjiang wu - Sun Microsystems - Beijing China pMpi2ConfigRequest_t config;
6235b504601Sjiang wu - Sun Microsystems - Beijing China int send_numbytes;
6245b504601Sjiang wu - Sun Microsystems - Beijing China
6255b504601Sjiang wu - Sun Microsystems - Beijing China bzero(mpt->m_hshk_memp, sizeof (MPI2_CONFIG_REQUEST));
6265b504601Sjiang wu - Sun Microsystems - Beijing China config = (pMpi2ConfigRequest_t)mpt->m_hshk_memp;
6275b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put8(mpt->m_hshk_acc_hdl, &config->Function, MPI2_FUNCTION_CONFIG);
6285b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put8(mpt->m_hshk_acc_hdl, &config->Action, action);
6295b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put8(mpt->m_hshk_acc_hdl, &config->Header.PageNumber, pagenumber);
6305b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put8(mpt->m_hshk_acc_hdl, &config->Header.PageType, pagetype);
6315b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put32(mpt->m_hshk_acc_hdl, &config->PageAddress, pageaddress);
6325b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put8(mpt->m_hshk_acc_hdl, &config->Header.PageVersion, pageversion);
6335b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put8(mpt->m_hshk_acc_hdl, &config->Header.PageLength, pagelength);
6345b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put32(mpt->m_hshk_acc_hdl,
6355b504601Sjiang wu - Sun Microsystems - Beijing China &config->PageBufferSGE.MpiSimple.FlagsLength, SGEflagslength);
6365b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put32(mpt->m_hshk_acc_hdl,
637940efceeSAndy Giles &config->PageBufferSGE.MpiSimple.u.Address64.Low, SGEaddress);
638940efceeSAndy Giles ddi_put32(mpt->m_hshk_acc_hdl,
639940efceeSAndy Giles &config->PageBufferSGE.MpiSimple.u.Address64.High,
640940efceeSAndy Giles SGEaddress >> 32);
6415b504601Sjiang wu - Sun Microsystems - Beijing China send_numbytes = sizeof (MPI2_CONFIG_REQUEST);
6425b504601Sjiang wu - Sun Microsystems - Beijing China
6435b504601Sjiang wu - Sun Microsystems - Beijing China /*
6445b504601Sjiang wu - Sun Microsystems - Beijing China * Post message via handshake
6455b504601Sjiang wu - Sun Microsystems - Beijing China */
6465b504601Sjiang wu - Sun Microsystems - Beijing China if (mptsas_send_handshake_msg(mpt, (caddr_t)config, send_numbytes,
6475b504601Sjiang wu - Sun Microsystems - Beijing China mpt->m_hshk_acc_hdl)) {
6485b504601Sjiang wu - Sun Microsystems - Beijing China return (-1);
6495b504601Sjiang wu - Sun Microsystems - Beijing China }
6505b504601Sjiang wu - Sun Microsystems - Beijing China return (0);
6515b504601Sjiang wu - Sun Microsystems - Beijing China }
6525b504601Sjiang wu - Sun Microsystems - Beijing China
6535b504601Sjiang wu - Sun Microsystems - Beijing China int
mptsas_send_extended_config_request_msg(mptsas_t * mpt,uint8_t action,uint8_t extpagetype,uint32_t pageaddress,uint8_t pagenumber,uint8_t pageversion,uint16_t extpagelength,uint32_t SGEflagslength,uint64_t SGEaddress)6545b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_send_extended_config_request_msg(mptsas_t *mpt, uint8_t action,
65515ada8fcSRobert Mustacchi uint8_t extpagetype, uint32_t pageaddress, uint8_t pagenumber,
65615ada8fcSRobert Mustacchi uint8_t pageversion, uint16_t extpagelength,
65715ada8fcSRobert Mustacchi uint32_t SGEflagslength, uint64_t SGEaddress)
6585b504601Sjiang wu - Sun Microsystems - Beijing China {
6595b504601Sjiang wu - Sun Microsystems - Beijing China pMpi2ConfigRequest_t config;
6605b504601Sjiang wu - Sun Microsystems - Beijing China int send_numbytes;
6615b504601Sjiang wu - Sun Microsystems - Beijing China
6625b504601Sjiang wu - Sun Microsystems - Beijing China bzero(mpt->m_hshk_memp, sizeof (MPI2_CONFIG_REQUEST));
6635b504601Sjiang wu - Sun Microsystems - Beijing China config = (pMpi2ConfigRequest_t)mpt->m_hshk_memp;
6645b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put8(mpt->m_hshk_acc_hdl, &config->Function, MPI2_FUNCTION_CONFIG);
6655b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put8(mpt->m_hshk_acc_hdl, &config->Action, action);
6665b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put8(mpt->m_hshk_acc_hdl, &config->Header.PageNumber, pagenumber);
6675b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put8(mpt->m_hshk_acc_hdl, &config->Header.PageType,
6685b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_CONFIG_PAGETYPE_EXTENDED);
6695b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put8(mpt->m_hshk_acc_hdl, &config->ExtPageType, extpagetype);
6705b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put32(mpt->m_hshk_acc_hdl, &config->PageAddress, pageaddress);
6715b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put8(mpt->m_hshk_acc_hdl, &config->Header.PageVersion, pageversion);
6725b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put16(mpt->m_hshk_acc_hdl, &config->ExtPageLength, extpagelength);
6735b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put32(mpt->m_hshk_acc_hdl,
6745b504601Sjiang wu - Sun Microsystems - Beijing China &config->PageBufferSGE.MpiSimple.FlagsLength, SGEflagslength);
6755b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put32(mpt->m_hshk_acc_hdl,
676940efceeSAndy Giles &config->PageBufferSGE.MpiSimple.u.Address64.Low, SGEaddress);
677940efceeSAndy Giles ddi_put32(mpt->m_hshk_acc_hdl,
678940efceeSAndy Giles &config->PageBufferSGE.MpiSimple.u.Address64.High,
679940efceeSAndy Giles SGEaddress >> 32);
6805b504601Sjiang wu - Sun Microsystems - Beijing China send_numbytes = sizeof (MPI2_CONFIG_REQUEST);
6815b504601Sjiang wu - Sun Microsystems - Beijing China
6825b504601Sjiang wu - Sun Microsystems - Beijing China /*
6835b504601Sjiang wu - Sun Microsystems - Beijing China * Post message via handshake
6845b504601Sjiang wu - Sun Microsystems - Beijing China */
6855b504601Sjiang wu - Sun Microsystems - Beijing China if (mptsas_send_handshake_msg(mpt, (caddr_t)config, send_numbytes,
6865b504601Sjiang wu - Sun Microsystems - Beijing China mpt->m_hshk_acc_hdl)) {
6875b504601Sjiang wu - Sun Microsystems - Beijing China return (-1);
6885b504601Sjiang wu - Sun Microsystems - Beijing China }
6895b504601Sjiang wu - Sun Microsystems - Beijing China return (0);
6905b504601Sjiang wu - Sun Microsystems - Beijing China }
6915b504601Sjiang wu - Sun Microsystems - Beijing China
6925b504601Sjiang wu - Sun Microsystems - Beijing China int
mptsas_ioc_wait_for_response(mptsas_t * mpt)6935b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_ioc_wait_for_response(mptsas_t *mpt)
6945b504601Sjiang wu - Sun Microsystems - Beijing China {
6955b504601Sjiang wu - Sun Microsystems - Beijing China int polls = 0;
6965b504601Sjiang wu - Sun Microsystems - Beijing China
6975b504601Sjiang wu - Sun Microsystems - Beijing China while ((ddi_get32(mpt->m_datap,
6985b504601Sjiang wu - Sun Microsystems - Beijing China &mpt->m_reg->HostInterruptStatus) & MPI2_HIS_IOP_DOORBELL_STATUS)) {
6995b504601Sjiang wu - Sun Microsystems - Beijing China drv_usecwait(1000);
7005b504601Sjiang wu - Sun Microsystems - Beijing China if (polls++ > 60000) {
7015b504601Sjiang wu - Sun Microsystems - Beijing China return (-1);
7025b504601Sjiang wu - Sun Microsystems - Beijing China }
7035b504601Sjiang wu - Sun Microsystems - Beijing China }
7045b504601Sjiang wu - Sun Microsystems - Beijing China return (0);
7055b504601Sjiang wu - Sun Microsystems - Beijing China }
7065b504601Sjiang wu - Sun Microsystems - Beijing China
7075b504601Sjiang wu - Sun Microsystems - Beijing China int
mptsas_ioc_wait_for_doorbell(mptsas_t * mpt)7085b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_ioc_wait_for_doorbell(mptsas_t *mpt)
7095b504601Sjiang wu - Sun Microsystems - Beijing China {
7105b504601Sjiang wu - Sun Microsystems - Beijing China int polls = 0;
7115b504601Sjiang wu - Sun Microsystems - Beijing China
7125b504601Sjiang wu - Sun Microsystems - Beijing China while ((ddi_get32(mpt->m_datap,
7135b504601Sjiang wu - Sun Microsystems - Beijing China &mpt->m_reg->HostInterruptStatus) & MPI2_HIM_DIM) == 0) {
7145b504601Sjiang wu - Sun Microsystems - Beijing China drv_usecwait(1000);
7155b504601Sjiang wu - Sun Microsystems - Beijing China if (polls++ > 300000) {
7165b504601Sjiang wu - Sun Microsystems - Beijing China return (-1);
7175b504601Sjiang wu - Sun Microsystems - Beijing China }
7185b504601Sjiang wu - Sun Microsystems - Beijing China }
7195b504601Sjiang wu - Sun Microsystems - Beijing China return (0);
7205b504601Sjiang wu - Sun Microsystems - Beijing China }
7215b504601Sjiang wu - Sun Microsystems - Beijing China
7225b504601Sjiang wu - Sun Microsystems - Beijing China int
mptsas_send_handshake_msg(mptsas_t * mpt,caddr_t memp,int numbytes,ddi_acc_handle_t accessp)7235b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_send_handshake_msg(mptsas_t *mpt, caddr_t memp, int numbytes,
72415ada8fcSRobert Mustacchi ddi_acc_handle_t accessp)
7255b504601Sjiang wu - Sun Microsystems - Beijing China {
7265b504601Sjiang wu - Sun Microsystems - Beijing China int i;
7275b504601Sjiang wu - Sun Microsystems - Beijing China
7285b504601Sjiang wu - Sun Microsystems - Beijing China /*
7295b504601Sjiang wu - Sun Microsystems - Beijing China * clean pending doorbells
7305b504601Sjiang wu - Sun Microsystems - Beijing China */
7315b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put32(mpt->m_datap, &mpt->m_reg->HostInterruptStatus, 0);
7325b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put32(mpt->m_datap, &mpt->m_reg->Doorbell,
7335b504601Sjiang wu - Sun Microsystems - Beijing China ((MPI2_FUNCTION_HANDSHAKE << MPI2_DOORBELL_FUNCTION_SHIFT) |
7345b504601Sjiang wu - Sun Microsystems - Beijing China ((numbytes / 4) << MPI2_DOORBELL_ADD_DWORDS_SHIFT)));
7355b504601Sjiang wu - Sun Microsystems - Beijing China
7365b504601Sjiang wu - Sun Microsystems - Beijing China if (mptsas_ioc_wait_for_doorbell(mpt)) {
7375b504601Sjiang wu - Sun Microsystems - Beijing China NDBG19(("mptsas_send_handshake failed. Doorbell not ready\n"));
7385b504601Sjiang wu - Sun Microsystems - Beijing China return (-1);
7395b504601Sjiang wu - Sun Microsystems - Beijing China }
7405b504601Sjiang wu - Sun Microsystems - Beijing China
7415b504601Sjiang wu - Sun Microsystems - Beijing China /*
7425b504601Sjiang wu - Sun Microsystems - Beijing China * clean pending doorbells again
7435b504601Sjiang wu - Sun Microsystems - Beijing China */
7445b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put32(mpt->m_datap, &mpt->m_reg->HostInterruptStatus, 0);
7455b504601Sjiang wu - Sun Microsystems - Beijing China
7465b504601Sjiang wu - Sun Microsystems - Beijing China if (mptsas_ioc_wait_for_response(mpt)) {
7475b504601Sjiang wu - Sun Microsystems - Beijing China NDBG19(("mptsas_send_handshake failed. Doorbell not "
7485b504601Sjiang wu - Sun Microsystems - Beijing China "cleared\n"));
7495b504601Sjiang wu - Sun Microsystems - Beijing China return (-1);
7505b504601Sjiang wu - Sun Microsystems - Beijing China }
7515b504601Sjiang wu - Sun Microsystems - Beijing China
7525b504601Sjiang wu - Sun Microsystems - Beijing China /*
7535b504601Sjiang wu - Sun Microsystems - Beijing China * post handshake message
7545b504601Sjiang wu - Sun Microsystems - Beijing China */
7555b504601Sjiang wu - Sun Microsystems - Beijing China for (i = 0; (i < numbytes / 4); i++, memp += 4) {
7565b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put32(mpt->m_datap, &mpt->m_reg->Doorbell,
7575b504601Sjiang wu - Sun Microsystems - Beijing China ddi_get32(accessp, (uint32_t *)((void *)(memp))));
7585b504601Sjiang wu - Sun Microsystems - Beijing China if (mptsas_ioc_wait_for_response(mpt)) {
7595b504601Sjiang wu - Sun Microsystems - Beijing China NDBG19(("mptsas_send_handshake failed posting "
7605b504601Sjiang wu - Sun Microsystems - Beijing China "message\n"));
7615b504601Sjiang wu - Sun Microsystems - Beijing China return (-1);
7625b504601Sjiang wu - Sun Microsystems - Beijing China }
7635b504601Sjiang wu - Sun Microsystems - Beijing China }
7645b504601Sjiang wu - Sun Microsystems - Beijing China
7655b504601Sjiang wu - Sun Microsystems - Beijing China if (mptsas_check_acc_handle(mpt->m_datap) != DDI_SUCCESS) {
7665b504601Sjiang wu - Sun Microsystems - Beijing China ddi_fm_service_impact(mpt->m_dip, DDI_SERVICE_UNAFFECTED);
7675b504601Sjiang wu - Sun Microsystems - Beijing China ddi_fm_acc_err_clear(mpt->m_datap, DDI_FME_VER0);
7685b504601Sjiang wu - Sun Microsystems - Beijing China return (-1);
7695b504601Sjiang wu - Sun Microsystems - Beijing China }
7705b504601Sjiang wu - Sun Microsystems - Beijing China
7715b504601Sjiang wu - Sun Microsystems - Beijing China return (0);
7725b504601Sjiang wu - Sun Microsystems - Beijing China }
7735b504601Sjiang wu - Sun Microsystems - Beijing China
7745b504601Sjiang wu - Sun Microsystems - Beijing China int
mptsas_get_handshake_msg(mptsas_t * mpt,caddr_t memp,int numbytes,ddi_acc_handle_t accessp)7755b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_get_handshake_msg(mptsas_t *mpt, caddr_t memp, int numbytes,
77615ada8fcSRobert Mustacchi ddi_acc_handle_t accessp)
7775b504601Sjiang wu - Sun Microsystems - Beijing China {
7785b504601Sjiang wu - Sun Microsystems - Beijing China int i, totalbytes, bytesleft;
7795b504601Sjiang wu - Sun Microsystems - Beijing China uint16_t val;
7805b504601Sjiang wu - Sun Microsystems - Beijing China
7815b504601Sjiang wu - Sun Microsystems - Beijing China /*
7825b504601Sjiang wu - Sun Microsystems - Beijing China * wait for doorbell
7835b504601Sjiang wu - Sun Microsystems - Beijing China */
7845b504601Sjiang wu - Sun Microsystems - Beijing China if (mptsas_ioc_wait_for_doorbell(mpt)) {
7855b504601Sjiang wu - Sun Microsystems - Beijing China NDBG19(("mptsas_get_handshake failed. Doorbell not ready\n"));
7865b504601Sjiang wu - Sun Microsystems - Beijing China return (-1);
7875b504601Sjiang wu - Sun Microsystems - Beijing China }
7885b504601Sjiang wu - Sun Microsystems - Beijing China
7895b504601Sjiang wu - Sun Microsystems - Beijing China /*
7905b504601Sjiang wu - Sun Microsystems - Beijing China * get first 2 bytes of handshake message to determine how much
7915b504601Sjiang wu - Sun Microsystems - Beijing China * data we will be getting
7925b504601Sjiang wu - Sun Microsystems - Beijing China */
7935b504601Sjiang wu - Sun Microsystems - Beijing China for (i = 0; i < 2; i++, memp += 2) {
7945b504601Sjiang wu - Sun Microsystems - Beijing China val = (ddi_get32(mpt->m_datap,
7955b504601Sjiang wu - Sun Microsystems - Beijing China &mpt->m_reg->Doorbell) & MPI2_DOORBELL_DATA_MASK);
7965b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put32(mpt->m_datap, &mpt->m_reg->HostInterruptStatus, 0);
7975b504601Sjiang wu - Sun Microsystems - Beijing China if (mptsas_ioc_wait_for_doorbell(mpt)) {
7985b504601Sjiang wu - Sun Microsystems - Beijing China NDBG19(("mptsas_get_handshake failure getting initial"
7995b504601Sjiang wu - Sun Microsystems - Beijing China " data\n"));
8005b504601Sjiang wu - Sun Microsystems - Beijing China return (-1);
8015b504601Sjiang wu - Sun Microsystems - Beijing China }
8025b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put16(accessp, (uint16_t *)((void *)(memp)), val);
8035b504601Sjiang wu - Sun Microsystems - Beijing China if (i == 1) {
8045b504601Sjiang wu - Sun Microsystems - Beijing China totalbytes = (val & 0xFF) * 2;
8055b504601Sjiang wu - Sun Microsystems - Beijing China }
8065b504601Sjiang wu - Sun Microsystems - Beijing China }
8075b504601Sjiang wu - Sun Microsystems - Beijing China
8085b504601Sjiang wu - Sun Microsystems - Beijing China /*
8095b504601Sjiang wu - Sun Microsystems - Beijing China * If we are expecting less bytes than the message wants to send
8105b504601Sjiang wu - Sun Microsystems - Beijing China * we simply save as much as we expected and then throw out the rest
8115b504601Sjiang wu - Sun Microsystems - Beijing China * later
8125b504601Sjiang wu - Sun Microsystems - Beijing China */
8135b504601Sjiang wu - Sun Microsystems - Beijing China if (totalbytes > (numbytes / 2)) {
8145b504601Sjiang wu - Sun Microsystems - Beijing China bytesleft = ((numbytes / 2) - 2);
8155b504601Sjiang wu - Sun Microsystems - Beijing China } else {
8165b504601Sjiang wu - Sun Microsystems - Beijing China bytesleft = (totalbytes - 2);
8175b504601Sjiang wu - Sun Microsystems - Beijing China }
8185b504601Sjiang wu - Sun Microsystems - Beijing China
8195b504601Sjiang wu - Sun Microsystems - Beijing China /*
8205b504601Sjiang wu - Sun Microsystems - Beijing China * Get the rest of the data
8215b504601Sjiang wu - Sun Microsystems - Beijing China */
8225b504601Sjiang wu - Sun Microsystems - Beijing China for (i = 0; i < bytesleft; i++, memp += 2) {
8235b504601Sjiang wu - Sun Microsystems - Beijing China val = (ddi_get32(mpt->m_datap,
8245b504601Sjiang wu - Sun Microsystems - Beijing China &mpt->m_reg->Doorbell) & MPI2_DOORBELL_DATA_MASK);
8255b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put32(mpt->m_datap, &mpt->m_reg->HostInterruptStatus, 0);
8265b504601Sjiang wu - Sun Microsystems - Beijing China if (mptsas_ioc_wait_for_doorbell(mpt)) {
8275b504601Sjiang wu - Sun Microsystems - Beijing China NDBG19(("mptsas_get_handshake failure getting"
8285b504601Sjiang wu - Sun Microsystems - Beijing China " main data\n"));
8295b504601Sjiang wu - Sun Microsystems - Beijing China return (-1);
8305b504601Sjiang wu - Sun Microsystems - Beijing China }
8315b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put16(accessp, (uint16_t *)((void *)(memp)), val);
8325b504601Sjiang wu - Sun Microsystems - Beijing China }
8335b504601Sjiang wu - Sun Microsystems - Beijing China
8345b504601Sjiang wu - Sun Microsystems - Beijing China /*
8355b504601Sjiang wu - Sun Microsystems - Beijing China * Sometimes the device will send more data than is expected
8365b504601Sjiang wu - Sun Microsystems - Beijing China * This data is not used by us but needs to be cleared from
8375b504601Sjiang wu - Sun Microsystems - Beijing China * ioc doorbell. So we just read the values and throw
8385b504601Sjiang wu - Sun Microsystems - Beijing China * them out.
8395b504601Sjiang wu - Sun Microsystems - Beijing China */
8405b504601Sjiang wu - Sun Microsystems - Beijing China if (totalbytes > (numbytes / 2)) {
8415b504601Sjiang wu - Sun Microsystems - Beijing China for (i = (numbytes / 2); i < totalbytes; i++) {
8425b504601Sjiang wu - Sun Microsystems - Beijing China val = (ddi_get32(mpt->m_datap,
8435b504601Sjiang wu - Sun Microsystems - Beijing China &mpt->m_reg->Doorbell) &
8445b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_DOORBELL_DATA_MASK);
8455b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put32(mpt->m_datap,
8465b504601Sjiang wu - Sun Microsystems - Beijing China &mpt->m_reg->HostInterruptStatus, 0);
8475b504601Sjiang wu - Sun Microsystems - Beijing China if (mptsas_ioc_wait_for_doorbell(mpt)) {
8485b504601Sjiang wu - Sun Microsystems - Beijing China NDBG19(("mptsas_get_handshake failure getting "
8495b504601Sjiang wu - Sun Microsystems - Beijing China "extra garbage data\n"));
8505b504601Sjiang wu - Sun Microsystems - Beijing China return (-1);
8515b504601Sjiang wu - Sun Microsystems - Beijing China }
8525b504601Sjiang wu - Sun Microsystems - Beijing China }
8535b504601Sjiang wu - Sun Microsystems - Beijing China }
8545b504601Sjiang wu - Sun Microsystems - Beijing China
8555b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put32(mpt->m_datap, &mpt->m_reg->HostInterruptStatus, 0);
8565b504601Sjiang wu - Sun Microsystems - Beijing China
8575b504601Sjiang wu - Sun Microsystems - Beijing China if (mptsas_check_acc_handle(mpt->m_datap) != DDI_SUCCESS) {
8585b504601Sjiang wu - Sun Microsystems - Beijing China ddi_fm_service_impact(mpt->m_dip, DDI_SERVICE_UNAFFECTED);
8595b504601Sjiang wu - Sun Microsystems - Beijing China ddi_fm_acc_err_clear(mpt->m_datap, DDI_FME_VER0);
8605b504601Sjiang wu - Sun Microsystems - Beijing China return (-1);
8615b504601Sjiang wu - Sun Microsystems - Beijing China }
8625b504601Sjiang wu - Sun Microsystems - Beijing China
8635b504601Sjiang wu - Sun Microsystems - Beijing China return (0);
8645b504601Sjiang wu - Sun Microsystems - Beijing China }
8655b504601Sjiang wu - Sun Microsystems - Beijing China
8665b504601Sjiang wu - Sun Microsystems - Beijing China int
mptsas_kick_start(mptsas_t * mpt)8675b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_kick_start(mptsas_t *mpt)
8685b504601Sjiang wu - Sun Microsystems - Beijing China {
8695b504601Sjiang wu - Sun Microsystems - Beijing China int polls = 0;
8705b504601Sjiang wu - Sun Microsystems - Beijing China uint32_t diag_reg, ioc_state, saved_HCB_size;
8715b504601Sjiang wu - Sun Microsystems - Beijing China
8725b504601Sjiang wu - Sun Microsystems - Beijing China /*
8732856b5e3SAda * Start a hard reset. Write magic number and wait 500 mSeconds.
8745b504601Sjiang wu - Sun Microsystems - Beijing China */
8755b504601Sjiang wu - Sun Microsystems - Beijing China MPTSAS_ENABLE_DRWE(mpt);
8762856b5e3SAda drv_usecwait(500000);
8775b504601Sjiang wu - Sun Microsystems - Beijing China
8785b504601Sjiang wu - Sun Microsystems - Beijing China /*
8795b504601Sjiang wu - Sun Microsystems - Beijing China * Read the current Diag Reg and save the Host Controlled Boot size.
8805b504601Sjiang wu - Sun Microsystems - Beijing China */
8815b504601Sjiang wu - Sun Microsystems - Beijing China diag_reg = ddi_get32(mpt->m_datap, &mpt->m_reg->HostDiagnostic);
8825b504601Sjiang wu - Sun Microsystems - Beijing China saved_HCB_size = ddi_get32(mpt->m_datap, &mpt->m_reg->HCBSize);
8835b504601Sjiang wu - Sun Microsystems - Beijing China
8845b504601Sjiang wu - Sun Microsystems - Beijing China /*
88576a4caf6SAda * Set Reset Adapter bit and wait 50 mSeconds.
8865b504601Sjiang wu - Sun Microsystems - Beijing China */
8875b504601Sjiang wu - Sun Microsystems - Beijing China diag_reg |= MPI2_DIAG_RESET_ADAPTER;
8885b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put32(mpt->m_datap, &mpt->m_reg->HostDiagnostic, diag_reg);
88976a4caf6SAda drv_usecwait(50000);
8905b504601Sjiang wu - Sun Microsystems - Beijing China
8915b504601Sjiang wu - Sun Microsystems - Beijing China /*
8925b504601Sjiang wu - Sun Microsystems - Beijing China * Poll, waiting for Reset Adapter bit to clear. 300 Seconds max
8935b504601Sjiang wu - Sun Microsystems - Beijing China * (600000 * 500 = 300,000,000 uSeconds, 300 seconds).
8945b504601Sjiang wu - Sun Microsystems - Beijing China * If no more adapter (all FF's), just return failure.
8955b504601Sjiang wu - Sun Microsystems - Beijing China */
8965b504601Sjiang wu - Sun Microsystems - Beijing China for (polls = 0; polls < 600000; polls++) {
8975b504601Sjiang wu - Sun Microsystems - Beijing China diag_reg = ddi_get32(mpt->m_datap,
8985b504601Sjiang wu - Sun Microsystems - Beijing China &mpt->m_reg->HostDiagnostic);
8995b504601Sjiang wu - Sun Microsystems - Beijing China if (diag_reg == 0xFFFFFFFF) {
9005b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_fm_ereport(mpt, DDI_FM_DEVICE_NO_RESPONSE);
9015b504601Sjiang wu - Sun Microsystems - Beijing China ddi_fm_service_impact(mpt->m_dip, DDI_SERVICE_LOST);
9025b504601Sjiang wu - Sun Microsystems - Beijing China return (DDI_FAILURE);
9035b504601Sjiang wu - Sun Microsystems - Beijing China }
9045b504601Sjiang wu - Sun Microsystems - Beijing China if (!(diag_reg & MPI2_DIAG_RESET_ADAPTER)) {
9055b504601Sjiang wu - Sun Microsystems - Beijing China break;
9065b504601Sjiang wu - Sun Microsystems - Beijing China }
9075b504601Sjiang wu - Sun Microsystems - Beijing China drv_usecwait(500);
9085b504601Sjiang wu - Sun Microsystems - Beijing China }
9095b504601Sjiang wu - Sun Microsystems - Beijing China if (polls == 600000) {
9105b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_fm_ereport(mpt, DDI_FM_DEVICE_NO_RESPONSE);
9115b504601Sjiang wu - Sun Microsystems - Beijing China ddi_fm_service_impact(mpt->m_dip, DDI_SERVICE_LOST);
9125b504601Sjiang wu - Sun Microsystems - Beijing China return (DDI_FAILURE);
9135b504601Sjiang wu - Sun Microsystems - Beijing China }
9145b504601Sjiang wu - Sun Microsystems - Beijing China
9155b504601Sjiang wu - Sun Microsystems - Beijing China /*
9165b504601Sjiang wu - Sun Microsystems - Beijing China * Check if adapter is in Host Boot Mode. If so, restart adapter
9175b504601Sjiang wu - Sun Microsystems - Beijing China * assuming the HCB points to good FW.
9185b504601Sjiang wu - Sun Microsystems - Beijing China * Set BootDeviceSel to HCDW (Host Code and Data Window).
9195b504601Sjiang wu - Sun Microsystems - Beijing China */
9205b504601Sjiang wu - Sun Microsystems - Beijing China if (diag_reg & MPI2_DIAG_HCB_MODE) {
9215b504601Sjiang wu - Sun Microsystems - Beijing China diag_reg &= ~MPI2_DIAG_BOOT_DEVICE_SELECT_MASK;
9225b504601Sjiang wu - Sun Microsystems - Beijing China diag_reg |= MPI2_DIAG_BOOT_DEVICE_SELECT_HCDW;
9235b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put32(mpt->m_datap, &mpt->m_reg->HostDiagnostic, diag_reg);
9245b504601Sjiang wu - Sun Microsystems - Beijing China
9255b504601Sjiang wu - Sun Microsystems - Beijing China /*
9265b504601Sjiang wu - Sun Microsystems - Beijing China * Re-enable the HCDW.
9275b504601Sjiang wu - Sun Microsystems - Beijing China */
9285b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put32(mpt->m_datap, &mpt->m_reg->HCBSize,
9295b504601Sjiang wu - Sun Microsystems - Beijing China (saved_HCB_size | MPI2_HCB_SIZE_HCB_ENABLE));
9305b504601Sjiang wu - Sun Microsystems - Beijing China }
9315b504601Sjiang wu - Sun Microsystems - Beijing China
9325b504601Sjiang wu - Sun Microsystems - Beijing China /*
9335b504601Sjiang wu - Sun Microsystems - Beijing China * Restart the adapter.
9345b504601Sjiang wu - Sun Microsystems - Beijing China */
9355b504601Sjiang wu - Sun Microsystems - Beijing China diag_reg &= ~MPI2_DIAG_HOLD_IOC_RESET;
9365b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put32(mpt->m_datap, &mpt->m_reg->HostDiagnostic, diag_reg);
9375b504601Sjiang wu - Sun Microsystems - Beijing China
9385b504601Sjiang wu - Sun Microsystems - Beijing China /*
9395b504601Sjiang wu - Sun Microsystems - Beijing China * Disable writes to the Host Diag register.
9405b504601Sjiang wu - Sun Microsystems - Beijing China */
9415b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put32(mpt->m_datap, &mpt->m_reg->WriteSequence,
9425b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_WRSEQ_FLUSH_KEY_VALUE);
9435b504601Sjiang wu - Sun Microsystems - Beijing China
9445b504601Sjiang wu - Sun Microsystems - Beijing China /*
94576a4caf6SAda * Wait 60 seconds max for FW to come to ready state.
9465b504601Sjiang wu - Sun Microsystems - Beijing China */
94776a4caf6SAda for (polls = 0; polls < 60000; polls++) {
9485b504601Sjiang wu - Sun Microsystems - Beijing China ioc_state = ddi_get32(mpt->m_datap, &mpt->m_reg->Doorbell);
9495b504601Sjiang wu - Sun Microsystems - Beijing China if (ioc_state == 0xFFFFFFFF) {
9505b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_fm_ereport(mpt, DDI_FM_DEVICE_NO_RESPONSE);
9515b504601Sjiang wu - Sun Microsystems - Beijing China ddi_fm_service_impact(mpt->m_dip, DDI_SERVICE_LOST);
9525b504601Sjiang wu - Sun Microsystems - Beijing China return (DDI_FAILURE);
9535b504601Sjiang wu - Sun Microsystems - Beijing China }
9545b504601Sjiang wu - Sun Microsystems - Beijing China if ((ioc_state & MPI2_IOC_STATE_MASK) ==
9555b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_IOC_STATE_READY) {
9565b504601Sjiang wu - Sun Microsystems - Beijing China break;
9575b504601Sjiang wu - Sun Microsystems - Beijing China }
9585b504601Sjiang wu - Sun Microsystems - Beijing China drv_usecwait(1000);
9595b504601Sjiang wu - Sun Microsystems - Beijing China }
96076a4caf6SAda if (polls == 60000) {
9615b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_fm_ereport(mpt, DDI_FM_DEVICE_NO_RESPONSE);
9625b504601Sjiang wu - Sun Microsystems - Beijing China ddi_fm_service_impact(mpt->m_dip, DDI_SERVICE_LOST);
9635b504601Sjiang wu - Sun Microsystems - Beijing China return (DDI_FAILURE);
9645b504601Sjiang wu - Sun Microsystems - Beijing China }
9655b504601Sjiang wu - Sun Microsystems - Beijing China
9665b504601Sjiang wu - Sun Microsystems - Beijing China /*
9675b504601Sjiang wu - Sun Microsystems - Beijing China * Clear the ioc ack events queue.
9685b504601Sjiang wu - Sun Microsystems - Beijing China */
9695b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_destroy_ioc_event_cmd(mpt);
9705b504601Sjiang wu - Sun Microsystems - Beijing China
9715b504601Sjiang wu - Sun Microsystems - Beijing China return (DDI_SUCCESS);
9725b504601Sjiang wu - Sun Microsystems - Beijing China }
9735b504601Sjiang wu - Sun Microsystems - Beijing China
9745b504601Sjiang wu - Sun Microsystems - Beijing China int
mptsas_ioc_reset(mptsas_t * mpt,int first_time)975e18306b1SDan McDonald mptsas_ioc_reset(mptsas_t *mpt, int first_time)
9765b504601Sjiang wu - Sun Microsystems - Beijing China {
9775b504601Sjiang wu - Sun Microsystems - Beijing China int polls = 0;
9785b504601Sjiang wu - Sun Microsystems - Beijing China uint32_t reset_msg;
9795b504601Sjiang wu - Sun Microsystems - Beijing China uint32_t ioc_state;
980a9b51062SAda
9815b504601Sjiang wu - Sun Microsystems - Beijing China ioc_state = ddi_get32(mpt->m_datap, &mpt->m_reg->Doorbell);
9825b504601Sjiang wu - Sun Microsystems - Beijing China /*
9835b504601Sjiang wu - Sun Microsystems - Beijing China * If chip is already in ready state then there is nothing to do.
9845b504601Sjiang wu - Sun Microsystems - Beijing China */
9855b504601Sjiang wu - Sun Microsystems - Beijing China if (ioc_state == MPI2_IOC_STATE_READY) {
9865b504601Sjiang wu - Sun Microsystems - Beijing China return (MPTSAS_NO_RESET);
9875b504601Sjiang wu - Sun Microsystems - Beijing China }
9885b504601Sjiang wu - Sun Microsystems - Beijing China /*
9895b504601Sjiang wu - Sun Microsystems - Beijing China * If the chip is already operational, we just need to send
9905b504601Sjiang wu - Sun Microsystems - Beijing China * it a message unit reset to put it back in the ready state
9915b504601Sjiang wu - Sun Microsystems - Beijing China */
9925b504601Sjiang wu - Sun Microsystems - Beijing China if (ioc_state & MPI2_IOC_STATE_OPERATIONAL) {
993e18306b1SDan McDonald /*
994e18306b1SDan McDonald * If the first time, try MUR anyway, because we haven't even
995e18306b1SDan McDonald * queried the card for m_event_replay and other capabilities.
996e18306b1SDan McDonald * Other platforms do it this way, we can still do a hard
997e18306b1SDan McDonald * reset if we need to, MUR takes less time than a full
998e18306b1SDan McDonald * adapter reset, and there are reports that some HW
999e18306b1SDan McDonald * combinations will lock up when receiving a hard reset.
1000e18306b1SDan McDonald */
1001e18306b1SDan McDonald if ((first_time || mpt->m_event_replay) &&
1002e18306b1SDan McDonald (mpt->m_softstate & MPTSAS_SS_MSG_UNIT_RESET)) {
1003a9b51062SAda mpt->m_softstate &= ~MPTSAS_SS_MSG_UNIT_RESET;
1004a9b51062SAda reset_msg = MPI2_FUNCTION_IOC_MESSAGE_UNIT_RESET;
1005a9b51062SAda ddi_put32(mpt->m_datap, &mpt->m_reg->Doorbell,
1006a9b51062SAda (reset_msg << MPI2_DOORBELL_FUNCTION_SHIFT));
1007a9b51062SAda if (mptsas_ioc_wait_for_response(mpt)) {
1008a9b51062SAda NDBG19(("mptsas_ioc_reset failure sending "
1009a9b51062SAda "message_unit_reset\n"));
10105b504601Sjiang wu - Sun Microsystems - Beijing China goto hard_reset;
10115b504601Sjiang wu - Sun Microsystems - Beijing China }
1012a9b51062SAda
1013a9b51062SAda /*
1014a9b51062SAda * Wait no more than 60 seconds for chip to become
1015a9b51062SAda * ready.
1016a9b51062SAda */
1017a9b51062SAda while ((ddi_get32(mpt->m_datap, &mpt->m_reg->Doorbell) &
1018a9b51062SAda MPI2_IOC_STATE_READY) == 0x0) {
1019a9b51062SAda drv_usecwait(1000);
1020a9b51062SAda if (polls++ > 60000) {
1021a9b51062SAda goto hard_reset;
1022a9b51062SAda }
1023a9b51062SAda }
1024a9b51062SAda
1025a9b51062SAda /*
1026a9b51062SAda * Save the last reset mode done on IOC which will be
1027a9b51062SAda * helpful while resuming from suspension.
1028a9b51062SAda */
1029a9b51062SAda mpt->m_softstate |= MPTSAS_DID_MSG_UNIT_RESET;
1030a9b51062SAda
1031a9b51062SAda /*
1032a9b51062SAda * the message unit reset would do reset operations
1033a9b51062SAda * clear reply and request queue, so we should clear
1034a9b51062SAda * ACK event cmd.
1035a9b51062SAda */
1036a9b51062SAda mptsas_destroy_ioc_event_cmd(mpt);
1037a9b51062SAda return (MPTSAS_SUCCESS_MUR);
10385b504601Sjiang wu - Sun Microsystems - Beijing China }
10395b504601Sjiang wu - Sun Microsystems - Beijing China }
10405b504601Sjiang wu - Sun Microsystems - Beijing China hard_reset:
1041a9b51062SAda mpt->m_softstate &= ~MPTSAS_DID_MSG_UNIT_RESET;
10425b504601Sjiang wu - Sun Microsystems - Beijing China if (mptsas_kick_start(mpt) == DDI_FAILURE) {
10435b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_fm_ereport(mpt, DDI_FM_DEVICE_NO_RESPONSE);
10445b504601Sjiang wu - Sun Microsystems - Beijing China ddi_fm_service_impact(mpt->m_dip, DDI_SERVICE_LOST);
10455b504601Sjiang wu - Sun Microsystems - Beijing China return (MPTSAS_RESET_FAIL);
10465b504601Sjiang wu - Sun Microsystems - Beijing China }
10475b504601Sjiang wu - Sun Microsystems - Beijing China return (MPTSAS_SUCCESS_HARDRESET);
10485b504601Sjiang wu - Sun Microsystems - Beijing China }
10495b504601Sjiang wu - Sun Microsystems - Beijing China
10505b504601Sjiang wu - Sun Microsystems - Beijing China
10515b504601Sjiang wu - Sun Microsystems - Beijing China int
mptsas_request_from_pool(mptsas_t * mpt,mptsas_cmd_t ** cmd,struct scsi_pkt ** pkt)10525b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_request_from_pool(mptsas_t *mpt, mptsas_cmd_t **cmd,
10535b504601Sjiang wu - Sun Microsystems - Beijing China struct scsi_pkt **pkt)
10545b504601Sjiang wu - Sun Microsystems - Beijing China {
10555b504601Sjiang wu - Sun Microsystems - Beijing China m_event_struct_t *ioc_cmd = NULL;
10565b504601Sjiang wu - Sun Microsystems - Beijing China
10575b504601Sjiang wu - Sun Microsystems - Beijing China ioc_cmd = kmem_zalloc(M_EVENT_STRUCT_SIZE, KM_SLEEP);
10585b504601Sjiang wu - Sun Microsystems - Beijing China if (ioc_cmd == NULL) {
10595b504601Sjiang wu - Sun Microsystems - Beijing China return (DDI_FAILURE);
10605b504601Sjiang wu - Sun Microsystems - Beijing China }
10615b504601Sjiang wu - Sun Microsystems - Beijing China ioc_cmd->m_event_linkp = NULL;
10625b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_ioc_event_cmdq_add(mpt, ioc_cmd);
10635b504601Sjiang wu - Sun Microsystems - Beijing China *cmd = &(ioc_cmd->m_event_cmd);
10645b504601Sjiang wu - Sun Microsystems - Beijing China *pkt = &(ioc_cmd->m_event_pkt);
10655b504601Sjiang wu - Sun Microsystems - Beijing China
10665b504601Sjiang wu - Sun Microsystems - Beijing China return (DDI_SUCCESS);
10675b504601Sjiang wu - Sun Microsystems - Beijing China }
10685b504601Sjiang wu - Sun Microsystems - Beijing China
10695b504601Sjiang wu - Sun Microsystems - Beijing China void
mptsas_return_to_pool(mptsas_t * mpt,mptsas_cmd_t * cmd)10705b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_return_to_pool(mptsas_t *mpt, mptsas_cmd_t *cmd)
10715b504601Sjiang wu - Sun Microsystems - Beijing China {
10725b504601Sjiang wu - Sun Microsystems - Beijing China m_event_struct_t *ioc_cmd = NULL;
10735b504601Sjiang wu - Sun Microsystems - Beijing China
10745b504601Sjiang wu - Sun Microsystems - Beijing China ioc_cmd = mptsas_ioc_event_find_by_cmd(mpt, cmd);
10755b504601Sjiang wu - Sun Microsystems - Beijing China if (ioc_cmd == NULL) {
10765b504601Sjiang wu - Sun Microsystems - Beijing China return;
10775b504601Sjiang wu - Sun Microsystems - Beijing China }
10785b504601Sjiang wu - Sun Microsystems - Beijing China
10795b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_ioc_event_cmdq_delete(mpt, ioc_cmd);
10805b504601Sjiang wu - Sun Microsystems - Beijing China kmem_free(ioc_cmd, M_EVENT_STRUCT_SIZE);
10815b504601Sjiang wu - Sun Microsystems - Beijing China ioc_cmd = NULL;
10825b504601Sjiang wu - Sun Microsystems - Beijing China }
10835b504601Sjiang wu - Sun Microsystems - Beijing China
10845b504601Sjiang wu - Sun Microsystems - Beijing China /*
10855b504601Sjiang wu - Sun Microsystems - Beijing China * NOTE: We should be able to queue TM requests in the controller to make this
10865b504601Sjiang wu - Sun Microsystems - Beijing China * a lot faster. If resetting all targets, for example, we can load the hi
10875b504601Sjiang wu - Sun Microsystems - Beijing China * priority queue with its limit and the controller will reply as they are
10885b504601Sjiang wu - Sun Microsystems - Beijing China * completed. This way, we don't have to poll for one reply at a time.
10895b504601Sjiang wu - Sun Microsystems - Beijing China * Think about enhancing this later.
10905b504601Sjiang wu - Sun Microsystems - Beijing China */
10915b504601Sjiang wu - Sun Microsystems - Beijing China int
mptsas_ioc_task_management(mptsas_t * mpt,int task_type,uint16_t dev_handle,int lun,uint8_t * reply,uint32_t reply_size,int mode)10925b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_ioc_task_management(mptsas_t *mpt, int task_type, uint16_t dev_handle,
109315ada8fcSRobert Mustacchi int lun, uint8_t *reply, uint32_t reply_size, int mode)
10945b504601Sjiang wu - Sun Microsystems - Beijing China {
10955b504601Sjiang wu - Sun Microsystems - Beijing China /*
10965b504601Sjiang wu - Sun Microsystems - Beijing China * In order to avoid allocating variables on the stack,
10975b504601Sjiang wu - Sun Microsystems - Beijing China * we make use of the pre-existing mptsas_cmd_t and
10985b504601Sjiang wu - Sun Microsystems - Beijing China * scsi_pkt which are included in the mptsas_t which
10995b504601Sjiang wu - Sun Microsystems - Beijing China * is passed to this routine.
11005b504601Sjiang wu - Sun Microsystems - Beijing China */
11015b504601Sjiang wu - Sun Microsystems - Beijing China
11025b504601Sjiang wu - Sun Microsystems - Beijing China pMpi2SCSITaskManagementRequest_t task;
11035b504601Sjiang wu - Sun Microsystems - Beijing China int rval = FALSE;
11045b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_cmd_t *cmd;
11055b504601Sjiang wu - Sun Microsystems - Beijing China struct scsi_pkt *pkt;
11065b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_slots_t *slots = mpt->m_active;
1107940efceeSAndy Giles uint64_t request_desc, i;
1108c8f74a56SAda pMPI2DefaultReply_t reply_msg;
11095b504601Sjiang wu - Sun Microsystems - Beijing China
11105b504601Sjiang wu - Sun Microsystems - Beijing China /*
11115b504601Sjiang wu - Sun Microsystems - Beijing China * Can't start another task management routine.
11125b504601Sjiang wu - Sun Microsystems - Beijing China */
11135b504601Sjiang wu - Sun Microsystems - Beijing China if (slots->m_slot[MPTSAS_TM_SLOT(mpt)] != NULL) {
11145b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN, "Can only start 1 task management"
11155b504601Sjiang wu - Sun Microsystems - Beijing China " command at a time\n");
11165b504601Sjiang wu - Sun Microsystems - Beijing China return (FALSE);
11175b504601Sjiang wu - Sun Microsystems - Beijing China }
11185b504601Sjiang wu - Sun Microsystems - Beijing China
11195b504601Sjiang wu - Sun Microsystems - Beijing China cmd = &(mpt->m_event_task_mgmt.m_event_cmd);
11205b504601Sjiang wu - Sun Microsystems - Beijing China pkt = &(mpt->m_event_task_mgmt.m_event_pkt);
11215b504601Sjiang wu - Sun Microsystems - Beijing China
11225b504601Sjiang wu - Sun Microsystems - Beijing China bzero((caddr_t)cmd, sizeof (*cmd));
11235b504601Sjiang wu - Sun Microsystems - Beijing China bzero((caddr_t)pkt, scsi_pkt_size());
11245b504601Sjiang wu - Sun Microsystems - Beijing China
11255b504601Sjiang wu - Sun Microsystems - Beijing China pkt->pkt_cdbp = (opaque_t)&cmd->cmd_cdb[0];
11265b504601Sjiang wu - Sun Microsystems - Beijing China pkt->pkt_scbp = (opaque_t)&cmd->cmd_scb;
11275b504601Sjiang wu - Sun Microsystems - Beijing China pkt->pkt_ha_private = (opaque_t)cmd;
11285b504601Sjiang wu - Sun Microsystems - Beijing China pkt->pkt_flags = (FLAG_NOINTR | FLAG_HEAD);
11295b504601Sjiang wu - Sun Microsystems - Beijing China pkt->pkt_time = 60;
11305b504601Sjiang wu - Sun Microsystems - Beijing China pkt->pkt_address.a_target = dev_handle;
11315b504601Sjiang wu - Sun Microsystems - Beijing China pkt->pkt_address.a_lun = (uchar_t)lun;
11325b504601Sjiang wu - Sun Microsystems - Beijing China cmd->cmd_pkt = pkt;
11335b504601Sjiang wu - Sun Microsystems - Beijing China cmd->cmd_scblen = 1;
11345b504601Sjiang wu - Sun Microsystems - Beijing China cmd->cmd_flags = CFLAG_TM_CMD;
11355b504601Sjiang wu - Sun Microsystems - Beijing China cmd->cmd_slot = MPTSAS_TM_SLOT(mpt);
11365b504601Sjiang wu - Sun Microsystems - Beijing China
11375b504601Sjiang wu - Sun Microsystems - Beijing China slots->m_slot[MPTSAS_TM_SLOT(mpt)] = cmd;
11385b504601Sjiang wu - Sun Microsystems - Beijing China
11395b504601Sjiang wu - Sun Microsystems - Beijing China /*
11405b504601Sjiang wu - Sun Microsystems - Beijing China * Store the TM message in memory location corresponding to the TM slot
11415b504601Sjiang wu - Sun Microsystems - Beijing China * number.
11425b504601Sjiang wu - Sun Microsystems - Beijing China */
11435b504601Sjiang wu - Sun Microsystems - Beijing China task = (pMpi2SCSITaskManagementRequest_t)(mpt->m_req_frame +
11445b504601Sjiang wu - Sun Microsystems - Beijing China (mpt->m_req_frame_size * cmd->cmd_slot));
11455b504601Sjiang wu - Sun Microsystems - Beijing China bzero(task, mpt->m_req_frame_size);
11465b504601Sjiang wu - Sun Microsystems - Beijing China
11475b504601Sjiang wu - Sun Microsystems - Beijing China /*
11485b504601Sjiang wu - Sun Microsystems - Beijing China * form message for requested task
11495b504601Sjiang wu - Sun Microsystems - Beijing China */
11505b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_init_std_hdr(mpt->m_acc_req_frame_hdl, task, dev_handle, lun, 0,
11515b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_FUNCTION_SCSI_TASK_MGMT);
11525b504601Sjiang wu - Sun Microsystems - Beijing China
11535b504601Sjiang wu - Sun Microsystems - Beijing China /*
11545b504601Sjiang wu - Sun Microsystems - Beijing China * Set the task type
11555b504601Sjiang wu - Sun Microsystems - Beijing China */
11565b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put8(mpt->m_acc_req_frame_hdl, &task->TaskType, task_type);
11575b504601Sjiang wu - Sun Microsystems - Beijing China
11585b504601Sjiang wu - Sun Microsystems - Beijing China /*
11595b504601Sjiang wu - Sun Microsystems - Beijing China * Send TM request using High Priority Queue.
11605b504601Sjiang wu - Sun Microsystems - Beijing China */
11615b504601Sjiang wu - Sun Microsystems - Beijing China (void) ddi_dma_sync(mpt->m_dma_req_frame_hdl, 0, 0,
11625b504601Sjiang wu - Sun Microsystems - Beijing China DDI_DMA_SYNC_FORDEV);
1163940efceeSAndy Giles request_desc = (cmd->cmd_slot << 16) +
11645b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_REQ_DESCRIPT_FLAGS_HIGH_PRIORITY;
1165940efceeSAndy Giles MPTSAS_START_CMD(mpt, request_desc);
11665b504601Sjiang wu - Sun Microsystems - Beijing China rval = mptsas_poll(mpt, cmd, MPTSAS_POLL_TIME);
11675b504601Sjiang wu - Sun Microsystems - Beijing China
11685b504601Sjiang wu - Sun Microsystems - Beijing China if (pkt->pkt_reason == CMD_INCOMPLETE)
11695b504601Sjiang wu - Sun Microsystems - Beijing China rval = FALSE;
11705b504601Sjiang wu - Sun Microsystems - Beijing China
1171c8f74a56SAda /*
1172c8f74a56SAda * If a reply frame was used and there is a reply buffer to copy the
1173c8f74a56SAda * reply data into, copy it. If this fails, log a message, but don't
1174c8f74a56SAda * fail the TM request.
1175c8f74a56SAda */
1176c8f74a56SAda if (cmd->cmd_rfm && reply) {
1177c8f74a56SAda (void) ddi_dma_sync(mpt->m_dma_reply_frame_hdl, 0, 0,
1178c8f74a56SAda DDI_DMA_SYNC_FORCPU);
1179c8f74a56SAda reply_msg = (pMPI2DefaultReply_t)
1180c8f74a56SAda (mpt->m_reply_frame + (cmd->cmd_rfm -
1181940efceeSAndy Giles (mpt->m_reply_frame_dma_addr & 0xffffffffu)));
1182c8f74a56SAda if (reply_size > sizeof (MPI2_SCSI_TASK_MANAGE_REPLY)) {
1183c8f74a56SAda reply_size = sizeof (MPI2_SCSI_TASK_MANAGE_REPLY);
1184c8f74a56SAda }
1185c8f74a56SAda mutex_exit(&mpt->m_mutex);
1186c8f74a56SAda for (i = 0; i < reply_size; i++) {
1187c8f74a56SAda if (ddi_copyout((uint8_t *)reply_msg + i, reply + i, 1,
1188c8f74a56SAda mode)) {
1189c8f74a56SAda mptsas_log(mpt, CE_WARN, "failed to copy out "
1190c8f74a56SAda "reply data for TM request");
1191c8f74a56SAda break;
1192c8f74a56SAda }
1193c8f74a56SAda }
1194c8f74a56SAda mutex_enter(&mpt->m_mutex);
1195c8f74a56SAda }
1196c8f74a56SAda
11975b504601Sjiang wu - Sun Microsystems - Beijing China /*
11985b504601Sjiang wu - Sun Microsystems - Beijing China * clear the TM slot before returning
11995b504601Sjiang wu - Sun Microsystems - Beijing China */
12005b504601Sjiang wu - Sun Microsystems - Beijing China slots->m_slot[MPTSAS_TM_SLOT(mpt)] = NULL;
12015b504601Sjiang wu - Sun Microsystems - Beijing China
12025b504601Sjiang wu - Sun Microsystems - Beijing China /*
12035b504601Sjiang wu - Sun Microsystems - Beijing China * If we lost our task management command
12045b504601Sjiang wu - Sun Microsystems - Beijing China * we need to reset the ioc
12055b504601Sjiang wu - Sun Microsystems - Beijing China */
12065b504601Sjiang wu - Sun Microsystems - Beijing China if (rval == FALSE) {
12075b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN, "mptsas_ioc_task_management failed "
12085b504601Sjiang wu - Sun Microsystems - Beijing China "try to reset ioc to recovery!");
1209a9b51062SAda mpt->m_softstate &= ~MPTSAS_SS_MSG_UNIT_RESET;
12105b504601Sjiang wu - Sun Microsystems - Beijing China if (mptsas_restart_ioc(mpt)) {
12115b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN, "mptsas_restart_ioc failed");
12125b504601Sjiang wu - Sun Microsystems - Beijing China rval = FAILED;
12135b504601Sjiang wu - Sun Microsystems - Beijing China }
12145b504601Sjiang wu - Sun Microsystems - Beijing China }
12155b504601Sjiang wu - Sun Microsystems - Beijing China
12165b504601Sjiang wu - Sun Microsystems - Beijing China return (rval);
12175b504601Sjiang wu - Sun Microsystems - Beijing China }
12185b504601Sjiang wu - Sun Microsystems - Beijing China
1219ed7418aeSAndy Giles /*
1220ed7418aeSAndy Giles * Complete firmware download frame for v2.0 cards.
1221ed7418aeSAndy Giles */
1222ed7418aeSAndy Giles static void
mptsas_uflash2(pMpi2FWDownloadRequest fwdownload,ddi_acc_handle_t acc_hdl,uint32_t size,uint8_t type,ddi_dma_cookie_t flsh_cookie)1223ed7418aeSAndy Giles mptsas_uflash2(pMpi2FWDownloadRequest fwdownload,
1224ed7418aeSAndy Giles ddi_acc_handle_t acc_hdl, uint32_t size, uint8_t type,
1225ed7418aeSAndy Giles ddi_dma_cookie_t flsh_cookie)
1226ed7418aeSAndy Giles {
1227ed7418aeSAndy Giles pMpi2FWDownloadTCSGE_t tcsge;
1228ed7418aeSAndy Giles pMpi2SGESimple64_t sge;
1229ed7418aeSAndy Giles uint32_t flagslength;
1230ed7418aeSAndy Giles
1231ed7418aeSAndy Giles ddi_put8(acc_hdl, &fwdownload->Function,
1232ed7418aeSAndy Giles MPI2_FUNCTION_FW_DOWNLOAD);
1233ed7418aeSAndy Giles ddi_put8(acc_hdl, &fwdownload->ImageType, type);
1234ed7418aeSAndy Giles ddi_put8(acc_hdl, &fwdownload->MsgFlags,
1235ed7418aeSAndy Giles MPI2_FW_DOWNLOAD_MSGFLGS_LAST_SEGMENT);
1236ed7418aeSAndy Giles ddi_put32(acc_hdl, &fwdownload->TotalImageSize, size);
1237ed7418aeSAndy Giles
1238ed7418aeSAndy Giles tcsge = (pMpi2FWDownloadTCSGE_t)&fwdownload->SGL;
1239ed7418aeSAndy Giles ddi_put8(acc_hdl, &tcsge->ContextSize, 0);
1240ed7418aeSAndy Giles ddi_put8(acc_hdl, &tcsge->DetailsLength, 12);
1241ed7418aeSAndy Giles ddi_put8(acc_hdl, &tcsge->Flags, 0);
1242ed7418aeSAndy Giles ddi_put32(acc_hdl, &tcsge->ImageOffset, 0);
1243ed7418aeSAndy Giles ddi_put32(acc_hdl, &tcsge->ImageSize, size);
1244ed7418aeSAndy Giles
1245ed7418aeSAndy Giles sge = (pMpi2SGESimple64_t)(tcsge + 1);
1246ed7418aeSAndy Giles flagslength = size;
1247ed7418aeSAndy Giles flagslength |= ((uint32_t)(MPI2_SGE_FLAGS_LAST_ELEMENT |
1248ed7418aeSAndy Giles MPI2_SGE_FLAGS_END_OF_BUFFER |
1249ed7418aeSAndy Giles MPI2_SGE_FLAGS_SIMPLE_ELEMENT |
1250ed7418aeSAndy Giles MPI2_SGE_FLAGS_SYSTEM_ADDRESS |
1251ed7418aeSAndy Giles MPI2_SGE_FLAGS_64_BIT_ADDRESSING |
1252ed7418aeSAndy Giles MPI2_SGE_FLAGS_HOST_TO_IOC |
1253ed7418aeSAndy Giles MPI2_SGE_FLAGS_END_OF_LIST) << MPI2_SGE_FLAGS_SHIFT);
1254ed7418aeSAndy Giles ddi_put32(acc_hdl, &sge->FlagsLength, flagslength);
1255ed7418aeSAndy Giles ddi_put32(acc_hdl, &sge->Address.Low,
1256ed7418aeSAndy Giles flsh_cookie.dmac_address);
1257ed7418aeSAndy Giles ddi_put32(acc_hdl, &sge->Address.High,
1258ed7418aeSAndy Giles (uint32_t)(flsh_cookie.dmac_laddress >> 32));
1259ed7418aeSAndy Giles }
1260ed7418aeSAndy Giles
1261ed7418aeSAndy Giles /*
1262ed7418aeSAndy Giles * Complete firmware download frame for v2.5 cards.
1263ed7418aeSAndy Giles */
1264ed7418aeSAndy Giles static void
mptsas_uflash25(pMpi25FWDownloadRequest fwdownload,ddi_acc_handle_t acc_hdl,uint32_t size,uint8_t type,ddi_dma_cookie_t flsh_cookie)1265ed7418aeSAndy Giles mptsas_uflash25(pMpi25FWDownloadRequest fwdownload,
1266ed7418aeSAndy Giles ddi_acc_handle_t acc_hdl, uint32_t size, uint8_t type,
1267ed7418aeSAndy Giles ddi_dma_cookie_t flsh_cookie)
1268ed7418aeSAndy Giles {
1269ed7418aeSAndy Giles pMpi2IeeeSgeSimple64_t sge;
1270ed7418aeSAndy Giles uint8_t flags;
1271ed7418aeSAndy Giles
1272ed7418aeSAndy Giles ddi_put8(acc_hdl, &fwdownload->Function,
1273ed7418aeSAndy Giles MPI2_FUNCTION_FW_DOWNLOAD);
1274ed7418aeSAndy Giles ddi_put8(acc_hdl, &fwdownload->ImageType, type);
1275ed7418aeSAndy Giles ddi_put8(acc_hdl, &fwdownload->MsgFlags,
1276ed7418aeSAndy Giles MPI2_FW_DOWNLOAD_MSGFLGS_LAST_SEGMENT);
1277ed7418aeSAndy Giles ddi_put32(acc_hdl, &fwdownload->TotalImageSize, size);
1278ed7418aeSAndy Giles
1279ed7418aeSAndy Giles ddi_put32(acc_hdl, &fwdownload->ImageOffset, 0);
1280ed7418aeSAndy Giles ddi_put32(acc_hdl, &fwdownload->ImageSize, size);
1281ed7418aeSAndy Giles
1282ed7418aeSAndy Giles sge = (pMpi2IeeeSgeSimple64_t)&fwdownload->SGL;
1283ed7418aeSAndy Giles flags = MPI2_IEEE_SGE_FLAGS_SIMPLE_ELEMENT |
1284ed7418aeSAndy Giles MPI2_IEEE_SGE_FLAGS_SYSTEM_ADDR |
1285ed7418aeSAndy Giles MPI25_IEEE_SGE_FLAGS_END_OF_LIST;
1286ed7418aeSAndy Giles ddi_put8(acc_hdl, &sge->Flags, flags);
1287ed7418aeSAndy Giles ddi_put32(acc_hdl, &sge->Length, size);
1288ed7418aeSAndy Giles ddi_put32(acc_hdl, &sge->Address.Low,
1289ed7418aeSAndy Giles flsh_cookie.dmac_address);
1290ed7418aeSAndy Giles ddi_put32(acc_hdl, &sge->Address.High,
1291ed7418aeSAndy Giles (uint32_t)(flsh_cookie.dmac_laddress >> 32));
1292ed7418aeSAndy Giles }
1293ed7418aeSAndy Giles
1294ed7418aeSAndy Giles static int mptsas_enable_mpi25_flashupdate = 0;
1295ed7418aeSAndy Giles
12965b504601Sjiang wu - Sun Microsystems - Beijing China int
mptsas_update_flash(mptsas_t * mpt,caddr_t ptrbuffer,uint32_t size,uint8_t type,int mode)12975b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_update_flash(mptsas_t *mpt, caddr_t ptrbuffer, uint32_t size,
12985b504601Sjiang wu - Sun Microsystems - Beijing China uint8_t type, int mode)
12995b504601Sjiang wu - Sun Microsystems - Beijing China {
13005b504601Sjiang wu - Sun Microsystems - Beijing China
13015b504601Sjiang wu - Sun Microsystems - Beijing China /*
13025b504601Sjiang wu - Sun Microsystems - Beijing China * In order to avoid allocating variables on the stack,
13035b504601Sjiang wu - Sun Microsystems - Beijing China * we make use of the pre-existing mptsas_cmd_t and
13045b504601Sjiang wu - Sun Microsystems - Beijing China * scsi_pkt which are included in the mptsas_t which
13055b504601Sjiang wu - Sun Microsystems - Beijing China * is passed to this routine.
13065b504601Sjiang wu - Sun Microsystems - Beijing China */
13075b504601Sjiang wu - Sun Microsystems - Beijing China
13085b504601Sjiang wu - Sun Microsystems - Beijing China ddi_dma_attr_t flsh_dma_attrs;
13095b504601Sjiang wu - Sun Microsystems - Beijing China ddi_dma_cookie_t flsh_cookie;
13105b504601Sjiang wu - Sun Microsystems - Beijing China ddi_dma_handle_t flsh_dma_handle;
13115b504601Sjiang wu - Sun Microsystems - Beijing China ddi_acc_handle_t flsh_accessp;
13125b504601Sjiang wu - Sun Microsystems - Beijing China caddr_t memp, flsh_memp;
13135b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_cmd_t *cmd;
13145b504601Sjiang wu - Sun Microsystems - Beijing China struct scsi_pkt *pkt;
13155b504601Sjiang wu - Sun Microsystems - Beijing China int i;
13165b504601Sjiang wu - Sun Microsystems - Beijing China int rvalue = 0;
1317940efceeSAndy Giles uint64_t request_desc;
13185b504601Sjiang wu - Sun Microsystems - Beijing China
1319ed7418aeSAndy Giles if (mpt->m_MPI25 && !mptsas_enable_mpi25_flashupdate) {
1320ed7418aeSAndy Giles /*
1321ed7418aeSAndy Giles * The code is there but not tested yet.
1322ed7418aeSAndy Giles * User has to know there are risks here.
1323ed7418aeSAndy Giles */
1324ed7418aeSAndy Giles mptsas_log(mpt, CE_WARN, "mptsas_update_flash(): "
1325ed7418aeSAndy Giles "Updating firmware through MPI 2.5 has not been "
1326ed7418aeSAndy Giles "tested yet!\n"
1327ed7418aeSAndy Giles "To enable set mptsas_enable_mpi25_flashupdate to 1\n");
1328ed7418aeSAndy Giles return (-1);
1329ed7418aeSAndy Giles } /* Otherwise, you pay your money and you take your chances. */
1330ed7418aeSAndy Giles
13315b504601Sjiang wu - Sun Microsystems - Beijing China if ((rvalue = (mptsas_request_from_pool(mpt, &cmd, &pkt))) == -1) {
13325b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN, "mptsas_update_flash(): allocation "
13335b504601Sjiang wu - Sun Microsystems - Beijing China "failed. event ack command pool is full\n");
13345b504601Sjiang wu - Sun Microsystems - Beijing China return (rvalue);
13355b504601Sjiang wu - Sun Microsystems - Beijing China }
13365b504601Sjiang wu - Sun Microsystems - Beijing China
13375b504601Sjiang wu - Sun Microsystems - Beijing China bzero((caddr_t)cmd, sizeof (*cmd));
13385b504601Sjiang wu - Sun Microsystems - Beijing China bzero((caddr_t)pkt, scsi_pkt_size());
13395b504601Sjiang wu - Sun Microsystems - Beijing China cmd->ioc_cmd_slot = (uint32_t)rvalue;
13405b504601Sjiang wu - Sun Microsystems - Beijing China
13415b504601Sjiang wu - Sun Microsystems - Beijing China /*
13425b504601Sjiang wu - Sun Microsystems - Beijing China * dynamically create a customized dma attribute structure
13435b504601Sjiang wu - Sun Microsystems - Beijing China * that describes the flash file.
13445b504601Sjiang wu - Sun Microsystems - Beijing China */
13455b504601Sjiang wu - Sun Microsystems - Beijing China flsh_dma_attrs = mpt->m_msg_dma_attr;
13465b504601Sjiang wu - Sun Microsystems - Beijing China flsh_dma_attrs.dma_attr_sgllen = 1;
13475b504601Sjiang wu - Sun Microsystems - Beijing China
1348a9b51062SAda if (mptsas_dma_addr_create(mpt, flsh_dma_attrs, &flsh_dma_handle,
1349a9b51062SAda &flsh_accessp, &flsh_memp, size, &flsh_cookie) == FALSE) {
13505b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN,
1351a9b51062SAda "(unable to allocate dma resource.");
13525b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_return_to_pool(mpt, cmd);
13535b504601Sjiang wu - Sun Microsystems - Beijing China return (-1);
13545b504601Sjiang wu - Sun Microsystems - Beijing China }
13555b504601Sjiang wu - Sun Microsystems - Beijing China
13565b504601Sjiang wu - Sun Microsystems - Beijing China bzero(flsh_memp, size);
13575b504601Sjiang wu - Sun Microsystems - Beijing China
13585b504601Sjiang wu - Sun Microsystems - Beijing China for (i = 0; i < size; i++) {
13595b504601Sjiang wu - Sun Microsystems - Beijing China (void) ddi_copyin(ptrbuffer + i, flsh_memp + i, 1, mode);
13605b504601Sjiang wu - Sun Microsystems - Beijing China }
13615b504601Sjiang wu - Sun Microsystems - Beijing China (void) ddi_dma_sync(flsh_dma_handle, 0, 0, DDI_DMA_SYNC_FORDEV);
13625b504601Sjiang wu - Sun Microsystems - Beijing China
13635b504601Sjiang wu - Sun Microsystems - Beijing China /*
13645b504601Sjiang wu - Sun Microsystems - Beijing China * form a cmd/pkt to store the fw download message
13655b504601Sjiang wu - Sun Microsystems - Beijing China */
13665b504601Sjiang wu - Sun Microsystems - Beijing China pkt->pkt_cdbp = (opaque_t)&cmd->cmd_cdb[0];
13675b504601Sjiang wu - Sun Microsystems - Beijing China pkt->pkt_scbp = (opaque_t)&cmd->cmd_scb;
13685b504601Sjiang wu - Sun Microsystems - Beijing China pkt->pkt_ha_private = (opaque_t)cmd;
13695b504601Sjiang wu - Sun Microsystems - Beijing China pkt->pkt_flags = FLAG_HEAD;
13705b504601Sjiang wu - Sun Microsystems - Beijing China pkt->pkt_time = 60;
13715b504601Sjiang wu - Sun Microsystems - Beijing China cmd->cmd_pkt = pkt;
13725b504601Sjiang wu - Sun Microsystems - Beijing China cmd->cmd_scblen = 1;
13735b504601Sjiang wu - Sun Microsystems - Beijing China cmd->cmd_flags = CFLAG_CMDIOC | CFLAG_FW_CMD;
13745b504601Sjiang wu - Sun Microsystems - Beijing China
13755b504601Sjiang wu - Sun Microsystems - Beijing China /*
13765b504601Sjiang wu - Sun Microsystems - Beijing China * Save the command in a slot
13775b504601Sjiang wu - Sun Microsystems - Beijing China */
13785b504601Sjiang wu - Sun Microsystems - Beijing China if (mptsas_save_cmd(mpt, cmd) == FALSE) {
1379a9b51062SAda mptsas_dma_addr_destroy(&flsh_dma_handle, &flsh_accessp);
13805b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_return_to_pool(mpt, cmd);
13815b504601Sjiang wu - Sun Microsystems - Beijing China return (-1);
13825b504601Sjiang wu - Sun Microsystems - Beijing China }
13835b504601Sjiang wu - Sun Microsystems - Beijing China
13845b504601Sjiang wu - Sun Microsystems - Beijing China /*
13855b504601Sjiang wu - Sun Microsystems - Beijing China * Fill in fw download message
13865b504601Sjiang wu - Sun Microsystems - Beijing China */
13875b504601Sjiang wu - Sun Microsystems - Beijing China ASSERT(cmd->cmd_slot != 0);
13885b504601Sjiang wu - Sun Microsystems - Beijing China memp = mpt->m_req_frame + (mpt->m_req_frame_size * cmd->cmd_slot);
13895b504601Sjiang wu - Sun Microsystems - Beijing China bzero(memp, mpt->m_req_frame_size);
13905b504601Sjiang wu - Sun Microsystems - Beijing China
1391ed7418aeSAndy Giles if (mpt->m_MPI25)
1392ed7418aeSAndy Giles mptsas_uflash25((pMpi25FWDownloadRequest)memp,
1393ed7418aeSAndy Giles mpt->m_acc_req_frame_hdl, size, type, flsh_cookie);
1394ed7418aeSAndy Giles else
1395ed7418aeSAndy Giles mptsas_uflash2((pMpi2FWDownloadRequest)memp,
1396ed7418aeSAndy Giles mpt->m_acc_req_frame_hdl, size, type, flsh_cookie);
13975b504601Sjiang wu - Sun Microsystems - Beijing China
13985b504601Sjiang wu - Sun Microsystems - Beijing China /*
13995b504601Sjiang wu - Sun Microsystems - Beijing China * Start command
14005b504601Sjiang wu - Sun Microsystems - Beijing China */
14015b504601Sjiang wu - Sun Microsystems - Beijing China (void) ddi_dma_sync(mpt->m_dma_req_frame_hdl, 0, 0,
14025b504601Sjiang wu - Sun Microsystems - Beijing China DDI_DMA_SYNC_FORDEV);
1403940efceeSAndy Giles request_desc = (cmd->cmd_slot << 16) +
14045b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_REQ_DESCRIPT_FLAGS_DEFAULT_TYPE;
1405a0ac5a9eSToomas Soome cmd->cmd_rfm = 0;
1406940efceeSAndy Giles MPTSAS_START_CMD(mpt, request_desc);
14075b504601Sjiang wu - Sun Microsystems - Beijing China
14085b504601Sjiang wu - Sun Microsystems - Beijing China rvalue = 0;
1409d3d50737SRafael Vanoni (void) cv_reltimedwait(&mpt->m_fw_cv, &mpt->m_mutex,
1410d3d50737SRafael Vanoni drv_usectohz(60 * MICROSEC), TR_CLOCK_TICK);
14115b504601Sjiang wu - Sun Microsystems - Beijing China if (!(cmd->cmd_flags & CFLAG_FINISHED)) {
1412a9b51062SAda mpt->m_softstate &= ~MPTSAS_SS_MSG_UNIT_RESET;
14135b504601Sjiang wu - Sun Microsystems - Beijing China if ((mptsas_restart_ioc(mpt)) == DDI_FAILURE) {
14145b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN, "mptsas_restart_ioc failed");
14155b504601Sjiang wu - Sun Microsystems - Beijing China }
14165b504601Sjiang wu - Sun Microsystems - Beijing China rvalue = -1;
14175b504601Sjiang wu - Sun Microsystems - Beijing China }
14185b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_remove_cmd(mpt, cmd);
1419a9b51062SAda mptsas_dma_addr_destroy(&flsh_dma_handle, &flsh_accessp);
14205b504601Sjiang wu - Sun Microsystems - Beijing China
14215b504601Sjiang wu - Sun Microsystems - Beijing China return (rvalue);
14225b504601Sjiang wu - Sun Microsystems - Beijing China }
14235b504601Sjiang wu - Sun Microsystems - Beijing China
14245b504601Sjiang wu - Sun Microsystems - Beijing China static int
mptsas_sasdevpage_0_cb(mptsas_t * mpt,caddr_t page_memp,ddi_acc_handle_t accessp,uint16_t iocstatus,uint32_t iocloginfo,va_list ap)14255b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_sasdevpage_0_cb(mptsas_t *mpt, caddr_t page_memp,
14265b504601Sjiang wu - Sun Microsystems - Beijing China ddi_acc_handle_t accessp, uint16_t iocstatus, uint32_t iocloginfo,
14275b504601Sjiang wu - Sun Microsystems - Beijing China va_list ap)
14285b504601Sjiang wu - Sun Microsystems - Beijing China {
14295b504601Sjiang wu - Sun Microsystems - Beijing China #ifndef __lock_lint
14305b504601Sjiang wu - Sun Microsystems - Beijing China _NOTE(ARGUNUSED(ap))
14315b504601Sjiang wu - Sun Microsystems - Beijing China #endif
14325b504601Sjiang wu - Sun Microsystems - Beijing China pMpi2SasDevicePage0_t sasdevpage;
14335b504601Sjiang wu - Sun Microsystems - Beijing China int rval = DDI_SUCCESS, i;
14345b504601Sjiang wu - Sun Microsystems - Beijing China uint8_t *sas_addr = NULL;
14355b504601Sjiang wu - Sun Microsystems - Beijing China uint8_t tmp_sas_wwn[SAS_WWN_BYTE_SIZE];
14369814ff7fSYong-Feng Du uint16_t *devhdl, *bay_num, *enclosure;
14375b504601Sjiang wu - Sun Microsystems - Beijing China uint64_t *sas_wwn;
14385b504601Sjiang wu - Sun Microsystems - Beijing China uint32_t *dev_info;
14395b504601Sjiang wu - Sun Microsystems - Beijing China uint8_t *physport, *phynum;
1440ed7418aeSAndy Giles uint16_t *pdevhdl, *io_flags;
14415b504601Sjiang wu - Sun Microsystems - Beijing China uint32_t page_address;
14425b504601Sjiang wu - Sun Microsystems - Beijing China
14435b504601Sjiang wu - Sun Microsystems - Beijing China if ((iocstatus != MPI2_IOCSTATUS_SUCCESS) &&
14445b504601Sjiang wu - Sun Microsystems - Beijing China (iocstatus != MPI2_IOCSTATUS_CONFIG_INVALID_PAGE)) {
14455b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN, "mptsas_get_sas_device_page0 "
14465b504601Sjiang wu - Sun Microsystems - Beijing China "header: IOCStatus=0x%x, IOCLogInfo=0x%x",
14475b504601Sjiang wu - Sun Microsystems - Beijing China iocstatus, iocloginfo);
14485b504601Sjiang wu - Sun Microsystems - Beijing China rval = DDI_FAILURE;
14495b504601Sjiang wu - Sun Microsystems - Beijing China return (rval);
14505b504601Sjiang wu - Sun Microsystems - Beijing China }
14515b504601Sjiang wu - Sun Microsystems - Beijing China page_address = va_arg(ap, uint32_t);
14525b504601Sjiang wu - Sun Microsystems - Beijing China /*
14535b504601Sjiang wu - Sun Microsystems - Beijing China * The INVALID_PAGE status is normal if using GET_NEXT_HANDLE and there
14545b504601Sjiang wu - Sun Microsystems - Beijing China * are no more pages. If everything is OK up to this point but the
14555b504601Sjiang wu - Sun Microsystems - Beijing China * status is INVALID_PAGE, change rval to FAILURE and quit. Also,
14565b504601Sjiang wu - Sun Microsystems - Beijing China * signal that device traversal is complete.
14575b504601Sjiang wu - Sun Microsystems - Beijing China */
14585b504601Sjiang wu - Sun Microsystems - Beijing China if (iocstatus == MPI2_IOCSTATUS_CONFIG_INVALID_PAGE) {
14595b504601Sjiang wu - Sun Microsystems - Beijing China if ((page_address & MPI2_SAS_DEVICE_PGAD_FORM_MASK) ==
14605b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_SAS_DEVICE_PGAD_FORM_GET_NEXT_HANDLE) {
14615b504601Sjiang wu - Sun Microsystems - Beijing China mpt->m_done_traverse_dev = 1;
14625b504601Sjiang wu - Sun Microsystems - Beijing China }
14635b504601Sjiang wu - Sun Microsystems - Beijing China rval = DDI_FAILURE;
14645b504601Sjiang wu - Sun Microsystems - Beijing China return (rval);
14655b504601Sjiang wu - Sun Microsystems - Beijing China }
14665b504601Sjiang wu - Sun Microsystems - Beijing China devhdl = va_arg(ap, uint16_t *);
14675b504601Sjiang wu - Sun Microsystems - Beijing China sas_wwn = va_arg(ap, uint64_t *);
14685b504601Sjiang wu - Sun Microsystems - Beijing China dev_info = va_arg(ap, uint32_t *);
14695b504601Sjiang wu - Sun Microsystems - Beijing China physport = va_arg(ap, uint8_t *);
14705b504601Sjiang wu - Sun Microsystems - Beijing China phynum = va_arg(ap, uint8_t *);
1471f2e8686eSxun ni - Sun Microsystems - Beijing China pdevhdl = va_arg(ap, uint16_t *);
14729814ff7fSYong-Feng Du bay_num = va_arg(ap, uint16_t *);
14739814ff7fSYong-Feng Du enclosure = va_arg(ap, uint16_t *);
1474ed7418aeSAndy Giles io_flags = va_arg(ap, uint16_t *);
1475f2e8686eSxun ni - Sun Microsystems - Beijing China
14765b504601Sjiang wu - Sun Microsystems - Beijing China sasdevpage = (pMpi2SasDevicePage0_t)page_memp;
14775b504601Sjiang wu - Sun Microsystems - Beijing China
14785b504601Sjiang wu - Sun Microsystems - Beijing China *dev_info = ddi_get32(accessp, &sasdevpage->DeviceInfo);
14795b504601Sjiang wu - Sun Microsystems - Beijing China *devhdl = ddi_get16(accessp, &sasdevpage->DevHandle);
14805b504601Sjiang wu - Sun Microsystems - Beijing China sas_addr = (uint8_t *)(&sasdevpage->SASAddress);
14815b504601Sjiang wu - Sun Microsystems - Beijing China for (i = 0; i < SAS_WWN_BYTE_SIZE; i++) {
14825b504601Sjiang wu - Sun Microsystems - Beijing China tmp_sas_wwn[i] = ddi_get8(accessp, sas_addr + i);
14835b504601Sjiang wu - Sun Microsystems - Beijing China }
14845b504601Sjiang wu - Sun Microsystems - Beijing China bcopy(tmp_sas_wwn, sas_wwn, SAS_WWN_BYTE_SIZE);
14855b504601Sjiang wu - Sun Microsystems - Beijing China *sas_wwn = LE_64(*sas_wwn);
14865b504601Sjiang wu - Sun Microsystems - Beijing China *physport = ddi_get8(accessp, &sasdevpage->PhysicalPort);
14875b504601Sjiang wu - Sun Microsystems - Beijing China *phynum = ddi_get8(accessp, &sasdevpage->PhyNum);
1488f2e8686eSxun ni - Sun Microsystems - Beijing China *pdevhdl = ddi_get16(accessp, &sasdevpage->ParentDevHandle);
14899814ff7fSYong-Feng Du *bay_num = ddi_get16(accessp, &sasdevpage->Slot);
14909814ff7fSYong-Feng Du *enclosure = ddi_get16(accessp, &sasdevpage->EnclosureHandle);
1491ed7418aeSAndy Giles *io_flags = ddi_get16(accessp, &sasdevpage->Flags);
1492ed7418aeSAndy Giles
1493ed7418aeSAndy Giles if (*io_flags & MPI25_SAS_DEVICE0_FLAGS_FAST_PATH_CAPABLE) {
1494ed7418aeSAndy Giles /*
1495ed7418aeSAndy Giles * Leave a messages about FP cabability in the log.
1496ed7418aeSAndy Giles */
1497ed7418aeSAndy Giles mptsas_log(mpt, CE_CONT,
1498ed7418aeSAndy Giles "!w%016"PRIx64" FastPath Capable%s", *sas_wwn,
1499ed7418aeSAndy Giles (*io_flags &
1500ed7418aeSAndy Giles MPI25_SAS_DEVICE0_FLAGS_ENABLED_FAST_PATH)?
1501ed7418aeSAndy Giles " and Enabled":" but Disabled");
1502ed7418aeSAndy Giles }
1503ed7418aeSAndy Giles
15045b504601Sjiang wu - Sun Microsystems - Beijing China return (rval);
15055b504601Sjiang wu - Sun Microsystems - Beijing China }
15065b504601Sjiang wu - Sun Microsystems - Beijing China
15075b504601Sjiang wu - Sun Microsystems - Beijing China /*
15085b504601Sjiang wu - Sun Microsystems - Beijing China * Request MPI configuration page SAS device page 0 to get DevHandle, device
15095b504601Sjiang wu - Sun Microsystems - Beijing China * info and SAS address.
15105b504601Sjiang wu - Sun Microsystems - Beijing China */
15115b504601Sjiang wu - Sun Microsystems - Beijing China int
mptsas_get_sas_device_page0(mptsas_t * mpt,uint32_t page_address,uint16_t * dev_handle,uint64_t * sas_wwn,uint32_t * dev_info,uint8_t * physport,uint8_t * phynum,uint16_t * pdev_handle,uint16_t * bay_num,uint16_t * enclosure,uint16_t * io_flags)15125b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_get_sas_device_page0(mptsas_t *mpt, uint32_t page_address,
15135b504601Sjiang wu - Sun Microsystems - Beijing China uint16_t *dev_handle, uint64_t *sas_wwn, uint32_t *dev_info,
1514f2e8686eSxun ni - Sun Microsystems - Beijing China uint8_t *physport, uint8_t *phynum, uint16_t *pdev_handle,
1515ed7418aeSAndy Giles uint16_t *bay_num, uint16_t *enclosure, uint16_t *io_flags)
15165b504601Sjiang wu - Sun Microsystems - Beijing China {
15175b504601Sjiang wu - Sun Microsystems - Beijing China int rval = DDI_SUCCESS;
15185b504601Sjiang wu - Sun Microsystems - Beijing China
15195b504601Sjiang wu - Sun Microsystems - Beijing China ASSERT(mutex_owned(&mpt->m_mutex));
15205b504601Sjiang wu - Sun Microsystems - Beijing China
15215b504601Sjiang wu - Sun Microsystems - Beijing China /*
15225b504601Sjiang wu - Sun Microsystems - Beijing China * Get the header and config page. reply contains the reply frame,
15235b504601Sjiang wu - Sun Microsystems - Beijing China * which holds status info for the request.
15245b504601Sjiang wu - Sun Microsystems - Beijing China */
15255b504601Sjiang wu - Sun Microsystems - Beijing China rval = mptsas_access_config_page(mpt,
15265b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_CONFIG_ACTION_PAGE_READ_CURRENT,
15275b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_CONFIG_EXTPAGETYPE_SAS_DEVICE, 0, page_address,
15285b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_sasdevpage_0_cb, page_address, dev_handle, sas_wwn,
1529f2e8686eSxun ni - Sun Microsystems - Beijing China dev_info, physport, phynum, pdev_handle,
1530ed7418aeSAndy Giles bay_num, enclosure, io_flags);
15315b504601Sjiang wu - Sun Microsystems - Beijing China
15325b504601Sjiang wu - Sun Microsystems - Beijing China return (rval);
15335b504601Sjiang wu - Sun Microsystems - Beijing China }
15345b504601Sjiang wu - Sun Microsystems - Beijing China
15355b504601Sjiang wu - Sun Microsystems - Beijing China static int
mptsas_sasexpdpage_0_cb(mptsas_t * mpt,caddr_t page_memp,ddi_acc_handle_t accessp,uint16_t iocstatus,uint32_t iocloginfo,va_list ap)15365b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_sasexpdpage_0_cb(mptsas_t *mpt, caddr_t page_memp,
15375b504601Sjiang wu - Sun Microsystems - Beijing China ddi_acc_handle_t accessp, uint16_t iocstatus, uint32_t iocloginfo,
15385b504601Sjiang wu - Sun Microsystems - Beijing China va_list ap)
15395b504601Sjiang wu - Sun Microsystems - Beijing China {
15405b504601Sjiang wu - Sun Microsystems - Beijing China #ifndef __lock_lint
15415b504601Sjiang wu - Sun Microsystems - Beijing China _NOTE(ARGUNUSED(ap))
15425b504601Sjiang wu - Sun Microsystems - Beijing China #endif
15435b504601Sjiang wu - Sun Microsystems - Beijing China pMpi2ExpanderPage0_t expddevpage;
15445b504601Sjiang wu - Sun Microsystems - Beijing China int rval = DDI_SUCCESS, i;
15455b504601Sjiang wu - Sun Microsystems - Beijing China uint8_t *sas_addr = NULL;
15465b504601Sjiang wu - Sun Microsystems - Beijing China uint8_t tmp_sas_wwn[SAS_WWN_BYTE_SIZE];
15475b504601Sjiang wu - Sun Microsystems - Beijing China uint16_t *devhdl;
15485b504601Sjiang wu - Sun Microsystems - Beijing China uint64_t *sas_wwn;
1549cdc7c7feSAda uint8_t physport;
1550cdc7c7feSAda mptsas_phymask_t *phymask;
1551f2e8686eSxun ni - Sun Microsystems - Beijing China uint16_t *pdevhdl;
15525b504601Sjiang wu - Sun Microsystems - Beijing China uint32_t page_address;
15535b504601Sjiang wu - Sun Microsystems - Beijing China
15545b504601Sjiang wu - Sun Microsystems - Beijing China if ((iocstatus != MPI2_IOCSTATUS_SUCCESS) &&
15555b504601Sjiang wu - Sun Microsystems - Beijing China (iocstatus != MPI2_IOCSTATUS_CONFIG_INVALID_PAGE)) {
15565b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN, "mptsas_get_sas_expander_page0 "
15575b504601Sjiang wu - Sun Microsystems - Beijing China "config: IOCStatus=0x%x, IOCLogInfo=0x%x",
15585b504601Sjiang wu - Sun Microsystems - Beijing China iocstatus, iocloginfo);
15595b504601Sjiang wu - Sun Microsystems - Beijing China rval = DDI_FAILURE;
15605b504601Sjiang wu - Sun Microsystems - Beijing China return (rval);
15615b504601Sjiang wu - Sun Microsystems - Beijing China }
15625b504601Sjiang wu - Sun Microsystems - Beijing China page_address = va_arg(ap, uint32_t);
15635b504601Sjiang wu - Sun Microsystems - Beijing China /*
15645b504601Sjiang wu - Sun Microsystems - Beijing China * The INVALID_PAGE status is normal if using GET_NEXT_HANDLE and there
15655b504601Sjiang wu - Sun Microsystems - Beijing China * are no more pages. If everything is OK up to this point but the
15665b504601Sjiang wu - Sun Microsystems - Beijing China * status is INVALID_PAGE, change rval to FAILURE and quit. Also,
15675b504601Sjiang wu - Sun Microsystems - Beijing China * signal that device traversal is complete.
15685b504601Sjiang wu - Sun Microsystems - Beijing China */
15695b504601Sjiang wu - Sun Microsystems - Beijing China if (iocstatus == MPI2_IOCSTATUS_CONFIG_INVALID_PAGE) {
15705b504601Sjiang wu - Sun Microsystems - Beijing China if ((page_address & MPI2_SAS_EXPAND_PGAD_FORM_MASK) ==
15715b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_SAS_EXPAND_PGAD_FORM_GET_NEXT_HNDL) {
15725b504601Sjiang wu - Sun Microsystems - Beijing China mpt->m_done_traverse_smp = 1;
15735b504601Sjiang wu - Sun Microsystems - Beijing China }
15745b504601Sjiang wu - Sun Microsystems - Beijing China rval = DDI_FAILURE;
15755b504601Sjiang wu - Sun Microsystems - Beijing China return (rval);
15765b504601Sjiang wu - Sun Microsystems - Beijing China }
15775b504601Sjiang wu - Sun Microsystems - Beijing China devhdl = va_arg(ap, uint16_t *);
15785b504601Sjiang wu - Sun Microsystems - Beijing China sas_wwn = va_arg(ap, uint64_t *);
1579cdc7c7feSAda phymask = va_arg(ap, mptsas_phymask_t *);
1580f2e8686eSxun ni - Sun Microsystems - Beijing China pdevhdl = va_arg(ap, uint16_t *);
15815b504601Sjiang wu - Sun Microsystems - Beijing China
15825b504601Sjiang wu - Sun Microsystems - Beijing China expddevpage = (pMpi2ExpanderPage0_t)page_memp;
15835b504601Sjiang wu - Sun Microsystems - Beijing China
15845b504601Sjiang wu - Sun Microsystems - Beijing China *devhdl = ddi_get16(accessp, &expddevpage->DevHandle);
15855b504601Sjiang wu - Sun Microsystems - Beijing China physport = ddi_get8(accessp, &expddevpage->PhysicalPort);
15865b504601Sjiang wu - Sun Microsystems - Beijing China *phymask = mptsas_physport_to_phymask(mpt, physport);
1587f2e8686eSxun ni - Sun Microsystems - Beijing China *pdevhdl = ddi_get16(accessp, &expddevpage->ParentDevHandle);
15885b504601Sjiang wu - Sun Microsystems - Beijing China sas_addr = (uint8_t *)(&expddevpage->SASAddress);
15895b504601Sjiang wu - Sun Microsystems - Beijing China for (i = 0; i < SAS_WWN_BYTE_SIZE; i++) {
15905b504601Sjiang wu - Sun Microsystems - Beijing China tmp_sas_wwn[i] = ddi_get8(accessp, sas_addr + i);
15915b504601Sjiang wu - Sun Microsystems - Beijing China }
15925b504601Sjiang wu - Sun Microsystems - Beijing China bcopy(tmp_sas_wwn, sas_wwn, SAS_WWN_BYTE_SIZE);
15935b504601Sjiang wu - Sun Microsystems - Beijing China *sas_wwn = LE_64(*sas_wwn);
1594f2e8686eSxun ni - Sun Microsystems - Beijing China
15955b504601Sjiang wu - Sun Microsystems - Beijing China return (rval);
15965b504601Sjiang wu - Sun Microsystems - Beijing China }
15975b504601Sjiang wu - Sun Microsystems - Beijing China
15985b504601Sjiang wu - Sun Microsystems - Beijing China /*
15995b504601Sjiang wu - Sun Microsystems - Beijing China * Request MPI configuration page SAS device page 0 to get DevHandle, phymask
16005b504601Sjiang wu - Sun Microsystems - Beijing China * and SAS address.
16015b504601Sjiang wu - Sun Microsystems - Beijing China */
16025b504601Sjiang wu - Sun Microsystems - Beijing China int
mptsas_get_sas_expander_page0(mptsas_t * mpt,uint32_t page_address,mptsas_smp_t * info)16035b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_get_sas_expander_page0(mptsas_t *mpt, uint32_t page_address,
16045b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_smp_t *info)
16055b504601Sjiang wu - Sun Microsystems - Beijing China {
16065b504601Sjiang wu - Sun Microsystems - Beijing China int rval = DDI_SUCCESS;
16075b504601Sjiang wu - Sun Microsystems - Beijing China
16085b504601Sjiang wu - Sun Microsystems - Beijing China ASSERT(mutex_owned(&mpt->m_mutex));
16095b504601Sjiang wu - Sun Microsystems - Beijing China
16105b504601Sjiang wu - Sun Microsystems - Beijing China /*
16115b504601Sjiang wu - Sun Microsystems - Beijing China * Get the header and config page. reply contains the reply frame,
16125b504601Sjiang wu - Sun Microsystems - Beijing China * which holds status info for the request.
16135b504601Sjiang wu - Sun Microsystems - Beijing China */
16145b504601Sjiang wu - Sun Microsystems - Beijing China rval = mptsas_access_config_page(mpt,
16155b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_CONFIG_ACTION_PAGE_READ_CURRENT,
16165b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_CONFIG_EXTPAGETYPE_SAS_EXPANDER, 0, page_address,
16175b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_sasexpdpage_0_cb, page_address, &info->m_devhdl,
1618da5ab83fSKeith M Wesolowski &info->m_addr.mta_wwn, &info->m_addr.mta_phymask, &info->m_pdevhdl);
16195b504601Sjiang wu - Sun Microsystems - Beijing China
16205b504601Sjiang wu - Sun Microsystems - Beijing China return (rval);
16215b504601Sjiang wu - Sun Microsystems - Beijing China }
16225b504601Sjiang wu - Sun Microsystems - Beijing China
16235b504601Sjiang wu - Sun Microsystems - Beijing China static int
mptsas_sasportpage_0_cb(mptsas_t * mpt,caddr_t page_memp,ddi_acc_handle_t accessp,uint16_t iocstatus,uint32_t iocloginfo,va_list ap)16245b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_sasportpage_0_cb(mptsas_t *mpt, caddr_t page_memp,
16255b504601Sjiang wu - Sun Microsystems - Beijing China ddi_acc_handle_t accessp, uint16_t iocstatus, uint32_t iocloginfo,
16265b504601Sjiang wu - Sun Microsystems - Beijing China va_list ap)
16275b504601Sjiang wu - Sun Microsystems - Beijing China {
16285b504601Sjiang wu - Sun Microsystems - Beijing China #ifndef __lock_lint
16295b504601Sjiang wu - Sun Microsystems - Beijing China _NOTE(ARGUNUSED(ap))
16305b504601Sjiang wu - Sun Microsystems - Beijing China #endif
16315b504601Sjiang wu - Sun Microsystems - Beijing China int rval = DDI_SUCCESS, i;
16325b504601Sjiang wu - Sun Microsystems - Beijing China uint8_t *sas_addr = NULL;
16335b504601Sjiang wu - Sun Microsystems - Beijing China uint64_t *sas_wwn;
16345b504601Sjiang wu - Sun Microsystems - Beijing China uint8_t tmp_sas_wwn[SAS_WWN_BYTE_SIZE];
16355b504601Sjiang wu - Sun Microsystems - Beijing China uint8_t *portwidth;
16365b504601Sjiang wu - Sun Microsystems - Beijing China pMpi2SasPortPage0_t sasportpage;
16375b504601Sjiang wu - Sun Microsystems - Beijing China
16385b504601Sjiang wu - Sun Microsystems - Beijing China if (iocstatus != MPI2_IOCSTATUS_SUCCESS) {
16395b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN, "mptsas_get_sas_port_page0 "
16405b504601Sjiang wu - Sun Microsystems - Beijing China "config: IOCStatus=0x%x, IOCLogInfo=0x%x",
16415b504601Sjiang wu - Sun Microsystems - Beijing China iocstatus, iocloginfo);
16425b504601Sjiang wu - Sun Microsystems - Beijing China rval = DDI_FAILURE;
16435b504601Sjiang wu - Sun Microsystems - Beijing China return (rval);
16445b504601Sjiang wu - Sun Microsystems - Beijing China }
16455b504601Sjiang wu - Sun Microsystems - Beijing China sas_wwn = va_arg(ap, uint64_t *);
16465b504601Sjiang wu - Sun Microsystems - Beijing China portwidth = va_arg(ap, uint8_t *);
16475b504601Sjiang wu - Sun Microsystems - Beijing China
16485b504601Sjiang wu - Sun Microsystems - Beijing China sasportpage = (pMpi2SasPortPage0_t)page_memp;
16495b504601Sjiang wu - Sun Microsystems - Beijing China sas_addr = (uint8_t *)(&sasportpage->SASAddress);
16505b504601Sjiang wu - Sun Microsystems - Beijing China for (i = 0; i < SAS_WWN_BYTE_SIZE; i++) {
16515b504601Sjiang wu - Sun Microsystems - Beijing China tmp_sas_wwn[i] = ddi_get8(accessp, sas_addr + i);
16525b504601Sjiang wu - Sun Microsystems - Beijing China }
16535b504601Sjiang wu - Sun Microsystems - Beijing China bcopy(tmp_sas_wwn, sas_wwn, SAS_WWN_BYTE_SIZE);
16545b504601Sjiang wu - Sun Microsystems - Beijing China *sas_wwn = LE_64(*sas_wwn);
16555b504601Sjiang wu - Sun Microsystems - Beijing China *portwidth = ddi_get8(accessp, &sasportpage->PortWidth);
16565b504601Sjiang wu - Sun Microsystems - Beijing China return (rval);
16575b504601Sjiang wu - Sun Microsystems - Beijing China }
16585b504601Sjiang wu - Sun Microsystems - Beijing China
16595b504601Sjiang wu - Sun Microsystems - Beijing China /*
16605b504601Sjiang wu - Sun Microsystems - Beijing China * Request MPI configuration page SAS port page 0 to get initiator SAS address
16615b504601Sjiang wu - Sun Microsystems - Beijing China * and port width.
16625b504601Sjiang wu - Sun Microsystems - Beijing China */
16635b504601Sjiang wu - Sun Microsystems - Beijing China int
mptsas_get_sas_port_page0(mptsas_t * mpt,uint32_t page_address,uint64_t * sas_wwn,uint8_t * portwidth)16645b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_get_sas_port_page0(mptsas_t *mpt, uint32_t page_address,
16655b504601Sjiang wu - Sun Microsystems - Beijing China uint64_t *sas_wwn, uint8_t *portwidth)
16665b504601Sjiang wu - Sun Microsystems - Beijing China {
16675b504601Sjiang wu - Sun Microsystems - Beijing China int rval = DDI_SUCCESS;
16685b504601Sjiang wu - Sun Microsystems - Beijing China
16695b504601Sjiang wu - Sun Microsystems - Beijing China ASSERT(mutex_owned(&mpt->m_mutex));
16705b504601Sjiang wu - Sun Microsystems - Beijing China
16715b504601Sjiang wu - Sun Microsystems - Beijing China /*
16725b504601Sjiang wu - Sun Microsystems - Beijing China * Get the header and config page. reply contains the reply frame,
16735b504601Sjiang wu - Sun Microsystems - Beijing China * which holds status info for the request.
16745b504601Sjiang wu - Sun Microsystems - Beijing China */
16755b504601Sjiang wu - Sun Microsystems - Beijing China rval = mptsas_access_config_page(mpt,
16765b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_CONFIG_ACTION_PAGE_READ_CURRENT,
16775b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_CONFIG_EXTPAGETYPE_SAS_PORT, 0, page_address,
16785b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_sasportpage_0_cb, sas_wwn, portwidth);
16795b504601Sjiang wu - Sun Microsystems - Beijing China
16805b504601Sjiang wu - Sun Microsystems - Beijing China return (rval);
16815b504601Sjiang wu - Sun Microsystems - Beijing China }
16825b504601Sjiang wu - Sun Microsystems - Beijing China
16835b504601Sjiang wu - Sun Microsystems - Beijing China static int
mptsas_sasiou_page_0_cb(mptsas_t * mpt,caddr_t page_memp,ddi_acc_handle_t accessp,uint16_t iocstatus,uint32_t iocloginfo,va_list ap)16845b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_sasiou_page_0_cb(mptsas_t *mpt, caddr_t page_memp,
16855b504601Sjiang wu - Sun Microsystems - Beijing China ddi_acc_handle_t accessp, uint16_t iocstatus, uint32_t iocloginfo,
16865b504601Sjiang wu - Sun Microsystems - Beijing China va_list ap)
16875b504601Sjiang wu - Sun Microsystems - Beijing China {
16885b504601Sjiang wu - Sun Microsystems - Beijing China #ifndef __lock_lint
16895b504601Sjiang wu - Sun Microsystems - Beijing China _NOTE(ARGUNUSED(ap))
16905b504601Sjiang wu - Sun Microsystems - Beijing China #endif
16915b504601Sjiang wu - Sun Microsystems - Beijing China int rval = DDI_SUCCESS;
16925b504601Sjiang wu - Sun Microsystems - Beijing China pMpi2SasIOUnitPage0_t sasioupage0;
16935b504601Sjiang wu - Sun Microsystems - Beijing China int i, num_phys;
1694cdc7c7feSAda uint32_t cpdi[MPTSAS_MAX_PHYS], *retrypage0, *readpage1;
16955b504601Sjiang wu - Sun Microsystems - Beijing China uint8_t port_flags;
16965b504601Sjiang wu - Sun Microsystems - Beijing China
16975b504601Sjiang wu - Sun Microsystems - Beijing China if (iocstatus != MPI2_IOCSTATUS_SUCCESS) {
16985b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN, "mptsas_get_sas_io_unit_page0 "
16995b504601Sjiang wu - Sun Microsystems - Beijing China "config: IOCStatus=0x%x, IOCLogInfo=0x%x",
17005b504601Sjiang wu - Sun Microsystems - Beijing China iocstatus, iocloginfo);
17015b504601Sjiang wu - Sun Microsystems - Beijing China rval = DDI_FAILURE;
17025b504601Sjiang wu - Sun Microsystems - Beijing China return (rval);
17035b504601Sjiang wu - Sun Microsystems - Beijing China }
17045b504601Sjiang wu - Sun Microsystems - Beijing China readpage1 = va_arg(ap, uint32_t *);
17055b504601Sjiang wu - Sun Microsystems - Beijing China retrypage0 = va_arg(ap, uint32_t *);
17065b504601Sjiang wu - Sun Microsystems - Beijing China
17075b504601Sjiang wu - Sun Microsystems - Beijing China sasioupage0 = (pMpi2SasIOUnitPage0_t)page_memp;
17085b504601Sjiang wu - Sun Microsystems - Beijing China
17095b504601Sjiang wu - Sun Microsystems - Beijing China num_phys = ddi_get8(accessp, &sasioupage0->NumPhys);
1710cdc7c7feSAda /*
1711cdc7c7feSAda * ASSERT that the num_phys value in SAS IO Unit Page 0 is the same as
1712cdc7c7feSAda * was initially set. This should never change throughout the life of
1713e89016e7SRobert Mustacchi * the driver. Note, due to cases where we've seen page zero have more
1714e89016e7SRobert Mustacchi * phys than the reported manufacturing information, we limit the number
1715e89016e7SRobert Mustacchi * of phys here to what we got from the manufacturing information.
1716cdc7c7feSAda */
1717e89016e7SRobert Mustacchi ASSERT3U(num_phys, >=, mpt->m_num_phys);
1718e89016e7SRobert Mustacchi num_phys = mpt->m_num_phys;
17195b504601Sjiang wu - Sun Microsystems - Beijing China for (i = 0; i < num_phys; i++) {
17205b504601Sjiang wu - Sun Microsystems - Beijing China cpdi[i] = ddi_get32(accessp,
17215b504601Sjiang wu - Sun Microsystems - Beijing China &sasioupage0->PhyData[i].
17225b504601Sjiang wu - Sun Microsystems - Beijing China ControllerPhyDeviceInfo);
17235b504601Sjiang wu - Sun Microsystems - Beijing China port_flags = ddi_get8(accessp,
17245b504601Sjiang wu - Sun Microsystems - Beijing China &sasioupage0->PhyData[i].PortFlags);
17255b504601Sjiang wu - Sun Microsystems - Beijing China mpt->m_phy_info[i].port_num =
17265b504601Sjiang wu - Sun Microsystems - Beijing China ddi_get8(accessp,
17275b504601Sjiang wu - Sun Microsystems - Beijing China &sasioupage0->PhyData[i].Port);
17285b504601Sjiang wu - Sun Microsystems - Beijing China mpt->m_phy_info[i].ctrl_devhdl =
17295b504601Sjiang wu - Sun Microsystems - Beijing China ddi_get16(accessp, &sasioupage0->
17305b504601Sjiang wu - Sun Microsystems - Beijing China PhyData[i].ControllerDevHandle);
17315b504601Sjiang wu - Sun Microsystems - Beijing China mpt->m_phy_info[i].attached_devhdl =
17325b504601Sjiang wu - Sun Microsystems - Beijing China ddi_get16(accessp, &sasioupage0->
17335b504601Sjiang wu - Sun Microsystems - Beijing China PhyData[i].AttachedDevHandle);
17345b504601Sjiang wu - Sun Microsystems - Beijing China mpt->m_phy_info[i].phy_device_type = cpdi[i];
17355b504601Sjiang wu - Sun Microsystems - Beijing China mpt->m_phy_info[i].port_flags = port_flags;
17365b504601Sjiang wu - Sun Microsystems - Beijing China
17375b504601Sjiang wu - Sun Microsystems - Beijing China if (port_flags & DISCOVERY_IN_PROGRESS) {
17385b504601Sjiang wu - Sun Microsystems - Beijing China *retrypage0 = *retrypage0 + 1;
17395b504601Sjiang wu - Sun Microsystems - Beijing China break;
17405b504601Sjiang wu - Sun Microsystems - Beijing China } else {
17415b504601Sjiang wu - Sun Microsystems - Beijing China *retrypage0 = 0;
17425b504601Sjiang wu - Sun Microsystems - Beijing China }
17435b504601Sjiang wu - Sun Microsystems - Beijing China if (!(port_flags & AUTO_PORT_CONFIGURATION)) {
17445b504601Sjiang wu - Sun Microsystems - Beijing China /*
17455b504601Sjiang wu - Sun Microsystems - Beijing China * some PHY configuration described in
17465b504601Sjiang wu - Sun Microsystems - Beijing China * SAS IO Unit Page1
17475b504601Sjiang wu - Sun Microsystems - Beijing China */
17485b504601Sjiang wu - Sun Microsystems - Beijing China *readpage1 = 1;
17495b504601Sjiang wu - Sun Microsystems - Beijing China }
17505b504601Sjiang wu - Sun Microsystems - Beijing China }
17515b504601Sjiang wu - Sun Microsystems - Beijing China
17525b504601Sjiang wu - Sun Microsystems - Beijing China return (rval);
17535b504601Sjiang wu - Sun Microsystems - Beijing China }
17545b504601Sjiang wu - Sun Microsystems - Beijing China
17555b504601Sjiang wu - Sun Microsystems - Beijing China static int
mptsas_sasiou_page_1_cb(mptsas_t * mpt,caddr_t page_memp,ddi_acc_handle_t accessp,uint16_t iocstatus,uint32_t iocloginfo,va_list ap)17565b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_sasiou_page_1_cb(mptsas_t *mpt, caddr_t page_memp,
17575b504601Sjiang wu - Sun Microsystems - Beijing China ddi_acc_handle_t accessp, uint16_t iocstatus, uint32_t iocloginfo,
17585b504601Sjiang wu - Sun Microsystems - Beijing China va_list ap)
17595b504601Sjiang wu - Sun Microsystems - Beijing China {
17605b504601Sjiang wu - Sun Microsystems - Beijing China #ifndef __lock_lint
17615b504601Sjiang wu - Sun Microsystems - Beijing China _NOTE(ARGUNUSED(ap))
17625b504601Sjiang wu - Sun Microsystems - Beijing China #endif
17635b504601Sjiang wu - Sun Microsystems - Beijing China int rval = DDI_SUCCESS;
17645b504601Sjiang wu - Sun Microsystems - Beijing China pMpi2SasIOUnitPage1_t sasioupage1;
17655b504601Sjiang wu - Sun Microsystems - Beijing China int i, num_phys;
1766cdc7c7feSAda uint32_t cpdi[MPTSAS_MAX_PHYS];
17675b504601Sjiang wu - Sun Microsystems - Beijing China uint8_t port_flags;
17685b504601Sjiang wu - Sun Microsystems - Beijing China
17695b504601Sjiang wu - Sun Microsystems - Beijing China if (iocstatus != MPI2_IOCSTATUS_SUCCESS) {
17705b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN, "mptsas_get_sas_io_unit_page1 "
17715b504601Sjiang wu - Sun Microsystems - Beijing China "config: IOCStatus=0x%x, IOCLogInfo=0x%x",
17725b504601Sjiang wu - Sun Microsystems - Beijing China iocstatus, iocloginfo);
17735b504601Sjiang wu - Sun Microsystems - Beijing China rval = DDI_FAILURE;
17745b504601Sjiang wu - Sun Microsystems - Beijing China return (rval);
17755b504601Sjiang wu - Sun Microsystems - Beijing China }
17765b504601Sjiang wu - Sun Microsystems - Beijing China
17775b504601Sjiang wu - Sun Microsystems - Beijing China sasioupage1 = (pMpi2SasIOUnitPage1_t)page_memp;
17785b504601Sjiang wu - Sun Microsystems - Beijing China num_phys = ddi_get8(accessp, &sasioupage1->NumPhys);
1779cdc7c7feSAda /*
1780e89016e7SRobert Mustacchi * ASSERT that the num_phys value in SAS IO Unit Page 0 is the same as
1781cdc7c7feSAda * was initially set. This should never change throughout the life of
1782e89016e7SRobert Mustacchi * the driver. Note, due to cases where we've seen page zero have more
1783e89016e7SRobert Mustacchi * phys than the reported manufacturing information, we limit the number
1784e89016e7SRobert Mustacchi * of phys here to what we got from the manufacturing information.
1785cdc7c7feSAda */
1786e89016e7SRobert Mustacchi ASSERT3U(num_phys, >=, mpt->m_num_phys);
1787e89016e7SRobert Mustacchi num_phys = mpt->m_num_phys;
17885b504601Sjiang wu - Sun Microsystems - Beijing China for (i = 0; i < num_phys; i++) {
17895b504601Sjiang wu - Sun Microsystems - Beijing China cpdi[i] = ddi_get32(accessp, &sasioupage1->PhyData[i].
17905b504601Sjiang wu - Sun Microsystems - Beijing China ControllerPhyDeviceInfo);
17915b504601Sjiang wu - Sun Microsystems - Beijing China port_flags = ddi_get8(accessp,
17925b504601Sjiang wu - Sun Microsystems - Beijing China &sasioupage1->PhyData[i].PortFlags);
17935b504601Sjiang wu - Sun Microsystems - Beijing China mpt->m_phy_info[i].port_num =
17945b504601Sjiang wu - Sun Microsystems - Beijing China ddi_get8(accessp,
17955b504601Sjiang wu - Sun Microsystems - Beijing China &sasioupage1->PhyData[i].Port);
17965b504601Sjiang wu - Sun Microsystems - Beijing China mpt->m_phy_info[i].port_flags = port_flags;
17975b504601Sjiang wu - Sun Microsystems - Beijing China mpt->m_phy_info[i].phy_device_type = cpdi[i];
17985b504601Sjiang wu - Sun Microsystems - Beijing China }
17995b504601Sjiang wu - Sun Microsystems - Beijing China return (rval);
18005b504601Sjiang wu - Sun Microsystems - Beijing China }
18015b504601Sjiang wu - Sun Microsystems - Beijing China
18025b504601Sjiang wu - Sun Microsystems - Beijing China /*
18035b504601Sjiang wu - Sun Microsystems - Beijing China * Read IO unit page 0 to get information for each PHY. If needed, Read IO Unit
18045b504601Sjiang wu - Sun Microsystems - Beijing China * page1 to update the PHY information. This is the message passing method of
18055b504601Sjiang wu - Sun Microsystems - Beijing China * this function which should be called except during initialization.
18065b504601Sjiang wu - Sun Microsystems - Beijing China */
18075b504601Sjiang wu - Sun Microsystems - Beijing China int
mptsas_get_sas_io_unit_page(mptsas_t * mpt)18085b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_get_sas_io_unit_page(mptsas_t *mpt)
18095b504601Sjiang wu - Sun Microsystems - Beijing China {
18105b504601Sjiang wu - Sun Microsystems - Beijing China int rval = DDI_SUCCESS, state;
18115b504601Sjiang wu - Sun Microsystems - Beijing China uint32_t readpage1 = 0, retrypage0 = 0;
18125b504601Sjiang wu - Sun Microsystems - Beijing China
18135b504601Sjiang wu - Sun Microsystems - Beijing China ASSERT(mutex_owned(&mpt->m_mutex));
18145b504601Sjiang wu - Sun Microsystems - Beijing China
18155b504601Sjiang wu - Sun Microsystems - Beijing China /*
18165b504601Sjiang wu - Sun Microsystems - Beijing China * Now we cycle through the state machine. Here's what happens:
18175b504601Sjiang wu - Sun Microsystems - Beijing China * 1. Read IO unit page 0 and set phy information
18185b504601Sjiang wu - Sun Microsystems - Beijing China * 2. See if Read IO unit page1 is needed because of port configuration
18195b504601Sjiang wu - Sun Microsystems - Beijing China * 3. Read IO unit page 1 and update phy information.
18205b504601Sjiang wu - Sun Microsystems - Beijing China */
18215b504601Sjiang wu - Sun Microsystems - Beijing China state = IOUC_READ_PAGE0;
18225b504601Sjiang wu - Sun Microsystems - Beijing China while (state != IOUC_DONE) {
18235b504601Sjiang wu - Sun Microsystems - Beijing China if (state == IOUC_READ_PAGE0) {
18245b504601Sjiang wu - Sun Microsystems - Beijing China rval = mptsas_access_config_page(mpt,
18255b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_CONFIG_ACTION_PAGE_READ_CURRENT,
18265b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_CONFIG_EXTPAGETYPE_SAS_IO_UNIT, 0, 0,
18275b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_sasiou_page_0_cb, &readpage1,
18285b504601Sjiang wu - Sun Microsystems - Beijing China &retrypage0);
18295b504601Sjiang wu - Sun Microsystems - Beijing China } else if (state == IOUC_READ_PAGE1) {
18305b504601Sjiang wu - Sun Microsystems - Beijing China rval = mptsas_access_config_page(mpt,
18315b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_CONFIG_ACTION_PAGE_READ_CURRENT,
18325b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_CONFIG_EXTPAGETYPE_SAS_IO_UNIT, 1, 0,
18335b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_sasiou_page_1_cb);
18345b504601Sjiang wu - Sun Microsystems - Beijing China }
18355b504601Sjiang wu - Sun Microsystems - Beijing China
18365b504601Sjiang wu - Sun Microsystems - Beijing China if (rval == DDI_SUCCESS) {
18375b504601Sjiang wu - Sun Microsystems - Beijing China switch (state) {
18385b504601Sjiang wu - Sun Microsystems - Beijing China case IOUC_READ_PAGE0:
18395b504601Sjiang wu - Sun Microsystems - Beijing China /*
18405b504601Sjiang wu - Sun Microsystems - Beijing China * retry 30 times if discovery is in process
18415b504601Sjiang wu - Sun Microsystems - Beijing China */
18425b504601Sjiang wu - Sun Microsystems - Beijing China if (retrypage0 && (retrypage0 < 30)) {
18435b504601Sjiang wu - Sun Microsystems - Beijing China drv_usecwait(1000 * 100);
18445b504601Sjiang wu - Sun Microsystems - Beijing China state = IOUC_READ_PAGE0;
18455b504601Sjiang wu - Sun Microsystems - Beijing China break;
18465b504601Sjiang wu - Sun Microsystems - Beijing China } else if (retrypage0 == 30) {
18475b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN,
18485b504601Sjiang wu - Sun Microsystems - Beijing China "!Discovery in progress, can't "
18495b504601Sjiang wu - Sun Microsystems - Beijing China "verify IO unit config, then "
18505b504601Sjiang wu - Sun Microsystems - Beijing China "after 30 times retry, give "
18515b504601Sjiang wu - Sun Microsystems - Beijing China "up!");
18525b504601Sjiang wu - Sun Microsystems - Beijing China state = IOUC_DONE;
18535b504601Sjiang wu - Sun Microsystems - Beijing China rval = DDI_FAILURE;
18545b504601Sjiang wu - Sun Microsystems - Beijing China break;
18555b504601Sjiang wu - Sun Microsystems - Beijing China }
18565b504601Sjiang wu - Sun Microsystems - Beijing China
18575b504601Sjiang wu - Sun Microsystems - Beijing China if (readpage1 == 0) {
18585b504601Sjiang wu - Sun Microsystems - Beijing China state = IOUC_DONE;
18595b504601Sjiang wu - Sun Microsystems - Beijing China rval = DDI_SUCCESS;
18605b504601Sjiang wu - Sun Microsystems - Beijing China break;
18615b504601Sjiang wu - Sun Microsystems - Beijing China }
18625b504601Sjiang wu - Sun Microsystems - Beijing China
18635b504601Sjiang wu - Sun Microsystems - Beijing China state = IOUC_READ_PAGE1;
18645b504601Sjiang wu - Sun Microsystems - Beijing China break;
18655b504601Sjiang wu - Sun Microsystems - Beijing China
18665b504601Sjiang wu - Sun Microsystems - Beijing China case IOUC_READ_PAGE1:
18675b504601Sjiang wu - Sun Microsystems - Beijing China state = IOUC_DONE;
18685b504601Sjiang wu - Sun Microsystems - Beijing China rval = DDI_SUCCESS;
18695b504601Sjiang wu - Sun Microsystems - Beijing China break;
18705b504601Sjiang wu - Sun Microsystems - Beijing China }
18715b504601Sjiang wu - Sun Microsystems - Beijing China } else {
18725b504601Sjiang wu - Sun Microsystems - Beijing China return (rval);
18735b504601Sjiang wu - Sun Microsystems - Beijing China }
18745b504601Sjiang wu - Sun Microsystems - Beijing China }
18755b504601Sjiang wu - Sun Microsystems - Beijing China
18765b504601Sjiang wu - Sun Microsystems - Beijing China return (rval);
18775b504601Sjiang wu - Sun Microsystems - Beijing China }
18785b504601Sjiang wu - Sun Microsystems - Beijing China
187908eb0b82SYong-Feng Du static int
mptsas_biospage_3_cb(mptsas_t * mpt,caddr_t page_memp,ddi_acc_handle_t accessp,uint16_t iocstatus,uint32_t iocloginfo,va_list ap)188008eb0b82SYong-Feng Du mptsas_biospage_3_cb(mptsas_t *mpt, caddr_t page_memp,
188108eb0b82SYong-Feng Du ddi_acc_handle_t accessp, uint16_t iocstatus, uint32_t iocloginfo,
188208eb0b82SYong-Feng Du va_list ap)
188308eb0b82SYong-Feng Du {
188408eb0b82SYong-Feng Du #ifndef __lock_lint
188508eb0b82SYong-Feng Du _NOTE(ARGUNUSED(ap))
188608eb0b82SYong-Feng Du #endif
188708eb0b82SYong-Feng Du pMpi2BiosPage3_t sasbiospage;
188808eb0b82SYong-Feng Du int rval = DDI_SUCCESS;
188908eb0b82SYong-Feng Du uint32_t *bios_version;
189008eb0b82SYong-Feng Du
189108eb0b82SYong-Feng Du if ((iocstatus != MPI2_IOCSTATUS_SUCCESS) &&
189208eb0b82SYong-Feng Du (iocstatus != MPI2_IOCSTATUS_CONFIG_INVALID_PAGE)) {
189308eb0b82SYong-Feng Du mptsas_log(mpt, CE_WARN, "mptsas_get_bios_page3 header: "
189408eb0b82SYong-Feng Du "IOCStatus=0x%x, IOCLogInfo=0x%x", iocstatus, iocloginfo);
189508eb0b82SYong-Feng Du rval = DDI_FAILURE;
189608eb0b82SYong-Feng Du return (rval);
189708eb0b82SYong-Feng Du }
189808eb0b82SYong-Feng Du bios_version = va_arg(ap, uint32_t *);
189908eb0b82SYong-Feng Du sasbiospage = (pMpi2BiosPage3_t)page_memp;
190008eb0b82SYong-Feng Du *bios_version = ddi_get32(accessp, &sasbiospage->BiosVersion);
190108eb0b82SYong-Feng Du
190208eb0b82SYong-Feng Du return (rval);
190308eb0b82SYong-Feng Du }
190408eb0b82SYong-Feng Du
190508eb0b82SYong-Feng Du /*
190608eb0b82SYong-Feng Du * Request MPI configuration page BIOS page 3 to get BIOS version. Since all
190708eb0b82SYong-Feng Du * other information in this page is not needed, just ignore it.
190808eb0b82SYong-Feng Du */
190908eb0b82SYong-Feng Du int
mptsas_get_bios_page3(mptsas_t * mpt,uint32_t * bios_version)191008eb0b82SYong-Feng Du mptsas_get_bios_page3(mptsas_t *mpt, uint32_t *bios_version)
191108eb0b82SYong-Feng Du {
191208eb0b82SYong-Feng Du int rval = DDI_SUCCESS;
191308eb0b82SYong-Feng Du
191408eb0b82SYong-Feng Du ASSERT(mutex_owned(&mpt->m_mutex));
191508eb0b82SYong-Feng Du
191608eb0b82SYong-Feng Du /*
191708eb0b82SYong-Feng Du * Get the header and config page. reply contains the reply frame,
191808eb0b82SYong-Feng Du * which holds status info for the request.
191908eb0b82SYong-Feng Du */
192008eb0b82SYong-Feng Du rval = mptsas_access_config_page(mpt,
192108eb0b82SYong-Feng Du MPI2_CONFIG_ACTION_PAGE_READ_CURRENT, MPI2_CONFIG_PAGETYPE_BIOS, 3,
192208eb0b82SYong-Feng Du 0, mptsas_biospage_3_cb, bios_version);
192308eb0b82SYong-Feng Du
192408eb0b82SYong-Feng Du return (rval);
192508eb0b82SYong-Feng Du }
192608eb0b82SYong-Feng Du
19275b504601Sjiang wu - Sun Microsystems - Beijing China /*
19285b504601Sjiang wu - Sun Microsystems - Beijing China * Read IO unit page 0 to get information for each PHY. If needed, Read IO Unit
19295b504601Sjiang wu - Sun Microsystems - Beijing China * page1 to update the PHY information. This is the handshaking version of
19305b504601Sjiang wu - Sun Microsystems - Beijing China * this function, which should be called during initialization only.
19315b504601Sjiang wu - Sun Microsystems - Beijing China */
19325b504601Sjiang wu - Sun Microsystems - Beijing China int
mptsas_get_sas_io_unit_page_hndshk(mptsas_t * mpt)19335b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_get_sas_io_unit_page_hndshk(mptsas_t *mpt)
19345b504601Sjiang wu - Sun Microsystems - Beijing China {
19355b504601Sjiang wu - Sun Microsystems - Beijing China ddi_dma_attr_t recv_dma_attrs, page_dma_attrs;
1936a9b51062SAda ddi_dma_cookie_t page_cookie;
19375b504601Sjiang wu - Sun Microsystems - Beijing China ddi_dma_handle_t recv_dma_handle, page_dma_handle;
19385b504601Sjiang wu - Sun Microsystems - Beijing China ddi_acc_handle_t recv_accessp, page_accessp;
19395b504601Sjiang wu - Sun Microsystems - Beijing China pMpi2ConfigReply_t configreply;
19405b504601Sjiang wu - Sun Microsystems - Beijing China pMpi2SasIOUnitPage0_t sasioupage0;
19415b504601Sjiang wu - Sun Microsystems - Beijing China pMpi2SasIOUnitPage1_t sasioupage1;
19425b504601Sjiang wu - Sun Microsystems - Beijing China int recv_numbytes;
19435b504601Sjiang wu - Sun Microsystems - Beijing China caddr_t recv_memp, page_memp;
1944e89016e7SRobert Mustacchi uint_t i, num_phys, start_phy = 0;
19455b504601Sjiang wu - Sun Microsystems - Beijing China int page0_size =
19465b504601Sjiang wu - Sun Microsystems - Beijing China sizeof (MPI2_CONFIG_PAGE_SASIOUNIT_0) +
1947cdc7c7feSAda (sizeof (MPI2_SAS_IO_UNIT0_PHY_DATA) * (MPTSAS_MAX_PHYS - 1));
19485b504601Sjiang wu - Sun Microsystems - Beijing China int page1_size =
19495b504601Sjiang wu - Sun Microsystems - Beijing China sizeof (MPI2_CONFIG_PAGE_SASIOUNIT_1) +
1950cdc7c7feSAda (sizeof (MPI2_SAS_IO_UNIT1_PHY_DATA) * (MPTSAS_MAX_PHYS - 1));
19515b504601Sjiang wu - Sun Microsystems - Beijing China uint32_t flags_length;
1952cdc7c7feSAda uint32_t cpdi[MPTSAS_MAX_PHYS];
1953cdc7c7feSAda uint32_t readpage1 = 0, retrypage0 = 0;
19545b504601Sjiang wu - Sun Microsystems - Beijing China uint16_t iocstatus;
19555b504601Sjiang wu - Sun Microsystems - Beijing China uint8_t port_flags, page_number, action;
19565ee44debSRobert Mustacchi uint32_t reply_size;
19575b504601Sjiang wu - Sun Microsystems - Beijing China uint_t state;
19585b504601Sjiang wu - Sun Microsystems - Beijing China int rval = DDI_FAILURE;
1959f7d0d869SDan McDonald boolean_t free_recv = B_FALSE, free_page = B_FALSE;
19605b504601Sjiang wu - Sun Microsystems - Beijing China
19615ee44debSRobert Mustacchi /*
19625ee44debSRobert Mustacchi * We want to find a reply_size that's large enough for the page0 and
19635ee44debSRobert Mustacchi * page1 sizes and resistant to increase in the number of phys.
19645ee44debSRobert Mustacchi */
19655ee44debSRobert Mustacchi reply_size = MAX(page0_size, page1_size);
19665ee44debSRobert Mustacchi if (P2ROUNDUP(reply_size, 256) <= reply_size) {
19675ee44debSRobert Mustacchi mptsas_log(mpt, CE_WARN, "mptsas_get_sas_io_unit_page_hndsk: "
19685ee44debSRobert Mustacchi "cannot size reply size");
19695ee44debSRobert Mustacchi goto cleanup;
19705ee44debSRobert Mustacchi }
19715ee44debSRobert Mustacchi
19725b504601Sjiang wu - Sun Microsystems - Beijing China /*
19735b504601Sjiang wu - Sun Microsystems - Beijing China * Initialize our "state machine". This is a bit convoluted,
19745b504601Sjiang wu - Sun Microsystems - Beijing China * but it keeps us from having to do the ddi allocations numerous
19755b504601Sjiang wu - Sun Microsystems - Beijing China * times.
19765b504601Sjiang wu - Sun Microsystems - Beijing China */
19775b504601Sjiang wu - Sun Microsystems - Beijing China
19785b504601Sjiang wu - Sun Microsystems - Beijing China NDBG20(("mptsas_get_sas_io_unit_page_hndshk enter"));
19795b504601Sjiang wu - Sun Microsystems - Beijing China ASSERT(mutex_owned(&mpt->m_mutex));
19805b504601Sjiang wu - Sun Microsystems - Beijing China state = IOUC_READ_PAGE0;
19815b504601Sjiang wu - Sun Microsystems - Beijing China
19825b504601Sjiang wu - Sun Microsystems - Beijing China /*
19835b504601Sjiang wu - Sun Microsystems - Beijing China * dynamically create a customized dma attribute structure
19845b504601Sjiang wu - Sun Microsystems - Beijing China * that describes mpt's config reply page request structure.
19855b504601Sjiang wu - Sun Microsystems - Beijing China */
19865b504601Sjiang wu - Sun Microsystems - Beijing China recv_dma_attrs = mpt->m_msg_dma_attr;
19875b504601Sjiang wu - Sun Microsystems - Beijing China recv_dma_attrs.dma_attr_sgllen = 1;
19885b504601Sjiang wu - Sun Microsystems - Beijing China recv_dma_attrs.dma_attr_granular = (sizeof (MPI2_CONFIG_REPLY));
19895b504601Sjiang wu - Sun Microsystems - Beijing China
1990a9b51062SAda if (mptsas_dma_addr_create(mpt, recv_dma_attrs,
1991a9b51062SAda &recv_dma_handle, &recv_accessp, &recv_memp,
1992a9b51062SAda (sizeof (MPI2_CONFIG_REPLY)), NULL) == FALSE) {
1993a9b51062SAda mptsas_log(mpt, CE_WARN,
1994a9b51062SAda "mptsas_get_sas_io_unit_page_hndshk: recv dma failed");
19955b504601Sjiang wu - Sun Microsystems - Beijing China goto cleanup;
19965b504601Sjiang wu - Sun Microsystems - Beijing China }
1997f7d0d869SDan McDonald /* Now safe to call mptsas_dma_addr_destroy(recv_dma_handle). */
1998f7d0d869SDan McDonald free_recv = B_TRUE;
19995b504601Sjiang wu - Sun Microsystems - Beijing China
20005b504601Sjiang wu - Sun Microsystems - Beijing China page_dma_attrs = mpt->m_msg_dma_attr;
20015b504601Sjiang wu - Sun Microsystems - Beijing China page_dma_attrs.dma_attr_sgllen = 1;
20025b504601Sjiang wu - Sun Microsystems - Beijing China page_dma_attrs.dma_attr_granular = reply_size;
20035b504601Sjiang wu - Sun Microsystems - Beijing China
2004a9b51062SAda if (mptsas_dma_addr_create(mpt, page_dma_attrs,
2005a9b51062SAda &page_dma_handle, &page_accessp, &page_memp,
2006a9b51062SAda reply_size, &page_cookie) == FALSE) {
2007a9b51062SAda mptsas_log(mpt, CE_WARN,
2008a9b51062SAda "mptsas_get_sas_io_unit_page_hndshk: page dma failed");
20095b504601Sjiang wu - Sun Microsystems - Beijing China goto cleanup;
20105b504601Sjiang wu - Sun Microsystems - Beijing China }
2011f7d0d869SDan McDonald /* Now safe to call mptsas_dma_addr_destroy(page_dma_handle). */
2012f7d0d869SDan McDonald free_page = B_TRUE;
20135b504601Sjiang wu - Sun Microsystems - Beijing China
20145b504601Sjiang wu - Sun Microsystems - Beijing China /*
20155b504601Sjiang wu - Sun Microsystems - Beijing China * Now we cycle through the state machine. Here's what happens:
20165b504601Sjiang wu - Sun Microsystems - Beijing China * 1. Read IO unit page 0 and set phy information
20175b504601Sjiang wu - Sun Microsystems - Beijing China * 2. See if Read IO unit page1 is needed because of port configuration
20185b504601Sjiang wu - Sun Microsystems - Beijing China * 3. Read IO unit page 1 and update phy information.
20195b504601Sjiang wu - Sun Microsystems - Beijing China */
20205b504601Sjiang wu - Sun Microsystems - Beijing China
20215b504601Sjiang wu - Sun Microsystems - Beijing China sasioupage0 = (pMpi2SasIOUnitPage0_t)page_memp;
20225b504601Sjiang wu - Sun Microsystems - Beijing China sasioupage1 = (pMpi2SasIOUnitPage1_t)page_memp;
20235b504601Sjiang wu - Sun Microsystems - Beijing China
20245b504601Sjiang wu - Sun Microsystems - Beijing China while (state != IOUC_DONE) {
20255b504601Sjiang wu - Sun Microsystems - Beijing China switch (state) {
20265b504601Sjiang wu - Sun Microsystems - Beijing China case IOUC_READ_PAGE0:
20275b504601Sjiang wu - Sun Microsystems - Beijing China page_number = 0;
20285b504601Sjiang wu - Sun Microsystems - Beijing China action = MPI2_CONFIG_ACTION_PAGE_READ_CURRENT;
20295b504601Sjiang wu - Sun Microsystems - Beijing China flags_length = (uint32_t)page0_size;
20305b504601Sjiang wu - Sun Microsystems - Beijing China flags_length |= ((uint32_t)(
20315b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_SGE_FLAGS_LAST_ELEMENT |
20325b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_SGE_FLAGS_END_OF_BUFFER |
20335b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_SGE_FLAGS_SIMPLE_ELEMENT |
20345b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_SGE_FLAGS_SYSTEM_ADDRESS |
2035940efceeSAndy Giles MPI2_SGE_FLAGS_64_BIT_ADDRESSING |
20365b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_SGE_FLAGS_IOC_TO_HOST |
20375b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_SGE_FLAGS_END_OF_LIST) <<
20385b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_SGE_FLAGS_SHIFT);
20395b504601Sjiang wu - Sun Microsystems - Beijing China
20405b504601Sjiang wu - Sun Microsystems - Beijing China break;
20415b504601Sjiang wu - Sun Microsystems - Beijing China
20425b504601Sjiang wu - Sun Microsystems - Beijing China case IOUC_READ_PAGE1:
20435b504601Sjiang wu - Sun Microsystems - Beijing China page_number = 1;
20445b504601Sjiang wu - Sun Microsystems - Beijing China action = MPI2_CONFIG_ACTION_PAGE_READ_CURRENT;
20455b504601Sjiang wu - Sun Microsystems - Beijing China flags_length = (uint32_t)page1_size;
20465b504601Sjiang wu - Sun Microsystems - Beijing China flags_length |= ((uint32_t)(
20475b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_SGE_FLAGS_LAST_ELEMENT |
20485b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_SGE_FLAGS_END_OF_BUFFER |
20495b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_SGE_FLAGS_SIMPLE_ELEMENT |
20505b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_SGE_FLAGS_SYSTEM_ADDRESS |
2051940efceeSAndy Giles MPI2_SGE_FLAGS_64_BIT_ADDRESSING |
20525b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_SGE_FLAGS_IOC_TO_HOST |
20535b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_SGE_FLAGS_END_OF_LIST) <<
20545b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_SGE_FLAGS_SHIFT);
20555b504601Sjiang wu - Sun Microsystems - Beijing China
20565b504601Sjiang wu - Sun Microsystems - Beijing China break;
20575b504601Sjiang wu - Sun Microsystems - Beijing China default:
20585b504601Sjiang wu - Sun Microsystems - Beijing China break;
20595b504601Sjiang wu - Sun Microsystems - Beijing China }
20605b504601Sjiang wu - Sun Microsystems - Beijing China
20615b504601Sjiang wu - Sun Microsystems - Beijing China bzero(recv_memp, sizeof (MPI2_CONFIG_REPLY));
20625b504601Sjiang wu - Sun Microsystems - Beijing China configreply = (pMpi2ConfigReply_t)recv_memp;
20635b504601Sjiang wu - Sun Microsystems - Beijing China recv_numbytes = sizeof (MPI2_CONFIG_REPLY);
20645b504601Sjiang wu - Sun Microsystems - Beijing China
20655b504601Sjiang wu - Sun Microsystems - Beijing China if (mptsas_send_extended_config_request_msg(mpt,
20665b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_CONFIG_ACTION_PAGE_HEADER,
20675b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_CONFIG_EXTPAGETYPE_SAS_IO_UNIT,
20685b504601Sjiang wu - Sun Microsystems - Beijing China 0, page_number, 0, 0, 0, 0)) {
20695b504601Sjiang wu - Sun Microsystems - Beijing China goto cleanup;
20705b504601Sjiang wu - Sun Microsystems - Beijing China }
20715b504601Sjiang wu - Sun Microsystems - Beijing China
20725b504601Sjiang wu - Sun Microsystems - Beijing China if (mptsas_get_handshake_msg(mpt, recv_memp, recv_numbytes,
20735b504601Sjiang wu - Sun Microsystems - Beijing China recv_accessp)) {
20745b504601Sjiang wu - Sun Microsystems - Beijing China goto cleanup;
20755b504601Sjiang wu - Sun Microsystems - Beijing China }
20765b504601Sjiang wu - Sun Microsystems - Beijing China
20775b504601Sjiang wu - Sun Microsystems - Beijing China iocstatus = ddi_get16(recv_accessp, &configreply->IOCStatus);
20785b504601Sjiang wu - Sun Microsystems - Beijing China iocstatus = MPTSAS_IOCSTATUS(iocstatus);
20795b504601Sjiang wu - Sun Microsystems - Beijing China
20805b504601Sjiang wu - Sun Microsystems - Beijing China if (iocstatus != MPI2_IOCSTATUS_SUCCESS) {
20815b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN,
20825b504601Sjiang wu - Sun Microsystems - Beijing China "mptsas_get_sas_io_unit_page_hndshk: read page "
20835b504601Sjiang wu - Sun Microsystems - Beijing China "header iocstatus = 0x%x", iocstatus);
20845b504601Sjiang wu - Sun Microsystems - Beijing China goto cleanup;
20855b504601Sjiang wu - Sun Microsystems - Beijing China }
20865b504601Sjiang wu - Sun Microsystems - Beijing China
20875b504601Sjiang wu - Sun Microsystems - Beijing China if (action != MPI2_CONFIG_ACTION_PAGE_WRITE_NVRAM) {
20885b504601Sjiang wu - Sun Microsystems - Beijing China bzero(page_memp, reply_size);
20895b504601Sjiang wu - Sun Microsystems - Beijing China }
20905b504601Sjiang wu - Sun Microsystems - Beijing China
20915b504601Sjiang wu - Sun Microsystems - Beijing China if (mptsas_send_extended_config_request_msg(mpt, action,
20925b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_CONFIG_EXTPAGETYPE_SAS_IO_UNIT, 0, page_number,
20935b504601Sjiang wu - Sun Microsystems - Beijing China ddi_get8(recv_accessp, &configreply->Header.PageVersion),
20945b504601Sjiang wu - Sun Microsystems - Beijing China ddi_get16(recv_accessp, &configreply->ExtPageLength),
2095940efceeSAndy Giles flags_length, page_cookie.dmac_laddress)) {
20965b504601Sjiang wu - Sun Microsystems - Beijing China goto cleanup;
20975b504601Sjiang wu - Sun Microsystems - Beijing China }
20985b504601Sjiang wu - Sun Microsystems - Beijing China
20995b504601Sjiang wu - Sun Microsystems - Beijing China if (mptsas_get_handshake_msg(mpt, recv_memp, recv_numbytes,
21005b504601Sjiang wu - Sun Microsystems - Beijing China recv_accessp)) {
21015b504601Sjiang wu - Sun Microsystems - Beijing China goto cleanup;
21025b504601Sjiang wu - Sun Microsystems - Beijing China }
21035b504601Sjiang wu - Sun Microsystems - Beijing China
21045b504601Sjiang wu - Sun Microsystems - Beijing China iocstatus = ddi_get16(recv_accessp, &configreply->IOCStatus);
21055b504601Sjiang wu - Sun Microsystems - Beijing China iocstatus = MPTSAS_IOCSTATUS(iocstatus);
21065b504601Sjiang wu - Sun Microsystems - Beijing China
21075b504601Sjiang wu - Sun Microsystems - Beijing China if (iocstatus != MPI2_IOCSTATUS_SUCCESS) {
21085b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN,
21095b504601Sjiang wu - Sun Microsystems - Beijing China "mptsas_get_sas_io_unit_page_hndshk: IO unit "
21105b504601Sjiang wu - Sun Microsystems - Beijing China "config failed for action %d, iocstatus = 0x%x",
21115b504601Sjiang wu - Sun Microsystems - Beijing China action, iocstatus);
21125b504601Sjiang wu - Sun Microsystems - Beijing China goto cleanup;
21135b504601Sjiang wu - Sun Microsystems - Beijing China }
21145b504601Sjiang wu - Sun Microsystems - Beijing China
21155b504601Sjiang wu - Sun Microsystems - Beijing China switch (state) {
21165b504601Sjiang wu - Sun Microsystems - Beijing China case IOUC_READ_PAGE0:
21175b504601Sjiang wu - Sun Microsystems - Beijing China if ((ddi_dma_sync(page_dma_handle, 0, 0,
21185b504601Sjiang wu - Sun Microsystems - Beijing China DDI_DMA_SYNC_FORCPU)) != DDI_SUCCESS) {
21195b504601Sjiang wu - Sun Microsystems - Beijing China goto cleanup;
21205b504601Sjiang wu - Sun Microsystems - Beijing China }
21215b504601Sjiang wu - Sun Microsystems - Beijing China
21225b504601Sjiang wu - Sun Microsystems - Beijing China num_phys = ddi_get8(page_accessp,
21235b504601Sjiang wu - Sun Microsystems - Beijing China &sasioupage0->NumPhys);
2124cdc7c7feSAda if (num_phys > MPTSAS_MAX_PHYS) {
2125cdc7c7feSAda mptsas_log(mpt, CE_WARN, "Number of phys "
2126cdc7c7feSAda "supported by HBA (%d) is more than max "
2127cdc7c7feSAda "supported by driver (%d). Driver will "
2128cdc7c7feSAda "not attach.", num_phys,
2129cdc7c7feSAda MPTSAS_MAX_PHYS);
2130cdc7c7feSAda rval = DDI_FAILURE;
2131cdc7c7feSAda goto cleanup;
2132cdc7c7feSAda }
2133e89016e7SRobert Mustacchi if (num_phys > mpt->m_num_phys) {
2134e89016e7SRobert Mustacchi mptsas_log(mpt, CE_WARN, "Number of phys "
2135e89016e7SRobert Mustacchi "reported by HBA SAS IO Unit Page 0 (%u) "
2136e89016e7SRobert Mustacchi "is greater than that reported by the "
2137e89016e7SRobert Mustacchi "manufacturing information (%u). Driver "
2138e89016e7SRobert Mustacchi "phy count limited to %u. Please contact "
2139e89016e7SRobert Mustacchi "the firmware vendor about this.", num_phys,
2140e89016e7SRobert Mustacchi mpt->m_num_phys, mpt->m_num_phys);
2141e89016e7SRobert Mustacchi num_phys = mpt->m_num_phys;
2142e89016e7SRobert Mustacchi } else if (num_phys < mpt->m_num_phys) {
2143e89016e7SRobert Mustacchi mptsas_log(mpt, CE_WARN, "Number of phys "
2144e89016e7SRobert Mustacchi "reported by HBA SAS IO Unit Page 0 (%u) "
2145e89016e7SRobert Mustacchi "is less than that reported by the "
2146e89016e7SRobert Mustacchi "manufacturing information (%u). Driver "
2147e89016e7SRobert Mustacchi "will not attach. Please contact the "
2148e89016e7SRobert Mustacchi "firmware vendor about this.", num_phys,
2149e89016e7SRobert Mustacchi mpt->m_num_phys);
2150e89016e7SRobert Mustacchi rval = DDI_FAILURE;
2151e89016e7SRobert Mustacchi goto cleanup;
2152e89016e7SRobert Mustacchi }
2153cdc7c7feSAda for (i = start_phy; i < num_phys; i++, start_phy = i) {
21545b504601Sjiang wu - Sun Microsystems - Beijing China cpdi[i] = ddi_get32(page_accessp,
21555b504601Sjiang wu - Sun Microsystems - Beijing China &sasioupage0->PhyData[i].
21565b504601Sjiang wu - Sun Microsystems - Beijing China ControllerPhyDeviceInfo);
21575b504601Sjiang wu - Sun Microsystems - Beijing China port_flags = ddi_get8(page_accessp,
21585b504601Sjiang wu - Sun Microsystems - Beijing China &sasioupage0->PhyData[i].PortFlags);
21595b504601Sjiang wu - Sun Microsystems - Beijing China
21605b504601Sjiang wu - Sun Microsystems - Beijing China mpt->m_phy_info[i].port_num =
21615b504601Sjiang wu - Sun Microsystems - Beijing China ddi_get8(page_accessp,
21625b504601Sjiang wu - Sun Microsystems - Beijing China &sasioupage0->PhyData[i].Port);
21635b504601Sjiang wu - Sun Microsystems - Beijing China mpt->m_phy_info[i].ctrl_devhdl =
21645b504601Sjiang wu - Sun Microsystems - Beijing China ddi_get16(page_accessp, &sasioupage0->
21655b504601Sjiang wu - Sun Microsystems - Beijing China PhyData[i].ControllerDevHandle);
21665b504601Sjiang wu - Sun Microsystems - Beijing China mpt->m_phy_info[i].attached_devhdl =
21675b504601Sjiang wu - Sun Microsystems - Beijing China ddi_get16(page_accessp, &sasioupage0->
21685b504601Sjiang wu - Sun Microsystems - Beijing China PhyData[i].AttachedDevHandle);
21695b504601Sjiang wu - Sun Microsystems - Beijing China mpt->m_phy_info[i].phy_device_type = cpdi[i];
21705b504601Sjiang wu - Sun Microsystems - Beijing China mpt->m_phy_info[i].port_flags = port_flags;
21715b504601Sjiang wu - Sun Microsystems - Beijing China
21725b504601Sjiang wu - Sun Microsystems - Beijing China if (port_flags & DISCOVERY_IN_PROGRESS) {
21735b504601Sjiang wu - Sun Microsystems - Beijing China retrypage0++;
21745b504601Sjiang wu - Sun Microsystems - Beijing China NDBG20(("Discovery in progress, can't "
21755b504601Sjiang wu - Sun Microsystems - Beijing China "verify IO unit config, then NO.%d"
21765b504601Sjiang wu - Sun Microsystems - Beijing China " times retry", retrypage0));
21775b504601Sjiang wu - Sun Microsystems - Beijing China break;
21785b504601Sjiang wu - Sun Microsystems - Beijing China } else {
21795b504601Sjiang wu - Sun Microsystems - Beijing China retrypage0 = 0;
21805b504601Sjiang wu - Sun Microsystems - Beijing China }
21815b504601Sjiang wu - Sun Microsystems - Beijing China if (!(port_flags & AUTO_PORT_CONFIGURATION)) {
21825b504601Sjiang wu - Sun Microsystems - Beijing China /*
21835b504601Sjiang wu - Sun Microsystems - Beijing China * some PHY configuration described in
21845b504601Sjiang wu - Sun Microsystems - Beijing China * SAS IO Unit Page1
21855b504601Sjiang wu - Sun Microsystems - Beijing China */
21865b504601Sjiang wu - Sun Microsystems - Beijing China readpage1 = 1;
21875b504601Sjiang wu - Sun Microsystems - Beijing China }
21885b504601Sjiang wu - Sun Microsystems - Beijing China }
21895b504601Sjiang wu - Sun Microsystems - Beijing China
21905b504601Sjiang wu - Sun Microsystems - Beijing China /*
21915b504601Sjiang wu - Sun Microsystems - Beijing China * retry 30 times if discovery is in process
21925b504601Sjiang wu - Sun Microsystems - Beijing China */
21935b504601Sjiang wu - Sun Microsystems - Beijing China if (retrypage0 && (retrypage0 < 30)) {
21945b504601Sjiang wu - Sun Microsystems - Beijing China drv_usecwait(1000 * 100);
21955b504601Sjiang wu - Sun Microsystems - Beijing China state = IOUC_READ_PAGE0;
21965b504601Sjiang wu - Sun Microsystems - Beijing China break;
21975b504601Sjiang wu - Sun Microsystems - Beijing China } else if (retrypage0 == 30) {
21985b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN,
21995b504601Sjiang wu - Sun Microsystems - Beijing China "!Discovery in progress, can't "
22005b504601Sjiang wu - Sun Microsystems - Beijing China "verify IO unit config, then after"
22015b504601Sjiang wu - Sun Microsystems - Beijing China " 30 times retry, give up!");
22025b504601Sjiang wu - Sun Microsystems - Beijing China state = IOUC_DONE;
22035b504601Sjiang wu - Sun Microsystems - Beijing China rval = DDI_FAILURE;
22045b504601Sjiang wu - Sun Microsystems - Beijing China break;
22055b504601Sjiang wu - Sun Microsystems - Beijing China }
22065b504601Sjiang wu - Sun Microsystems - Beijing China
22075b504601Sjiang wu - Sun Microsystems - Beijing China if (readpage1 == 0) {
22085b504601Sjiang wu - Sun Microsystems - Beijing China state = IOUC_DONE;
22095b504601Sjiang wu - Sun Microsystems - Beijing China rval = DDI_SUCCESS;
22105b504601Sjiang wu - Sun Microsystems - Beijing China break;
22115b504601Sjiang wu - Sun Microsystems - Beijing China }
22125b504601Sjiang wu - Sun Microsystems - Beijing China
22135b504601Sjiang wu - Sun Microsystems - Beijing China state = IOUC_READ_PAGE1;
22145b504601Sjiang wu - Sun Microsystems - Beijing China break;
22155b504601Sjiang wu - Sun Microsystems - Beijing China
22165b504601Sjiang wu - Sun Microsystems - Beijing China case IOUC_READ_PAGE1:
22175b504601Sjiang wu - Sun Microsystems - Beijing China if ((ddi_dma_sync(page_dma_handle, 0, 0,
22185b504601Sjiang wu - Sun Microsystems - Beijing China DDI_DMA_SYNC_FORCPU)) != DDI_SUCCESS) {
22195b504601Sjiang wu - Sun Microsystems - Beijing China goto cleanup;
22205b504601Sjiang wu - Sun Microsystems - Beijing China }
22215b504601Sjiang wu - Sun Microsystems - Beijing China
22225b504601Sjiang wu - Sun Microsystems - Beijing China num_phys = ddi_get8(page_accessp,
22235b504601Sjiang wu - Sun Microsystems - Beijing China &sasioupage1->NumPhys);
2224cdc7c7feSAda if (num_phys > MPTSAS_MAX_PHYS) {
2225cdc7c7feSAda mptsas_log(mpt, CE_WARN, "Number of phys "
2226cdc7c7feSAda "supported by HBA (%d) is more than max "
2227cdc7c7feSAda "supported by driver (%d). Driver will "
2228cdc7c7feSAda "not attach.", num_phys,
2229cdc7c7feSAda MPTSAS_MAX_PHYS);
2230cdc7c7feSAda rval = DDI_FAILURE;
2231cdc7c7feSAda goto cleanup;
2232cdc7c7feSAda }
2233e89016e7SRobert Mustacchi if (num_phys > mpt->m_num_phys) {
2234e89016e7SRobert Mustacchi mptsas_log(mpt, CE_WARN, "Number of phys "
2235e89016e7SRobert Mustacchi "reported by HBA SAS IO Unit Page 1 (%u) "
2236e89016e7SRobert Mustacchi "is greater than that reported by the "
2237e89016e7SRobert Mustacchi "manufacturing information (%u). Limiting "
2238e89016e7SRobert Mustacchi "phy count to %u. Please contact the "
2239e89016e7SRobert Mustacchi "firmware vendor about this.", num_phys,
2240e89016e7SRobert Mustacchi mpt->m_num_phys, mpt->m_num_phys);
2241e89016e7SRobert Mustacchi num_phys = mpt->m_num_phys;
2242e89016e7SRobert Mustacchi } else if (num_phys < mpt->m_num_phys) {
2243e89016e7SRobert Mustacchi mptsas_log(mpt, CE_WARN, "Number of phys "
2244e89016e7SRobert Mustacchi "reported by HBA SAS IO Unit Page 1 (%u) "
2245e89016e7SRobert Mustacchi "is less than that reported by the "
2246e89016e7SRobert Mustacchi "manufacturing information (%u). Driver "
2247e89016e7SRobert Mustacchi "will not attach. Please contact the "
2248e89016e7SRobert Mustacchi "firmware vendor about this.", num_phys,
2249e89016e7SRobert Mustacchi mpt->m_num_phys);
2250e89016e7SRobert Mustacchi rval = DDI_FAILURE;
2251e89016e7SRobert Mustacchi goto cleanup;
2252e89016e7SRobert Mustacchi }
22535b504601Sjiang wu - Sun Microsystems - Beijing China for (i = 0; i < num_phys; i++) {
22545b504601Sjiang wu - Sun Microsystems - Beijing China cpdi[i] = ddi_get32(page_accessp,
22555b504601Sjiang wu - Sun Microsystems - Beijing China &sasioupage1->PhyData[i].
22565b504601Sjiang wu - Sun Microsystems - Beijing China ControllerPhyDeviceInfo);
22575b504601Sjiang wu - Sun Microsystems - Beijing China port_flags = ddi_get8(page_accessp,
22585b504601Sjiang wu - Sun Microsystems - Beijing China &sasioupage1->PhyData[i].PortFlags);
22595b504601Sjiang wu - Sun Microsystems - Beijing China mpt->m_phy_info[i].port_num =
22605b504601Sjiang wu - Sun Microsystems - Beijing China ddi_get8(page_accessp,
22615b504601Sjiang wu - Sun Microsystems - Beijing China &sasioupage1->PhyData[i].Port);
22625b504601Sjiang wu - Sun Microsystems - Beijing China mpt->m_phy_info[i].port_flags = port_flags;
22635b504601Sjiang wu - Sun Microsystems - Beijing China mpt->m_phy_info[i].phy_device_type = cpdi[i];
22645b504601Sjiang wu - Sun Microsystems - Beijing China
22655b504601Sjiang wu - Sun Microsystems - Beijing China }
22665b504601Sjiang wu - Sun Microsystems - Beijing China
22675b504601Sjiang wu - Sun Microsystems - Beijing China state = IOUC_DONE;
22685b504601Sjiang wu - Sun Microsystems - Beijing China rval = DDI_SUCCESS;
22695b504601Sjiang wu - Sun Microsystems - Beijing China break;
22705b504601Sjiang wu - Sun Microsystems - Beijing China }
22715b504601Sjiang wu - Sun Microsystems - Beijing China }
22725b504601Sjiang wu - Sun Microsystems - Beijing China if ((mptsas_check_dma_handle(recv_dma_handle) != DDI_SUCCESS) ||
22735b504601Sjiang wu - Sun Microsystems - Beijing China (mptsas_check_dma_handle(page_dma_handle) != DDI_SUCCESS)) {
22745b504601Sjiang wu - Sun Microsystems - Beijing China ddi_fm_service_impact(mpt->m_dip, DDI_SERVICE_UNAFFECTED);
22755b504601Sjiang wu - Sun Microsystems - Beijing China rval = DDI_FAILURE;
22765b504601Sjiang wu - Sun Microsystems - Beijing China goto cleanup;
22775b504601Sjiang wu - Sun Microsystems - Beijing China }
22785b504601Sjiang wu - Sun Microsystems - Beijing China if ((mptsas_check_acc_handle(recv_accessp) != DDI_SUCCESS) ||
22795b504601Sjiang wu - Sun Microsystems - Beijing China (mptsas_check_acc_handle(page_accessp) != DDI_SUCCESS)) {
22805b504601Sjiang wu - Sun Microsystems - Beijing China ddi_fm_service_impact(mpt->m_dip, DDI_SERVICE_UNAFFECTED);
22815b504601Sjiang wu - Sun Microsystems - Beijing China rval = DDI_FAILURE;
22825b504601Sjiang wu - Sun Microsystems - Beijing China goto cleanup;
22835b504601Sjiang wu - Sun Microsystems - Beijing China }
22845b504601Sjiang wu - Sun Microsystems - Beijing China
22855b504601Sjiang wu - Sun Microsystems - Beijing China cleanup:
2286f7d0d869SDan McDonald if (free_recv)
2287f7d0d869SDan McDonald mptsas_dma_addr_destroy(&recv_dma_handle, &recv_accessp);
2288f7d0d869SDan McDonald if (free_page)
2289f7d0d869SDan McDonald mptsas_dma_addr_destroy(&page_dma_handle, &page_accessp);
22905b504601Sjiang wu - Sun Microsystems - Beijing China if (rval != DDI_SUCCESS) {
22915b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_fm_ereport(mpt, DDI_FM_DEVICE_NO_RESPONSE);
22925b504601Sjiang wu - Sun Microsystems - Beijing China ddi_fm_service_impact(mpt->m_dip, DDI_SERVICE_LOST);
22935b504601Sjiang wu - Sun Microsystems - Beijing China }
22945b504601Sjiang wu - Sun Microsystems - Beijing China return (rval);
22955b504601Sjiang wu - Sun Microsystems - Beijing China }
22965b504601Sjiang wu - Sun Microsystems - Beijing China
22975b504601Sjiang wu - Sun Microsystems - Beijing China /*
22985b504601Sjiang wu - Sun Microsystems - Beijing China * mptsas_get_manufacture_page5
22995b504601Sjiang wu - Sun Microsystems - Beijing China *
23005b504601Sjiang wu - Sun Microsystems - Beijing China * This function will retrieve the base WWID from the adapter. Since this
23015b504601Sjiang wu - Sun Microsystems - Beijing China * function is only called during the initialization process, use handshaking.
23025b504601Sjiang wu - Sun Microsystems - Beijing China */
23035b504601Sjiang wu - Sun Microsystems - Beijing China int
mptsas_get_manufacture_page5(mptsas_t * mpt)23045b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_get_manufacture_page5(mptsas_t *mpt)
23055b504601Sjiang wu - Sun Microsystems - Beijing China {
23065b504601Sjiang wu - Sun Microsystems - Beijing China ddi_dma_attr_t recv_dma_attrs, page_dma_attrs;
2307a9b51062SAda ddi_dma_cookie_t page_cookie;
23085b504601Sjiang wu - Sun Microsystems - Beijing China ddi_dma_handle_t recv_dma_handle, page_dma_handle;
23095b504601Sjiang wu - Sun Microsystems - Beijing China ddi_acc_handle_t recv_accessp, page_accessp;
23105b504601Sjiang wu - Sun Microsystems - Beijing China pMpi2ConfigReply_t configreply;
23115b504601Sjiang wu - Sun Microsystems - Beijing China caddr_t recv_memp, page_memp;
23125b504601Sjiang wu - Sun Microsystems - Beijing China int recv_numbytes;
23135b504601Sjiang wu - Sun Microsystems - Beijing China pMpi2ManufacturingPage5_t m5;
23145b504601Sjiang wu - Sun Microsystems - Beijing China uint32_t flagslength;
23155b504601Sjiang wu - Sun Microsystems - Beijing China int rval = DDI_SUCCESS;
23165b504601Sjiang wu - Sun Microsystems - Beijing China uint_t iocstatus;
2317f7d0d869SDan McDonald boolean_t free_recv = B_FALSE, free_page = B_FALSE;
23185b504601Sjiang wu - Sun Microsystems - Beijing China
23195b504601Sjiang wu - Sun Microsystems - Beijing China MPTSAS_DISABLE_INTR(mpt);
23205b504601Sjiang wu - Sun Microsystems - Beijing China
23215b504601Sjiang wu - Sun Microsystems - Beijing China if (mptsas_send_config_request_msg(mpt, MPI2_CONFIG_ACTION_PAGE_HEADER,
23225b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_CONFIG_PAGETYPE_MANUFACTURING, 0, 5, 0, 0, 0, 0)) {
23235b504601Sjiang wu - Sun Microsystems - Beijing China rval = DDI_FAILURE;
23245b504601Sjiang wu - Sun Microsystems - Beijing China goto done;
23255b504601Sjiang wu - Sun Microsystems - Beijing China }
23265b504601Sjiang wu - Sun Microsystems - Beijing China
23275b504601Sjiang wu - Sun Microsystems - Beijing China /*
23285b504601Sjiang wu - Sun Microsystems - Beijing China * dynamically create a customized dma attribute structure
23295b504601Sjiang wu - Sun Microsystems - Beijing China * that describes the MPT's config reply page request structure.
23305b504601Sjiang wu - Sun Microsystems - Beijing China */
23315b504601Sjiang wu - Sun Microsystems - Beijing China recv_dma_attrs = mpt->m_msg_dma_attr;
23325b504601Sjiang wu - Sun Microsystems - Beijing China recv_dma_attrs.dma_attr_sgllen = 1;
23335b504601Sjiang wu - Sun Microsystems - Beijing China recv_dma_attrs.dma_attr_granular = (sizeof (MPI2_CONFIG_REPLY));
23345b504601Sjiang wu - Sun Microsystems - Beijing China
2335a9b51062SAda if (mptsas_dma_addr_create(mpt, recv_dma_attrs,
2336a9b51062SAda &recv_dma_handle, &recv_accessp, &recv_memp,
2337a9b51062SAda (sizeof (MPI2_CONFIG_REPLY)), NULL) == FALSE) {
2338f7d0d869SDan McDonald rval = DDI_FAILURE;
23395b504601Sjiang wu - Sun Microsystems - Beijing China goto done;
23405b504601Sjiang wu - Sun Microsystems - Beijing China }
2341f7d0d869SDan McDonald /* Now safe to call mptsas_dma_addr_destroy(recv_dma_handle). */
2342f7d0d869SDan McDonald free_recv = B_TRUE;
23435b504601Sjiang wu - Sun Microsystems - Beijing China
23445b504601Sjiang wu - Sun Microsystems - Beijing China bzero(recv_memp, sizeof (MPI2_CONFIG_REPLY));
23455b504601Sjiang wu - Sun Microsystems - Beijing China configreply = (pMpi2ConfigReply_t)recv_memp;
23465b504601Sjiang wu - Sun Microsystems - Beijing China recv_numbytes = sizeof (MPI2_CONFIG_REPLY);
23475b504601Sjiang wu - Sun Microsystems - Beijing China
23485b504601Sjiang wu - Sun Microsystems - Beijing China /*
23495b504601Sjiang wu - Sun Microsystems - Beijing China * get config reply message
23505b504601Sjiang wu - Sun Microsystems - Beijing China */
23515b504601Sjiang wu - Sun Microsystems - Beijing China if (mptsas_get_handshake_msg(mpt, recv_memp, recv_numbytes,
23525b504601Sjiang wu - Sun Microsystems - Beijing China recv_accessp)) {
23535b504601Sjiang wu - Sun Microsystems - Beijing China rval = DDI_FAILURE;
23545b504601Sjiang wu - Sun Microsystems - Beijing China goto done;
23555b504601Sjiang wu - Sun Microsystems - Beijing China }
23565b504601Sjiang wu - Sun Microsystems - Beijing China
2357e89016e7SRobert Mustacchi if ((iocstatus = ddi_get16(recv_accessp, &configreply->IOCStatus)) !=
2358e89016e7SRobert Mustacchi 0) {
23595b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN, "mptsas_get_manufacture_page5 update: "
23605b504601Sjiang wu - Sun Microsystems - Beijing China "IOCStatus=0x%x, IOCLogInfo=0x%x", iocstatus,
23615b504601Sjiang wu - Sun Microsystems - Beijing China ddi_get32(recv_accessp, &configreply->IOCLogInfo));
23625b504601Sjiang wu - Sun Microsystems - Beijing China goto done;
23635b504601Sjiang wu - Sun Microsystems - Beijing China }
23645b504601Sjiang wu - Sun Microsystems - Beijing China
23655b504601Sjiang wu - Sun Microsystems - Beijing China /*
23665b504601Sjiang wu - Sun Microsystems - Beijing China * dynamically create a customized dma attribute structure
23675b504601Sjiang wu - Sun Microsystems - Beijing China * that describes the MPT's config page structure.
23685b504601Sjiang wu - Sun Microsystems - Beijing China */
23695b504601Sjiang wu - Sun Microsystems - Beijing China page_dma_attrs = mpt->m_msg_dma_attr;
23705b504601Sjiang wu - Sun Microsystems - Beijing China page_dma_attrs.dma_attr_sgllen = 1;
23715b504601Sjiang wu - Sun Microsystems - Beijing China page_dma_attrs.dma_attr_granular = (sizeof (MPI2_CONFIG_PAGE_MAN_5));
23725b504601Sjiang wu - Sun Microsystems - Beijing China
2373a9b51062SAda if (mptsas_dma_addr_create(mpt, page_dma_attrs, &page_dma_handle,
2374a9b51062SAda &page_accessp, &page_memp, (sizeof (MPI2_CONFIG_PAGE_MAN_5)),
2375a9b51062SAda &page_cookie) == FALSE) {
2376f7d0d869SDan McDonald rval = DDI_FAILURE;
23775b504601Sjiang wu - Sun Microsystems - Beijing China goto done;
23785b504601Sjiang wu - Sun Microsystems - Beijing China }
2379f7d0d869SDan McDonald /* Now safe to call mptsas_dma_addr_destroy(page_dma_handle). */
2380f7d0d869SDan McDonald free_page = B_TRUE;
2381f7d0d869SDan McDonald
23825b504601Sjiang wu - Sun Microsystems - Beijing China bzero(page_memp, sizeof (MPI2_CONFIG_PAGE_MAN_5));
23835b504601Sjiang wu - Sun Microsystems - Beijing China m5 = (pMpi2ManufacturingPage5_t)page_memp;
2384940efceeSAndy Giles NDBG20(("mptsas_get_manufacture_page5: paddr 0x%p",
2385940efceeSAndy Giles (void *)(uintptr_t)page_cookie.dmac_laddress));
23865b504601Sjiang wu - Sun Microsystems - Beijing China
23875b504601Sjiang wu - Sun Microsystems - Beijing China /*
23885b504601Sjiang wu - Sun Microsystems - Beijing China * Give reply address to IOC to store config page in and send
23895b504601Sjiang wu - Sun Microsystems - Beijing China * config request out.
23905b504601Sjiang wu - Sun Microsystems - Beijing China */
23915b504601Sjiang wu - Sun Microsystems - Beijing China
23925b504601Sjiang wu - Sun Microsystems - Beijing China flagslength = sizeof (MPI2_CONFIG_PAGE_MAN_5);
23935b504601Sjiang wu - Sun Microsystems - Beijing China flagslength |= ((uint32_t)(MPI2_SGE_FLAGS_LAST_ELEMENT |
23945b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_SGE_FLAGS_END_OF_BUFFER | MPI2_SGE_FLAGS_SIMPLE_ELEMENT |
2395940efceeSAndy Giles MPI2_SGE_FLAGS_SYSTEM_ADDRESS | MPI2_SGE_FLAGS_64_BIT_ADDRESSING |
23965b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_SGE_FLAGS_IOC_TO_HOST |
23975b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_SGE_FLAGS_END_OF_LIST) << MPI2_SGE_FLAGS_SHIFT);
23985b504601Sjiang wu - Sun Microsystems - Beijing China
23995b504601Sjiang wu - Sun Microsystems - Beijing China if (mptsas_send_config_request_msg(mpt,
24005b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_CONFIG_ACTION_PAGE_READ_CURRENT,
24015b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_CONFIG_PAGETYPE_MANUFACTURING, 0, 5,
24025b504601Sjiang wu - Sun Microsystems - Beijing China ddi_get8(recv_accessp, &configreply->Header.PageVersion),
24035b504601Sjiang wu - Sun Microsystems - Beijing China ddi_get8(recv_accessp, &configreply->Header.PageLength),
2404940efceeSAndy Giles flagslength, page_cookie.dmac_laddress)) {
24055b504601Sjiang wu - Sun Microsystems - Beijing China rval = DDI_FAILURE;
24065b504601Sjiang wu - Sun Microsystems - Beijing China goto done;
24075b504601Sjiang wu - Sun Microsystems - Beijing China }
24085b504601Sjiang wu - Sun Microsystems - Beijing China
24095b504601Sjiang wu - Sun Microsystems - Beijing China /*
24105b504601Sjiang wu - Sun Microsystems - Beijing China * get reply view handshake
24115b504601Sjiang wu - Sun Microsystems - Beijing China */
24125b504601Sjiang wu - Sun Microsystems - Beijing China if (mptsas_get_handshake_msg(mpt, recv_memp, recv_numbytes,
24135b504601Sjiang wu - Sun Microsystems - Beijing China recv_accessp)) {
24145b504601Sjiang wu - Sun Microsystems - Beijing China rval = DDI_FAILURE;
24155b504601Sjiang wu - Sun Microsystems - Beijing China goto done;
24165b504601Sjiang wu - Sun Microsystems - Beijing China }
24175b504601Sjiang wu - Sun Microsystems - Beijing China
2418e89016e7SRobert Mustacchi if ((iocstatus = ddi_get16(recv_accessp, &configreply->IOCStatus)) !=
2419e89016e7SRobert Mustacchi 0) {
24205b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN, "mptsas_get_manufacture_page5 config: "
24215b504601Sjiang wu - Sun Microsystems - Beijing China "IOCStatus=0x%x, IOCLogInfo=0x%x", iocstatus,
24225b504601Sjiang wu - Sun Microsystems - Beijing China ddi_get32(recv_accessp, &configreply->IOCLogInfo));
24235b504601Sjiang wu - Sun Microsystems - Beijing China goto done;
24245b504601Sjiang wu - Sun Microsystems - Beijing China }
24255b504601Sjiang wu - Sun Microsystems - Beijing China
24265b504601Sjiang wu - Sun Microsystems - Beijing China (void) ddi_dma_sync(page_dma_handle, 0, 0, DDI_DMA_SYNC_FORCPU);
24275b504601Sjiang wu - Sun Microsystems - Beijing China
24285b504601Sjiang wu - Sun Microsystems - Beijing China /*
24295b504601Sjiang wu - Sun Microsystems - Beijing China * Fusion-MPT stores fields in little-endian format. This is
24305b504601Sjiang wu - Sun Microsystems - Beijing China * why the low-order 32 bits are stored first.
24315b504601Sjiang wu - Sun Microsystems - Beijing China */
24325b504601Sjiang wu - Sun Microsystems - Beijing China mpt->un.sasaddr.m_base_wwid_lo =
24335b504601Sjiang wu - Sun Microsystems - Beijing China ddi_get32(page_accessp, (uint32_t *)(void *)&m5->Phy[0].WWID);
24345b504601Sjiang wu - Sun Microsystems - Beijing China mpt->un.sasaddr.m_base_wwid_hi =
24355b504601Sjiang wu - Sun Microsystems - Beijing China ddi_get32(page_accessp, (uint32_t *)(void *)&m5->Phy[0].WWID + 1);
24365b504601Sjiang wu - Sun Microsystems - Beijing China
24375b504601Sjiang wu - Sun Microsystems - Beijing China if (ddi_prop_update_int64(DDI_DEV_T_NONE, mpt->m_dip,
24385b504601Sjiang wu - Sun Microsystems - Beijing China "base-wwid", mpt->un.m_base_wwid) != DDI_PROP_SUCCESS) {
24395b504601Sjiang wu - Sun Microsystems - Beijing China NDBG2(("%s%d: failed to create base-wwid property",
24405b504601Sjiang wu - Sun Microsystems - Beijing China ddi_driver_name(mpt->m_dip), ddi_get_instance(mpt->m_dip)));
24415b504601Sjiang wu - Sun Microsystems - Beijing China }
24425b504601Sjiang wu - Sun Microsystems - Beijing China
24435b504601Sjiang wu - Sun Microsystems - Beijing China /*
24445b504601Sjiang wu - Sun Microsystems - Beijing China * Set the number of PHYs present.
24455b504601Sjiang wu - Sun Microsystems - Beijing China */
24465b504601Sjiang wu - Sun Microsystems - Beijing China mpt->m_num_phys = ddi_get8(page_accessp, (uint8_t *)&m5->NumPhys);
24475b504601Sjiang wu - Sun Microsystems - Beijing China
24485b504601Sjiang wu - Sun Microsystems - Beijing China if (ddi_prop_update_int(DDI_DEV_T_NONE, mpt->m_dip,
24495b504601Sjiang wu - Sun Microsystems - Beijing China "num-phys", mpt->m_num_phys) != DDI_PROP_SUCCESS) {
24505b504601Sjiang wu - Sun Microsystems - Beijing China NDBG2(("%s%d: failed to create num-phys property",
24515b504601Sjiang wu - Sun Microsystems - Beijing China ddi_driver_name(mpt->m_dip), ddi_get_instance(mpt->m_dip)));
24525b504601Sjiang wu - Sun Microsystems - Beijing China }
24535b504601Sjiang wu - Sun Microsystems - Beijing China
24545b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_log(mpt, CE_NOTE, "!mpt%d: Initiator WWNs: 0x%016llx-0x%016llx",
24555b504601Sjiang wu - Sun Microsystems - Beijing China mpt->m_instance, (unsigned long long)mpt->un.m_base_wwid,
24565b504601Sjiang wu - Sun Microsystems - Beijing China (unsigned long long)mpt->un.m_base_wwid + mpt->m_num_phys - 1);
24575b504601Sjiang wu - Sun Microsystems - Beijing China
24585b504601Sjiang wu - Sun Microsystems - Beijing China if ((mptsas_check_dma_handle(recv_dma_handle) != DDI_SUCCESS) ||
2459f2e8686eSxun ni - Sun Microsystems - Beijing China (mptsas_check_dma_handle(page_dma_handle) != DDI_SUCCESS)) {
2460f2e8686eSxun ni - Sun Microsystems - Beijing China ddi_fm_service_impact(mpt->m_dip, DDI_SERVICE_UNAFFECTED);
2461f2e8686eSxun ni - Sun Microsystems - Beijing China rval = DDI_FAILURE;
2462f2e8686eSxun ni - Sun Microsystems - Beijing China goto done;
2463f2e8686eSxun ni - Sun Microsystems - Beijing China }
2464f2e8686eSxun ni - Sun Microsystems - Beijing China if ((mptsas_check_acc_handle(recv_accessp) != DDI_SUCCESS) ||
2465f2e8686eSxun ni - Sun Microsystems - Beijing China (mptsas_check_acc_handle(page_accessp) != DDI_SUCCESS)) {
2466f2e8686eSxun ni - Sun Microsystems - Beijing China ddi_fm_service_impact(mpt->m_dip, DDI_SERVICE_UNAFFECTED);
2467f2e8686eSxun ni - Sun Microsystems - Beijing China rval = DDI_FAILURE;
2468f2e8686eSxun ni - Sun Microsystems - Beijing China }
2469f2e8686eSxun ni - Sun Microsystems - Beijing China done:
2470f2e8686eSxun ni - Sun Microsystems - Beijing China /*
2471f2e8686eSxun ni - Sun Microsystems - Beijing China * free up memory
2472f2e8686eSxun ni - Sun Microsystems - Beijing China */
2473f7d0d869SDan McDonald if (free_recv)
2474f7d0d869SDan McDonald mptsas_dma_addr_destroy(&recv_dma_handle, &recv_accessp);
2475f7d0d869SDan McDonald if (free_page)
2476f7d0d869SDan McDonald mptsas_dma_addr_destroy(&page_dma_handle, &page_accessp);
2477f2e8686eSxun ni - Sun Microsystems - Beijing China MPTSAS_ENABLE_INTR(mpt);
2478f2e8686eSxun ni - Sun Microsystems - Beijing China
2479f2e8686eSxun ni - Sun Microsystems - Beijing China return (rval);
2480f2e8686eSxun ni - Sun Microsystems - Beijing China }
2481f2e8686eSxun ni - Sun Microsystems - Beijing China
2482f2e8686eSxun ni - Sun Microsystems - Beijing China static int
mptsas_sasphypage_0_cb(mptsas_t * mpt,caddr_t page_memp,ddi_acc_handle_t accessp,uint16_t iocstatus,uint32_t iocloginfo,va_list ap)2483f2e8686eSxun ni - Sun Microsystems - Beijing China mptsas_sasphypage_0_cb(mptsas_t *mpt, caddr_t page_memp,
2484f2e8686eSxun ni - Sun Microsystems - Beijing China ddi_acc_handle_t accessp, uint16_t iocstatus, uint32_t iocloginfo,
2485f2e8686eSxun ni - Sun Microsystems - Beijing China va_list ap)
2486f2e8686eSxun ni - Sun Microsystems - Beijing China {
2487f2e8686eSxun ni - Sun Microsystems - Beijing China #ifndef __lock_lint
2488f2e8686eSxun ni - Sun Microsystems - Beijing China _NOTE(ARGUNUSED(ap))
2489f2e8686eSxun ni - Sun Microsystems - Beijing China #endif
2490f2e8686eSxun ni - Sun Microsystems - Beijing China pMpi2SasPhyPage0_t sasphypage;
2491f2e8686eSxun ni - Sun Microsystems - Beijing China int rval = DDI_SUCCESS;
2492f2e8686eSxun ni - Sun Microsystems - Beijing China uint16_t *owner_devhdl, *attached_devhdl;
2493f2e8686eSxun ni - Sun Microsystems - Beijing China uint8_t *attached_phy_identify;
2494f2e8686eSxun ni - Sun Microsystems - Beijing China uint32_t *attached_phy_info;
2495f2e8686eSxun ni - Sun Microsystems - Beijing China uint8_t *programmed_link_rate;
2496f2e8686eSxun ni - Sun Microsystems - Beijing China uint8_t *hw_link_rate;
2497f2e8686eSxun ni - Sun Microsystems - Beijing China uint8_t *change_count;
2498f2e8686eSxun ni - Sun Microsystems - Beijing China uint32_t *phy_info;
2499f2e8686eSxun ni - Sun Microsystems - Beijing China uint8_t *negotiated_link_rate;
2500f2e8686eSxun ni - Sun Microsystems - Beijing China uint32_t page_address;
2501f2e8686eSxun ni - Sun Microsystems - Beijing China
2502f2e8686eSxun ni - Sun Microsystems - Beijing China if ((iocstatus != MPI2_IOCSTATUS_SUCCESS) &&
2503f2e8686eSxun ni - Sun Microsystems - Beijing China (iocstatus != MPI2_IOCSTATUS_CONFIG_INVALID_PAGE)) {
2504f2e8686eSxun ni - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN, "mptsas_get_sas_expander_page0 "
2505f2e8686eSxun ni - Sun Microsystems - Beijing China "config: IOCStatus=0x%x, IOCLogInfo=0x%x",
2506f2e8686eSxun ni - Sun Microsystems - Beijing China iocstatus, iocloginfo);
2507f2e8686eSxun ni - Sun Microsystems - Beijing China rval = DDI_FAILURE;
2508f2e8686eSxun ni - Sun Microsystems - Beijing China return (rval);
2509f2e8686eSxun ni - Sun Microsystems - Beijing China }
2510f2e8686eSxun ni - Sun Microsystems - Beijing China page_address = va_arg(ap, uint32_t);
2511f2e8686eSxun ni - Sun Microsystems - Beijing China /*
2512f2e8686eSxun ni - Sun Microsystems - Beijing China * The INVALID_PAGE status is normal if using GET_NEXT_HANDLE and there
2513f2e8686eSxun ni - Sun Microsystems - Beijing China * are no more pages. If everything is OK up to this point but the
2514f2e8686eSxun ni - Sun Microsystems - Beijing China * status is INVALID_PAGE, change rval to FAILURE and quit. Also,
2515f2e8686eSxun ni - Sun Microsystems - Beijing China * signal that device traversal is complete.
2516f2e8686eSxun ni - Sun Microsystems - Beijing China */
2517f2e8686eSxun ni - Sun Microsystems - Beijing China if (iocstatus == MPI2_IOCSTATUS_CONFIG_INVALID_PAGE) {
2518f2e8686eSxun ni - Sun Microsystems - Beijing China if ((page_address & MPI2_SAS_EXPAND_PGAD_FORM_MASK) ==
2519f2e8686eSxun ni - Sun Microsystems - Beijing China MPI2_SAS_EXPAND_PGAD_FORM_GET_NEXT_HNDL) {
2520f2e8686eSxun ni - Sun Microsystems - Beijing China mpt->m_done_traverse_smp = 1;
2521f2e8686eSxun ni - Sun Microsystems - Beijing China }
2522f2e8686eSxun ni - Sun Microsystems - Beijing China rval = DDI_FAILURE;
2523f2e8686eSxun ni - Sun Microsystems - Beijing China return (rval);
2524f2e8686eSxun ni - Sun Microsystems - Beijing China }
2525f2e8686eSxun ni - Sun Microsystems - Beijing China owner_devhdl = va_arg(ap, uint16_t *);
2526f2e8686eSxun ni - Sun Microsystems - Beijing China attached_devhdl = va_arg(ap, uint16_t *);
2527f2e8686eSxun ni - Sun Microsystems - Beijing China attached_phy_identify = va_arg(ap, uint8_t *);
2528f2e8686eSxun ni - Sun Microsystems - Beijing China attached_phy_info = va_arg(ap, uint32_t *);
2529f2e8686eSxun ni - Sun Microsystems - Beijing China programmed_link_rate = va_arg(ap, uint8_t *);
2530f2e8686eSxun ni - Sun Microsystems - Beijing China hw_link_rate = va_arg(ap, uint8_t *);
2531f2e8686eSxun ni - Sun Microsystems - Beijing China change_count = va_arg(ap, uint8_t *);
2532f2e8686eSxun ni - Sun Microsystems - Beijing China phy_info = va_arg(ap, uint32_t *);
2533f2e8686eSxun ni - Sun Microsystems - Beijing China negotiated_link_rate = va_arg(ap, uint8_t *);
2534f2e8686eSxun ni - Sun Microsystems - Beijing China
2535f2e8686eSxun ni - Sun Microsystems - Beijing China sasphypage = (pMpi2SasPhyPage0_t)page_memp;
2536f2e8686eSxun ni - Sun Microsystems - Beijing China
2537f2e8686eSxun ni - Sun Microsystems - Beijing China *owner_devhdl =
2538f2e8686eSxun ni - Sun Microsystems - Beijing China ddi_get16(accessp, &sasphypage->OwnerDevHandle);
2539f2e8686eSxun ni - Sun Microsystems - Beijing China *attached_devhdl =
2540f2e8686eSxun ni - Sun Microsystems - Beijing China ddi_get16(accessp, &sasphypage->AttachedDevHandle);
2541f2e8686eSxun ni - Sun Microsystems - Beijing China *attached_phy_identify =
2542f2e8686eSxun ni - Sun Microsystems - Beijing China ddi_get8(accessp, &sasphypage->AttachedPhyIdentifier);
2543f2e8686eSxun ni - Sun Microsystems - Beijing China *attached_phy_info =
2544f2e8686eSxun ni - Sun Microsystems - Beijing China ddi_get32(accessp, &sasphypage->AttachedPhyInfo);
2545f2e8686eSxun ni - Sun Microsystems - Beijing China *programmed_link_rate =
2546f2e8686eSxun ni - Sun Microsystems - Beijing China ddi_get8(accessp, &sasphypage->ProgrammedLinkRate);
2547f2e8686eSxun ni - Sun Microsystems - Beijing China *hw_link_rate =
2548f2e8686eSxun ni - Sun Microsystems - Beijing China ddi_get8(accessp, &sasphypage->HwLinkRate);
2549f2e8686eSxun ni - Sun Microsystems - Beijing China *change_count =
2550f2e8686eSxun ni - Sun Microsystems - Beijing China ddi_get8(accessp, &sasphypage->ChangeCount);
2551f2e8686eSxun ni - Sun Microsystems - Beijing China *phy_info =
2552f2e8686eSxun ni - Sun Microsystems - Beijing China ddi_get32(accessp, &sasphypage->PhyInfo);
2553f2e8686eSxun ni - Sun Microsystems - Beijing China *negotiated_link_rate =
2554f2e8686eSxun ni - Sun Microsystems - Beijing China ddi_get8(accessp, &sasphypage->NegotiatedLinkRate);
2555f2e8686eSxun ni - Sun Microsystems - Beijing China
2556f2e8686eSxun ni - Sun Microsystems - Beijing China return (rval);
2557f2e8686eSxun ni - Sun Microsystems - Beijing China }
2558f2e8686eSxun ni - Sun Microsystems - Beijing China
2559f2e8686eSxun ni - Sun Microsystems - Beijing China /*
2560f2e8686eSxun ni - Sun Microsystems - Beijing China * Request MPI configuration page SAS phy page 0 to get DevHandle, phymask
2561f2e8686eSxun ni - Sun Microsystems - Beijing China * and SAS address.
2562f2e8686eSxun ni - Sun Microsystems - Beijing China */
2563f2e8686eSxun ni - Sun Microsystems - Beijing China int
mptsas_get_sas_phy_page0(mptsas_t * mpt,uint32_t page_address,smhba_info_t * info)2564f2e8686eSxun ni - Sun Microsystems - Beijing China mptsas_get_sas_phy_page0(mptsas_t *mpt, uint32_t page_address,
2565f2e8686eSxun ni - Sun Microsystems - Beijing China smhba_info_t *info)
2566f2e8686eSxun ni - Sun Microsystems - Beijing China {
2567f2e8686eSxun ni - Sun Microsystems - Beijing China int rval = DDI_SUCCESS;
2568f2e8686eSxun ni - Sun Microsystems - Beijing China
2569f2e8686eSxun ni - Sun Microsystems - Beijing China ASSERT(mutex_owned(&mpt->m_mutex));
2570f2e8686eSxun ni - Sun Microsystems - Beijing China
2571f2e8686eSxun ni - Sun Microsystems - Beijing China /*
2572f2e8686eSxun ni - Sun Microsystems - Beijing China * Get the header and config page. reply contains the reply frame,
2573f2e8686eSxun ni - Sun Microsystems - Beijing China * which holds status info for the request.
2574f2e8686eSxun ni - Sun Microsystems - Beijing China */
2575f2e8686eSxun ni - Sun Microsystems - Beijing China rval = mptsas_access_config_page(mpt,
2576f2e8686eSxun ni - Sun Microsystems - Beijing China MPI2_CONFIG_ACTION_PAGE_READ_CURRENT,
2577f2e8686eSxun ni - Sun Microsystems - Beijing China MPI2_CONFIG_EXTPAGETYPE_SAS_PHY, 0, page_address,
2578f2e8686eSxun ni - Sun Microsystems - Beijing China mptsas_sasphypage_0_cb, page_address, &info->owner_devhdl,
2579f2e8686eSxun ni - Sun Microsystems - Beijing China &info->attached_devhdl, &info->attached_phy_identify,
2580f2e8686eSxun ni - Sun Microsystems - Beijing China &info->attached_phy_info, &info->programmed_link_rate,
2581f2e8686eSxun ni - Sun Microsystems - Beijing China &info->hw_link_rate, &info->change_count,
2582f2e8686eSxun ni - Sun Microsystems - Beijing China &info->phy_info, &info->negotiated_link_rate);
2583f2e8686eSxun ni - Sun Microsystems - Beijing China
2584f2e8686eSxun ni - Sun Microsystems - Beijing China return (rval);
2585f2e8686eSxun ni - Sun Microsystems - Beijing China }
2586f2e8686eSxun ni - Sun Microsystems - Beijing China
2587f2e8686eSxun ni - Sun Microsystems - Beijing China static int
mptsas_sasphypage_1_cb(mptsas_t * mpt,caddr_t page_memp,ddi_acc_handle_t accessp,uint16_t iocstatus,uint32_t iocloginfo,va_list ap)2588f2e8686eSxun ni - Sun Microsystems - Beijing China mptsas_sasphypage_1_cb(mptsas_t *mpt, caddr_t page_memp,
2589f2e8686eSxun ni - Sun Microsystems - Beijing China ddi_acc_handle_t accessp, uint16_t iocstatus, uint32_t iocloginfo,
2590f2e8686eSxun ni - Sun Microsystems - Beijing China va_list ap)
2591f2e8686eSxun ni - Sun Microsystems - Beijing China {
2592f2e8686eSxun ni - Sun Microsystems - Beijing China #ifndef __lock_lint
2593f2e8686eSxun ni - Sun Microsystems - Beijing China _NOTE(ARGUNUSED(ap))
2594f2e8686eSxun ni - Sun Microsystems - Beijing China #endif
2595f2e8686eSxun ni - Sun Microsystems - Beijing China pMpi2SasPhyPage1_t sasphypage;
2596f2e8686eSxun ni - Sun Microsystems - Beijing China int rval = DDI_SUCCESS;
2597f2e8686eSxun ni - Sun Microsystems - Beijing China
2598f2e8686eSxun ni - Sun Microsystems - Beijing China uint32_t *invalid_dword_count;
2599f2e8686eSxun ni - Sun Microsystems - Beijing China uint32_t *running_disparity_error_count;
2600f2e8686eSxun ni - Sun Microsystems - Beijing China uint32_t *loss_of_dword_sync_count;
2601f2e8686eSxun ni - Sun Microsystems - Beijing China uint32_t *phy_reset_problem_count;
2602f2e8686eSxun ni - Sun Microsystems - Beijing China uint32_t page_address;
2603f2e8686eSxun ni - Sun Microsystems - Beijing China
2604f2e8686eSxun ni - Sun Microsystems - Beijing China if ((iocstatus != MPI2_IOCSTATUS_SUCCESS) &&
2605f2e8686eSxun ni - Sun Microsystems - Beijing China (iocstatus != MPI2_IOCSTATUS_CONFIG_INVALID_PAGE)) {
2606f2e8686eSxun ni - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN, "mptsas_get_sas_expander_page1 "
2607f2e8686eSxun ni - Sun Microsystems - Beijing China "config: IOCStatus=0x%x, IOCLogInfo=0x%x",
2608f2e8686eSxun ni - Sun Microsystems - Beijing China iocstatus, iocloginfo);
2609f2e8686eSxun ni - Sun Microsystems - Beijing China rval = DDI_FAILURE;
2610f2e8686eSxun ni - Sun Microsystems - Beijing China return (rval);
2611f2e8686eSxun ni - Sun Microsystems - Beijing China }
2612f2e8686eSxun ni - Sun Microsystems - Beijing China page_address = va_arg(ap, uint32_t);
2613f2e8686eSxun ni - Sun Microsystems - Beijing China /*
2614f2e8686eSxun ni - Sun Microsystems - Beijing China * The INVALID_PAGE status is normal if using GET_NEXT_HANDLE and there
2615f2e8686eSxun ni - Sun Microsystems - Beijing China * are no more pages. If everything is OK up to this point but the
2616f2e8686eSxun ni - Sun Microsystems - Beijing China * status is INVALID_PAGE, change rval to FAILURE and quit. Also,
2617f2e8686eSxun ni - Sun Microsystems - Beijing China * signal that device traversal is complete.
2618f2e8686eSxun ni - Sun Microsystems - Beijing China */
2619f2e8686eSxun ni - Sun Microsystems - Beijing China if (iocstatus == MPI2_IOCSTATUS_CONFIG_INVALID_PAGE) {
2620f2e8686eSxun ni - Sun Microsystems - Beijing China if ((page_address & MPI2_SAS_EXPAND_PGAD_FORM_MASK) ==
2621f2e8686eSxun ni - Sun Microsystems - Beijing China MPI2_SAS_EXPAND_PGAD_FORM_GET_NEXT_HNDL) {
2622f2e8686eSxun ni - Sun Microsystems - Beijing China mpt->m_done_traverse_smp = 1;
2623f2e8686eSxun ni - Sun Microsystems - Beijing China }
2624f2e8686eSxun ni - Sun Microsystems - Beijing China rval = DDI_FAILURE;
2625f2e8686eSxun ni - Sun Microsystems - Beijing China return (rval);
2626f2e8686eSxun ni - Sun Microsystems - Beijing China }
2627f2e8686eSxun ni - Sun Microsystems - Beijing China
2628f2e8686eSxun ni - Sun Microsystems - Beijing China invalid_dword_count = va_arg(ap, uint32_t *);
2629f2e8686eSxun ni - Sun Microsystems - Beijing China running_disparity_error_count = va_arg(ap, uint32_t *);
2630f2e8686eSxun ni - Sun Microsystems - Beijing China loss_of_dword_sync_count = va_arg(ap, uint32_t *);
2631f2e8686eSxun ni - Sun Microsystems - Beijing China phy_reset_problem_count = va_arg(ap, uint32_t *);
2632f2e8686eSxun ni - Sun Microsystems - Beijing China
2633f2e8686eSxun ni - Sun Microsystems - Beijing China sasphypage = (pMpi2SasPhyPage1_t)page_memp;
2634f2e8686eSxun ni - Sun Microsystems - Beijing China
2635f2e8686eSxun ni - Sun Microsystems - Beijing China *invalid_dword_count =
2636f2e8686eSxun ni - Sun Microsystems - Beijing China ddi_get32(accessp, &sasphypage->InvalidDwordCount);
2637f2e8686eSxun ni - Sun Microsystems - Beijing China *running_disparity_error_count =
2638f2e8686eSxun ni - Sun Microsystems - Beijing China ddi_get32(accessp, &sasphypage->RunningDisparityErrorCount);
2639f2e8686eSxun ni - Sun Microsystems - Beijing China *loss_of_dword_sync_count =
2640f2e8686eSxun ni - Sun Microsystems - Beijing China ddi_get32(accessp, &sasphypage->LossDwordSynchCount);
2641f2e8686eSxun ni - Sun Microsystems - Beijing China *phy_reset_problem_count =
2642f2e8686eSxun ni - Sun Microsystems - Beijing China ddi_get32(accessp, &sasphypage->PhyResetProblemCount);
2643f2e8686eSxun ni - Sun Microsystems - Beijing China
2644f2e8686eSxun ni - Sun Microsystems - Beijing China return (rval);
2645f2e8686eSxun ni - Sun Microsystems - Beijing China }
2646f2e8686eSxun ni - Sun Microsystems - Beijing China
2647f2e8686eSxun ni - Sun Microsystems - Beijing China /*
2648f2e8686eSxun ni - Sun Microsystems - Beijing China * Request MPI configuration page SAS phy page 0 to get DevHandle, phymask
2649f2e8686eSxun ni - Sun Microsystems - Beijing China * and SAS address.
2650f2e8686eSxun ni - Sun Microsystems - Beijing China */
2651f2e8686eSxun ni - Sun Microsystems - Beijing China int
mptsas_get_sas_phy_page1(mptsas_t * mpt,uint32_t page_address,smhba_info_t * info)2652f2e8686eSxun ni - Sun Microsystems - Beijing China mptsas_get_sas_phy_page1(mptsas_t *mpt, uint32_t page_address,
2653f2e8686eSxun ni - Sun Microsystems - Beijing China smhba_info_t *info)
2654f2e8686eSxun ni - Sun Microsystems - Beijing China {
2655f2e8686eSxun ni - Sun Microsystems - Beijing China int rval = DDI_SUCCESS;
2656f2e8686eSxun ni - Sun Microsystems - Beijing China
2657f2e8686eSxun ni - Sun Microsystems - Beijing China ASSERT(mutex_owned(&mpt->m_mutex));
2658f2e8686eSxun ni - Sun Microsystems - Beijing China
2659f2e8686eSxun ni - Sun Microsystems - Beijing China /*
2660f2e8686eSxun ni - Sun Microsystems - Beijing China * Get the header and config page. reply contains the reply frame,
2661f2e8686eSxun ni - Sun Microsystems - Beijing China * which holds status info for the request.
2662f2e8686eSxun ni - Sun Microsystems - Beijing China */
2663f2e8686eSxun ni - Sun Microsystems - Beijing China rval = mptsas_access_config_page(mpt,
2664f2e8686eSxun ni - Sun Microsystems - Beijing China MPI2_CONFIG_ACTION_PAGE_READ_CURRENT,
2665f2e8686eSxun ni - Sun Microsystems - Beijing China MPI2_CONFIG_EXTPAGETYPE_SAS_PHY, 1, page_address,
2666f2e8686eSxun ni - Sun Microsystems - Beijing China mptsas_sasphypage_1_cb, page_address,
2667f2e8686eSxun ni - Sun Microsystems - Beijing China &info->invalid_dword_count,
2668f2e8686eSxun ni - Sun Microsystems - Beijing China &info->running_disparity_error_count,
2669f2e8686eSxun ni - Sun Microsystems - Beijing China &info->loss_of_dword_sync_count,
2670f2e8686eSxun ni - Sun Microsystems - Beijing China &info->phy_reset_problem_count);
2671f2e8686eSxun ni - Sun Microsystems - Beijing China
2672f2e8686eSxun ni - Sun Microsystems - Beijing China return (rval);
2673f2e8686eSxun ni - Sun Microsystems - Beijing China }
2674f2e8686eSxun ni - Sun Microsystems - Beijing China /*
2675f2e8686eSxun ni - Sun Microsystems - Beijing China * mptsas_get_manufacture_page0
2676f2e8686eSxun ni - Sun Microsystems - Beijing China *
2677f2e8686eSxun ni - Sun Microsystems - Beijing China * This function will retrieve the base
2678f2e8686eSxun ni - Sun Microsystems - Beijing China * Chip name, Board Name,Board Trace number from the adapter.
2679f2e8686eSxun ni - Sun Microsystems - Beijing China * Since this function is only called during the
2680f2e8686eSxun ni - Sun Microsystems - Beijing China * initialization process, use handshaking.
2681f2e8686eSxun ni - Sun Microsystems - Beijing China */
2682f2e8686eSxun ni - Sun Microsystems - Beijing China int
mptsas_get_manufacture_page0(mptsas_t * mpt)2683f2e8686eSxun ni - Sun Microsystems - Beijing China mptsas_get_manufacture_page0(mptsas_t *mpt)
2684f2e8686eSxun ni - Sun Microsystems - Beijing China {
2685f2e8686eSxun ni - Sun Microsystems - Beijing China ddi_dma_attr_t recv_dma_attrs, page_dma_attrs;
2686a9b51062SAda ddi_dma_cookie_t page_cookie;
2687f2e8686eSxun ni - Sun Microsystems - Beijing China ddi_dma_handle_t recv_dma_handle, page_dma_handle;
2688f2e8686eSxun ni - Sun Microsystems - Beijing China ddi_acc_handle_t recv_accessp, page_accessp;
2689f2e8686eSxun ni - Sun Microsystems - Beijing China pMpi2ConfigReply_t configreply;
2690f2e8686eSxun ni - Sun Microsystems - Beijing China caddr_t recv_memp, page_memp;
2691f2e8686eSxun ni - Sun Microsystems - Beijing China int recv_numbytes;
2692f2e8686eSxun ni - Sun Microsystems - Beijing China pMpi2ManufacturingPage0_t m0;
2693f2e8686eSxun ni - Sun Microsystems - Beijing China uint32_t flagslength;
2694f2e8686eSxun ni - Sun Microsystems - Beijing China int rval = DDI_SUCCESS;
2695f2e8686eSxun ni - Sun Microsystems - Beijing China uint_t iocstatus;
2696f2e8686eSxun ni - Sun Microsystems - Beijing China uint8_t i = 0;
2697f7d0d869SDan McDonald boolean_t free_recv = B_FALSE, free_page = B_FALSE;
2698f2e8686eSxun ni - Sun Microsystems - Beijing China
2699f2e8686eSxun ni - Sun Microsystems - Beijing China MPTSAS_DISABLE_INTR(mpt);
2700f2e8686eSxun ni - Sun Microsystems - Beijing China
2701f2e8686eSxun ni - Sun Microsystems - Beijing China if (mptsas_send_config_request_msg(mpt, MPI2_CONFIG_ACTION_PAGE_HEADER,
2702f2e8686eSxun ni - Sun Microsystems - Beijing China MPI2_CONFIG_PAGETYPE_MANUFACTURING, 0, 0, 0, 0, 0, 0)) {
2703f2e8686eSxun ni - Sun Microsystems - Beijing China rval = DDI_FAILURE;
2704f2e8686eSxun ni - Sun Microsystems - Beijing China goto done;
2705f2e8686eSxun ni - Sun Microsystems - Beijing China }
2706f2e8686eSxun ni - Sun Microsystems - Beijing China
2707f2e8686eSxun ni - Sun Microsystems - Beijing China /*
2708f2e8686eSxun ni - Sun Microsystems - Beijing China * dynamically create a customized dma attribute structure
2709f2e8686eSxun ni - Sun Microsystems - Beijing China * that describes the MPT's config reply page request structure.
2710f2e8686eSxun ni - Sun Microsystems - Beijing China */
2711f2e8686eSxun ni - Sun Microsystems - Beijing China recv_dma_attrs = mpt->m_msg_dma_attr;
2712f2e8686eSxun ni - Sun Microsystems - Beijing China recv_dma_attrs.dma_attr_sgllen = 1;
2713f2e8686eSxun ni - Sun Microsystems - Beijing China recv_dma_attrs.dma_attr_granular = (sizeof (MPI2_CONFIG_REPLY));
2714f2e8686eSxun ni - Sun Microsystems - Beijing China
2715a9b51062SAda if (mptsas_dma_addr_create(mpt, recv_dma_attrs, &recv_dma_handle,
2716a9b51062SAda &recv_accessp, &recv_memp, (sizeof (MPI2_CONFIG_REPLY)),
2717a9b51062SAda NULL) == FALSE) {
2718f7d0d869SDan McDonald rval = DDI_FAILURE;
2719f2e8686eSxun ni - Sun Microsystems - Beijing China goto done;
2720f2e8686eSxun ni - Sun Microsystems - Beijing China }
2721f7d0d869SDan McDonald /* Now safe to call mptsas_dma_addr_destroy(recv_dma_handle). */
2722f7d0d869SDan McDonald free_recv = B_TRUE;
2723f7d0d869SDan McDonald
2724f2e8686eSxun ni - Sun Microsystems - Beijing China bzero(recv_memp, sizeof (MPI2_CONFIG_REPLY));
2725f2e8686eSxun ni - Sun Microsystems - Beijing China configreply = (pMpi2ConfigReply_t)recv_memp;
2726f2e8686eSxun ni - Sun Microsystems - Beijing China recv_numbytes = sizeof (MPI2_CONFIG_REPLY);
2727f2e8686eSxun ni - Sun Microsystems - Beijing China
2728f2e8686eSxun ni - Sun Microsystems - Beijing China /*
2729f2e8686eSxun ni - Sun Microsystems - Beijing China * get config reply message
2730f2e8686eSxun ni - Sun Microsystems - Beijing China */
2731f2e8686eSxun ni - Sun Microsystems - Beijing China if (mptsas_get_handshake_msg(mpt, recv_memp, recv_numbytes,
2732f2e8686eSxun ni - Sun Microsystems - Beijing China recv_accessp)) {
2733f2e8686eSxun ni - Sun Microsystems - Beijing China rval = DDI_FAILURE;
2734f2e8686eSxun ni - Sun Microsystems - Beijing China goto done;
2735f2e8686eSxun ni - Sun Microsystems - Beijing China }
2736f2e8686eSxun ni - Sun Microsystems - Beijing China
2737e89016e7SRobert Mustacchi if ((iocstatus = ddi_get16(recv_accessp, &configreply->IOCStatus)) !=
2738e89016e7SRobert Mustacchi 0) {
2739f2e8686eSxun ni - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN, "mptsas_get_manufacture_page5 update: "
2740f2e8686eSxun ni - Sun Microsystems - Beijing China "IOCStatus=0x%x, IOCLogInfo=0x%x", iocstatus,
2741f2e8686eSxun ni - Sun Microsystems - Beijing China ddi_get32(recv_accessp, &configreply->IOCLogInfo));
2742f2e8686eSxun ni - Sun Microsystems - Beijing China goto done;
2743f2e8686eSxun ni - Sun Microsystems - Beijing China }
2744f2e8686eSxun ni - Sun Microsystems - Beijing China
2745f2e8686eSxun ni - Sun Microsystems - Beijing China /*
2746f2e8686eSxun ni - Sun Microsystems - Beijing China * dynamically create a customized dma attribute structure
2747f2e8686eSxun ni - Sun Microsystems - Beijing China * that describes the MPT's config page structure.
2748f2e8686eSxun ni - Sun Microsystems - Beijing China */
2749f2e8686eSxun ni - Sun Microsystems - Beijing China page_dma_attrs = mpt->m_msg_dma_attr;
2750f2e8686eSxun ni - Sun Microsystems - Beijing China page_dma_attrs.dma_attr_sgllen = 1;
2751f2e8686eSxun ni - Sun Microsystems - Beijing China page_dma_attrs.dma_attr_granular = (sizeof (MPI2_CONFIG_PAGE_MAN_0));
2752f2e8686eSxun ni - Sun Microsystems - Beijing China
2753a9b51062SAda if (mptsas_dma_addr_create(mpt, page_dma_attrs, &page_dma_handle,
2754a9b51062SAda &page_accessp, &page_memp, (sizeof (MPI2_CONFIG_PAGE_MAN_0)),
2755a9b51062SAda &page_cookie) == FALSE) {
2756f7d0d869SDan McDonald rval = DDI_FAILURE;
2757f2e8686eSxun ni - Sun Microsystems - Beijing China goto done;
2758f2e8686eSxun ni - Sun Microsystems - Beijing China }
2759f7d0d869SDan McDonald /* Now safe to call mptsas_dma_addr_destroy(page_dma_handle). */
2760f7d0d869SDan McDonald free_page = B_TRUE;
2761f7d0d869SDan McDonald
2762f2e8686eSxun ni - Sun Microsystems - Beijing China bzero(page_memp, sizeof (MPI2_CONFIG_PAGE_MAN_0));
2763f2e8686eSxun ni - Sun Microsystems - Beijing China m0 = (pMpi2ManufacturingPage0_t)page_memp;
2764f2e8686eSxun ni - Sun Microsystems - Beijing China
2765f2e8686eSxun ni - Sun Microsystems - Beijing China /*
2766f2e8686eSxun ni - Sun Microsystems - Beijing China * Give reply address to IOC to store config page in and send
2767f2e8686eSxun ni - Sun Microsystems - Beijing China * config request out.
2768f2e8686eSxun ni - Sun Microsystems - Beijing China */
2769f2e8686eSxun ni - Sun Microsystems - Beijing China
2770f2e8686eSxun ni - Sun Microsystems - Beijing China flagslength = sizeof (MPI2_CONFIG_PAGE_MAN_0);
2771f2e8686eSxun ni - Sun Microsystems - Beijing China flagslength |= ((uint32_t)(MPI2_SGE_FLAGS_LAST_ELEMENT |
2772f2e8686eSxun ni - Sun Microsystems - Beijing China MPI2_SGE_FLAGS_END_OF_BUFFER | MPI2_SGE_FLAGS_SIMPLE_ELEMENT |
2773940efceeSAndy Giles MPI2_SGE_FLAGS_SYSTEM_ADDRESS | MPI2_SGE_FLAGS_64_BIT_ADDRESSING |
2774f2e8686eSxun ni - Sun Microsystems - Beijing China MPI2_SGE_FLAGS_IOC_TO_HOST |
2775f2e8686eSxun ni - Sun Microsystems - Beijing China MPI2_SGE_FLAGS_END_OF_LIST) << MPI2_SGE_FLAGS_SHIFT);
2776f2e8686eSxun ni - Sun Microsystems - Beijing China
2777f2e8686eSxun ni - Sun Microsystems - Beijing China if (mptsas_send_config_request_msg(mpt,
2778f2e8686eSxun ni - Sun Microsystems - Beijing China MPI2_CONFIG_ACTION_PAGE_READ_CURRENT,
2779f2e8686eSxun ni - Sun Microsystems - Beijing China MPI2_CONFIG_PAGETYPE_MANUFACTURING, 0, 0,
2780f2e8686eSxun ni - Sun Microsystems - Beijing China ddi_get8(recv_accessp, &configreply->Header.PageVersion),
2781f2e8686eSxun ni - Sun Microsystems - Beijing China ddi_get8(recv_accessp, &configreply->Header.PageLength),
2782940efceeSAndy Giles flagslength, page_cookie.dmac_laddress)) {
2783f2e8686eSxun ni - Sun Microsystems - Beijing China rval = DDI_FAILURE;
2784f2e8686eSxun ni - Sun Microsystems - Beijing China goto done;
2785f2e8686eSxun ni - Sun Microsystems - Beijing China }
2786f2e8686eSxun ni - Sun Microsystems - Beijing China
2787f2e8686eSxun ni - Sun Microsystems - Beijing China /*
2788f2e8686eSxun ni - Sun Microsystems - Beijing China * get reply view handshake
2789f2e8686eSxun ni - Sun Microsystems - Beijing China */
2790f2e8686eSxun ni - Sun Microsystems - Beijing China if (mptsas_get_handshake_msg(mpt, recv_memp, recv_numbytes,
2791f2e8686eSxun ni - Sun Microsystems - Beijing China recv_accessp)) {
2792f2e8686eSxun ni - Sun Microsystems - Beijing China rval = DDI_FAILURE;
2793f2e8686eSxun ni - Sun Microsystems - Beijing China goto done;
2794f2e8686eSxun ni - Sun Microsystems - Beijing China }
2795f2e8686eSxun ni - Sun Microsystems - Beijing China
2796e89016e7SRobert Mustacchi if ((iocstatus = ddi_get16(recv_accessp, &configreply->IOCStatus)) !=
2797e89016e7SRobert Mustacchi 0) {
2798f2e8686eSxun ni - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN, "mptsas_get_manufacture_page0 config: "
2799f2e8686eSxun ni - Sun Microsystems - Beijing China "IOCStatus=0x%x, IOCLogInfo=0x%x", iocstatus,
2800f2e8686eSxun ni - Sun Microsystems - Beijing China ddi_get32(recv_accessp, &configreply->IOCLogInfo));
2801f2e8686eSxun ni - Sun Microsystems - Beijing China goto done;
2802f2e8686eSxun ni - Sun Microsystems - Beijing China }
2803f2e8686eSxun ni - Sun Microsystems - Beijing China
2804f2e8686eSxun ni - Sun Microsystems - Beijing China (void) ddi_dma_sync(page_dma_handle, 0, 0, DDI_DMA_SYNC_FORCPU);
2805f2e8686eSxun ni - Sun Microsystems - Beijing China
2806f2e8686eSxun ni - Sun Microsystems - Beijing China /*
2807f2e8686eSxun ni - Sun Microsystems - Beijing China * Fusion-MPT stores fields in little-endian format. This is
2808f2e8686eSxun ni - Sun Microsystems - Beijing China * why the low-order 32 bits are stored first.
2809f2e8686eSxun ni - Sun Microsystems - Beijing China */
2810f2e8686eSxun ni - Sun Microsystems - Beijing China
2811f2e8686eSxun ni - Sun Microsystems - Beijing China for (i = 0; i < 16; i++) {
2812f2e8686eSxun ni - Sun Microsystems - Beijing China mpt->m_MANU_page0.ChipName[i] =
2813f2e8686eSxun ni - Sun Microsystems - Beijing China ddi_get8(page_accessp,
2814f2e8686eSxun ni - Sun Microsystems - Beijing China (uint8_t *)(void *)&m0->ChipName[i]);
2815f2e8686eSxun ni - Sun Microsystems - Beijing China }
2816f2e8686eSxun ni - Sun Microsystems - Beijing China
2817f2e8686eSxun ni - Sun Microsystems - Beijing China for (i = 0; i < 8; i++) {
2818f2e8686eSxun ni - Sun Microsystems - Beijing China mpt->m_MANU_page0.ChipRevision[i] =
2819f2e8686eSxun ni - Sun Microsystems - Beijing China ddi_get8(page_accessp,
2820f2e8686eSxun ni - Sun Microsystems - Beijing China (uint8_t *)(void *)&m0->ChipRevision[i]);
2821f2e8686eSxun ni - Sun Microsystems - Beijing China }
2822f2e8686eSxun ni - Sun Microsystems - Beijing China
2823f2e8686eSxun ni - Sun Microsystems - Beijing China for (i = 0; i < 16; i++) {
2824f2e8686eSxun ni - Sun Microsystems - Beijing China mpt->m_MANU_page0.BoardName[i] =
2825f2e8686eSxun ni - Sun Microsystems - Beijing China ddi_get8(page_accessp,
2826f2e8686eSxun ni - Sun Microsystems - Beijing China (uint8_t *)(void *)&m0->BoardName[i]);
2827f2e8686eSxun ni - Sun Microsystems - Beijing China }
2828f2e8686eSxun ni - Sun Microsystems - Beijing China
2829f2e8686eSxun ni - Sun Microsystems - Beijing China for (i = 0; i < 16; i++) {
2830f2e8686eSxun ni - Sun Microsystems - Beijing China mpt->m_MANU_page0.BoardAssembly[i] =
2831f2e8686eSxun ni - Sun Microsystems - Beijing China ddi_get8(page_accessp,
2832f2e8686eSxun ni - Sun Microsystems - Beijing China (uint8_t *)(void *)&m0->BoardAssembly[i]);
2833f2e8686eSxun ni - Sun Microsystems - Beijing China }
2834f2e8686eSxun ni - Sun Microsystems - Beijing China
2835f2e8686eSxun ni - Sun Microsystems - Beijing China for (i = 0; i < 16; i++) {
2836f2e8686eSxun ni - Sun Microsystems - Beijing China mpt->m_MANU_page0.BoardTracerNumber[i] =
2837f2e8686eSxun ni - Sun Microsystems - Beijing China ddi_get8(page_accessp,
2838f2e8686eSxun ni - Sun Microsystems - Beijing China (uint8_t *)(void *)&m0->BoardTracerNumber[i]);
2839f2e8686eSxun ni - Sun Microsystems - Beijing China }
2840f2e8686eSxun ni - Sun Microsystems - Beijing China
2841f2e8686eSxun ni - Sun Microsystems - Beijing China if ((mptsas_check_dma_handle(recv_dma_handle) != DDI_SUCCESS) ||
28425b504601Sjiang wu - Sun Microsystems - Beijing China (mptsas_check_dma_handle(page_dma_handle) != DDI_SUCCESS)) {
28435b504601Sjiang wu - Sun Microsystems - Beijing China ddi_fm_service_impact(mpt->m_dip, DDI_SERVICE_UNAFFECTED);
28445b504601Sjiang wu - Sun Microsystems - Beijing China rval = DDI_FAILURE;
28455b504601Sjiang wu - Sun Microsystems - Beijing China goto done;
28465b504601Sjiang wu - Sun Microsystems - Beijing China }
28475b504601Sjiang wu - Sun Microsystems - Beijing China if ((mptsas_check_acc_handle(recv_accessp) != DDI_SUCCESS) ||
28485b504601Sjiang wu - Sun Microsystems - Beijing China (mptsas_check_acc_handle(page_accessp) != DDI_SUCCESS)) {
28495b504601Sjiang wu - Sun Microsystems - Beijing China ddi_fm_service_impact(mpt->m_dip, DDI_SERVICE_UNAFFECTED);
28505b504601Sjiang wu - Sun Microsystems - Beijing China rval = DDI_FAILURE;
28515b504601Sjiang wu - Sun Microsystems - Beijing China }
28525b504601Sjiang wu - Sun Microsystems - Beijing China done:
28535b504601Sjiang wu - Sun Microsystems - Beijing China /*
28545b504601Sjiang wu - Sun Microsystems - Beijing China * free up memory
28555b504601Sjiang wu - Sun Microsystems - Beijing China */
2856f7d0d869SDan McDonald if (free_recv)
2857f7d0d869SDan McDonald mptsas_dma_addr_destroy(&recv_dma_handle, &recv_accessp);
2858f7d0d869SDan McDonald if (free_page)
2859f7d0d869SDan McDonald mptsas_dma_addr_destroy(&page_dma_handle, &page_accessp);
28605b504601Sjiang wu - Sun Microsystems - Beijing China MPTSAS_ENABLE_INTR(mpt);
28615b504601Sjiang wu - Sun Microsystems - Beijing China
28625b504601Sjiang wu - Sun Microsystems - Beijing China return (rval);
28635b504601Sjiang wu - Sun Microsystems - Beijing China }
286415ada8fcSRobert Mustacchi
286515ada8fcSRobert Mustacchi static int
mptsas_enclosurepage_0_cb(mptsas_t * mpt,caddr_t page_memp,ddi_acc_handle_t accessp,uint16_t iocstatus,uint32_t iocloginfo,va_list ap)286615ada8fcSRobert Mustacchi mptsas_enclosurepage_0_cb(mptsas_t *mpt, caddr_t page_memp,
286715ada8fcSRobert Mustacchi ddi_acc_handle_t accessp, uint16_t iocstatus, uint32_t iocloginfo,
286815ada8fcSRobert Mustacchi va_list ap)
286915ada8fcSRobert Mustacchi {
2870a0ac5a9eSToomas Soome uint32_t page_address;
287115ada8fcSRobert Mustacchi pMpi2SasEnclosurePage0_t encpage, encout;
287215ada8fcSRobert Mustacchi
287315ada8fcSRobert Mustacchi if ((iocstatus != MPI2_IOCSTATUS_SUCCESS) &&
287415ada8fcSRobert Mustacchi (iocstatus != MPI2_IOCSTATUS_CONFIG_INVALID_PAGE)) {
287515ada8fcSRobert Mustacchi mptsas_log(mpt, CE_WARN, "mptsas_get_enclsourepage0 "
287615ada8fcSRobert Mustacchi "header: IOCStatus=0x%x, IOCLogInfo=0x%x",
287715ada8fcSRobert Mustacchi iocstatus, iocloginfo);
287815ada8fcSRobert Mustacchi return (DDI_FAILURE);
287915ada8fcSRobert Mustacchi }
288015ada8fcSRobert Mustacchi
288115ada8fcSRobert Mustacchi page_address = va_arg(ap, uint32_t);
288215ada8fcSRobert Mustacchi encout = va_arg(ap, pMpi2SasEnclosurePage0_t);
288315ada8fcSRobert Mustacchi encpage = (pMpi2SasEnclosurePage0_t)page_memp;
288415ada8fcSRobert Mustacchi
288515ada8fcSRobert Mustacchi /*
288615ada8fcSRobert Mustacchi * The INVALID_PAGE status is normal if using GET_NEXT_HANDLE and there
288715ada8fcSRobert Mustacchi * are no more pages. If everything is OK up to this point but the
288815ada8fcSRobert Mustacchi * status is INVALID_PAGE, change rval to FAILURE and quit. Also,
288915ada8fcSRobert Mustacchi * signal that enclosure traversal is complete.
289015ada8fcSRobert Mustacchi */
289115ada8fcSRobert Mustacchi if (iocstatus == MPI2_IOCSTATUS_CONFIG_INVALID_PAGE) {
289215ada8fcSRobert Mustacchi if ((page_address & MPI2_SAS_DEVICE_PGAD_FORM_MASK) ==
289315ada8fcSRobert Mustacchi MPI2_SAS_DEVICE_PGAD_FORM_GET_NEXT_HANDLE) {
289415ada8fcSRobert Mustacchi mpt->m_done_traverse_enc = 1;
289515ada8fcSRobert Mustacchi }
289615ada8fcSRobert Mustacchi return (DDI_FAILURE);
289715ada8fcSRobert Mustacchi }
289815ada8fcSRobert Mustacchi
289915ada8fcSRobert Mustacchi encout->Header.PageVersion = ddi_get8(accessp,
290015ada8fcSRobert Mustacchi &encpage->Header.PageVersion);
290115ada8fcSRobert Mustacchi encout->Header.PageNumber = ddi_get8(accessp,
290215ada8fcSRobert Mustacchi &encpage->Header.PageNumber);
290315ada8fcSRobert Mustacchi encout->Header.PageType = ddi_get8(accessp, &encpage->Header.PageType);
290415ada8fcSRobert Mustacchi encout->Header.ExtPageLength = ddi_get16(accessp,
290515ada8fcSRobert Mustacchi &encpage->Header.ExtPageLength);
290615ada8fcSRobert Mustacchi encout->Header.ExtPageType = ddi_get8(accessp,
290715ada8fcSRobert Mustacchi &encpage->Header.ExtPageType);
290815ada8fcSRobert Mustacchi
290915ada8fcSRobert Mustacchi encout->EnclosureLogicalID.Low = ddi_get32(accessp,
291015ada8fcSRobert Mustacchi &encpage->EnclosureLogicalID.Low);
291115ada8fcSRobert Mustacchi encout->EnclosureLogicalID.High = ddi_get32(accessp,
291215ada8fcSRobert Mustacchi &encpage->EnclosureLogicalID.High);
291315ada8fcSRobert Mustacchi encout->Flags = ddi_get16(accessp, &encpage->Flags);
291415ada8fcSRobert Mustacchi encout->EnclosureHandle = ddi_get16(accessp, &encpage->EnclosureHandle);
291515ada8fcSRobert Mustacchi encout->NumSlots = ddi_get16(accessp, &encpage->NumSlots);
291615ada8fcSRobert Mustacchi encout->StartSlot = ddi_get16(accessp, &encpage->StartSlot);
291715ada8fcSRobert Mustacchi encout->EnclosureLevel = ddi_get8(accessp, &encpage->EnclosureLevel);
291815ada8fcSRobert Mustacchi encout->SEPDevHandle = ddi_get16(accessp, &encpage->SEPDevHandle);
291915ada8fcSRobert Mustacchi
292015ada8fcSRobert Mustacchi return (DDI_SUCCESS);
292115ada8fcSRobert Mustacchi }
292215ada8fcSRobert Mustacchi
292315ada8fcSRobert Mustacchi /*
292415ada8fcSRobert Mustacchi * Request information about the SES enclosures.
292515ada8fcSRobert Mustacchi */
292615ada8fcSRobert Mustacchi int
mptsas_get_enclosure_page0(mptsas_t * mpt,uint32_t page_address,mptsas_enclosure_t * mep)292715ada8fcSRobert Mustacchi mptsas_get_enclosure_page0(mptsas_t *mpt, uint32_t page_address,
292815ada8fcSRobert Mustacchi mptsas_enclosure_t *mep)
292915ada8fcSRobert Mustacchi {
293015ada8fcSRobert Mustacchi int rval = DDI_SUCCESS;
293115ada8fcSRobert Mustacchi Mpi2SasEnclosurePage0_t encpage;
293215ada8fcSRobert Mustacchi
293315ada8fcSRobert Mustacchi ASSERT(MUTEX_HELD(&mpt->m_mutex));
293415ada8fcSRobert Mustacchi
293515ada8fcSRobert Mustacchi bzero(&encpage, sizeof (encpage));
293615ada8fcSRobert Mustacchi rval = mptsas_access_config_page(mpt,
293715ada8fcSRobert Mustacchi MPI2_CONFIG_ACTION_PAGE_READ_CURRENT,
293815ada8fcSRobert Mustacchi MPI2_CONFIG_EXTPAGETYPE_ENCLOSURE, 0, page_address,
293915ada8fcSRobert Mustacchi mptsas_enclosurepage_0_cb, page_address, &encpage);
294015ada8fcSRobert Mustacchi
294115ada8fcSRobert Mustacchi if (rval == DDI_SUCCESS) {
294215ada8fcSRobert Mustacchi mep->me_enchdl = encpage.EnclosureHandle;
294315ada8fcSRobert Mustacchi mep->me_flags = encpage.Flags;
2944bf62a5c5SRobert Mustacchi mep->me_nslots = encpage.NumSlots;
2945bf62a5c5SRobert Mustacchi mep->me_fslot = encpage.StartSlot;
2946bf62a5c5SRobert Mustacchi mep->me_slotleds = NULL;
294715ada8fcSRobert Mustacchi }
294815ada8fcSRobert Mustacchi
294915ada8fcSRobert Mustacchi return (rval);
295015ada8fcSRobert Mustacchi }
2951