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 /* 235b504601Sjiang wu - Sun Microsystems - Beijing China * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 245b504601Sjiang wu - Sun Microsystems - Beijing China * Use is subject to license terms. 255b504601Sjiang wu - Sun Microsystems - Beijing China */ 265b504601Sjiang wu - Sun Microsystems - Beijing China 275b504601Sjiang wu - Sun Microsystems - Beijing China /* 285b504601Sjiang wu - Sun Microsystems - Beijing China * Copyright (c) 2000 to 2009, LSI Corporation. 295b504601Sjiang wu - Sun Microsystems - Beijing China * All rights reserved. 305b504601Sjiang wu - Sun Microsystems - Beijing China * 315b504601Sjiang wu - Sun Microsystems - Beijing China * Redistribution and use in source and binary forms of all code within 325b504601Sjiang wu - Sun Microsystems - Beijing China * this file that is exclusively owned by LSI, with or without 335b504601Sjiang wu - Sun Microsystems - Beijing China * modification, is permitted provided that, in addition to the CDDL 1.0 345b504601Sjiang wu - Sun Microsystems - Beijing China * License requirements, the following conditions are met: 355b504601Sjiang wu - Sun Microsystems - Beijing China * 365b504601Sjiang wu - Sun Microsystems - Beijing China * Neither the name of the author nor the names of its contributors may be 375b504601Sjiang wu - Sun Microsystems - Beijing China * used to endorse or promote products derived from this software without 385b504601Sjiang wu - Sun Microsystems - Beijing China * specific prior written permission. 395b504601Sjiang wu - Sun Microsystems - Beijing China * 405b504601Sjiang wu - Sun Microsystems - Beijing China * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 415b504601Sjiang wu - Sun Microsystems - Beijing China * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 425b504601Sjiang wu - Sun Microsystems - Beijing China * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 435b504601Sjiang wu - Sun Microsystems - Beijing China * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 445b504601Sjiang wu - Sun Microsystems - Beijing China * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 455b504601Sjiang wu - Sun Microsystems - Beijing China * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 465b504601Sjiang wu - Sun Microsystems - Beijing China * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS 475b504601Sjiang wu - Sun Microsystems - Beijing China * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 485b504601Sjiang wu - Sun Microsystems - Beijing China * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 495b504601Sjiang wu - Sun Microsystems - Beijing China * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 505b504601Sjiang wu - Sun Microsystems - Beijing China * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH 515b504601Sjiang wu - Sun Microsystems - Beijing China * DAMAGE. 525b504601Sjiang wu - Sun Microsystems - Beijing China */ 535b504601Sjiang wu - Sun Microsystems - Beijing China 545b504601Sjiang wu - Sun Microsystems - Beijing China /* 555b504601Sjiang wu - Sun Microsystems - Beijing China * mptsas_impl - This file contains all the basic functions for communicating 565b504601Sjiang wu - Sun Microsystems - Beijing China * to MPT based hardware. 575b504601Sjiang wu - Sun Microsystems - Beijing China */ 585b504601Sjiang wu - Sun Microsystems - Beijing China 595b504601Sjiang wu - Sun Microsystems - Beijing China #if defined(lint) || defined(DEBUG) 605b504601Sjiang wu - Sun Microsystems - Beijing China #define MPTSAS_DEBUG 615b504601Sjiang wu - Sun Microsystems - Beijing China #endif 625b504601Sjiang wu - Sun Microsystems - Beijing China 635b504601Sjiang wu - Sun Microsystems - Beijing China /* 645b504601Sjiang wu - Sun Microsystems - Beijing China * standard header files 655b504601Sjiang wu - Sun Microsystems - Beijing China */ 665b504601Sjiang wu - Sun Microsystems - Beijing China #include <sys/note.h> 675b504601Sjiang wu - Sun Microsystems - Beijing China #include <sys/scsi/scsi.h> 685b504601Sjiang wu - Sun Microsystems - Beijing China #include <sys/pci.h> 695b504601Sjiang wu - Sun Microsystems - Beijing China 705b504601Sjiang wu - Sun Microsystems - Beijing China #pragma pack(1) 715b504601Sjiang wu - Sun Microsystems - Beijing China #include <sys/scsi/adapters/mpt_sas/mpi/mpi2_type.h> 725b504601Sjiang wu - Sun Microsystems - Beijing China #include <sys/scsi/adapters/mpt_sas/mpi/mpi2.h> 735b504601Sjiang wu - Sun Microsystems - Beijing China #include <sys/scsi/adapters/mpt_sas/mpi/mpi2_cnfg.h> 745b504601Sjiang wu - Sun Microsystems - Beijing China #include <sys/scsi/adapters/mpt_sas/mpi/mpi2_init.h> 755b504601Sjiang wu - Sun Microsystems - Beijing China #include <sys/scsi/adapters/mpt_sas/mpi/mpi2_ioc.h> 765b504601Sjiang wu - Sun Microsystems - Beijing China #include <sys/scsi/adapters/mpt_sas/mpi/mpi2_sas.h> 775b504601Sjiang wu - Sun Microsystems - Beijing China #pragma pack() 785b504601Sjiang wu - Sun Microsystems - Beijing China 795b504601Sjiang wu - Sun Microsystems - Beijing China /* 805b504601Sjiang wu - Sun Microsystems - Beijing China * private header files. 815b504601Sjiang wu - Sun Microsystems - Beijing China */ 825b504601Sjiang wu - Sun Microsystems - Beijing China #include <sys/scsi/adapters/mpt_sas/mptsas_var.h> 835b504601Sjiang wu - Sun Microsystems - Beijing China 845b504601Sjiang wu - Sun Microsystems - Beijing China /* 855b504601Sjiang wu - Sun Microsystems - Beijing China * FMA header files. 865b504601Sjiang wu - Sun Microsystems - Beijing China */ 875b504601Sjiang wu - Sun Microsystems - Beijing China #include <sys/fm/io/ddi.h> 885b504601Sjiang wu - Sun Microsystems - Beijing China 895b504601Sjiang wu - Sun Microsystems - Beijing China #if defined(MPTSAS_DEBUG) 905b504601Sjiang wu - Sun Microsystems - Beijing China extern uint32_t mptsas_debug_flags; 915b504601Sjiang wu - Sun Microsystems - Beijing China #endif 925b504601Sjiang wu - Sun Microsystems - Beijing China 935b504601Sjiang wu - Sun Microsystems - Beijing China /* 945b504601Sjiang wu - Sun Microsystems - Beijing China * prototypes 955b504601Sjiang wu - Sun Microsystems - Beijing China */ 965b504601Sjiang wu - Sun Microsystems - Beijing China static void mptsas_ioc_event_cmdq_add(mptsas_t *mpt, m_event_struct_t *cmd); 975b504601Sjiang wu - Sun Microsystems - Beijing China static void mptsas_ioc_event_cmdq_delete(mptsas_t *mpt, m_event_struct_t *cmd); 985b504601Sjiang wu - Sun Microsystems - Beijing China static m_event_struct_t *mptsas_ioc_event_find_by_cmd(mptsas_t *mpt, 995b504601Sjiang wu - Sun Microsystems - Beijing China struct mptsas_cmd *cmd); 1005b504601Sjiang wu - Sun Microsystems - Beijing China 1015b504601Sjiang wu - Sun Microsystems - Beijing China /* 1025b504601Sjiang wu - Sun Microsystems - Beijing China * add ioc evnet cmd into the queue 1035b504601Sjiang wu - Sun Microsystems - Beijing China */ 1045b504601Sjiang wu - Sun Microsystems - Beijing China static void 1055b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_ioc_event_cmdq_add(mptsas_t *mpt, m_event_struct_t *cmd) 1065b504601Sjiang wu - Sun Microsystems - Beijing China { 1075b504601Sjiang wu - Sun Microsystems - Beijing China if ((cmd->m_event_linkp = mpt->m_ioc_event_cmdq) == NULL) { 1085b504601Sjiang wu - Sun Microsystems - Beijing China mpt->m_ioc_event_cmdtail = &cmd->m_event_linkp; 1095b504601Sjiang wu - Sun Microsystems - Beijing China mpt->m_ioc_event_cmdq = cmd; 1105b504601Sjiang wu - Sun Microsystems - Beijing China } else { 1115b504601Sjiang wu - Sun Microsystems - Beijing China cmd->m_event_linkp = NULL; 1125b504601Sjiang wu - Sun Microsystems - Beijing China *(mpt->m_ioc_event_cmdtail) = cmd; 1135b504601Sjiang wu - Sun Microsystems - Beijing China mpt->m_ioc_event_cmdtail = &cmd->m_event_linkp; 1145b504601Sjiang wu - Sun Microsystems - Beijing China } 1155b504601Sjiang wu - Sun Microsystems - Beijing China } 1165b504601Sjiang wu - Sun Microsystems - Beijing China 1175b504601Sjiang wu - Sun Microsystems - Beijing China /* 1185b504601Sjiang wu - Sun Microsystems - Beijing China * remove specified cmd from the ioc event queue 1195b504601Sjiang wu - Sun Microsystems - Beijing China */ 1205b504601Sjiang wu - Sun Microsystems - Beijing China static void 1215b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_ioc_event_cmdq_delete(mptsas_t *mpt, m_event_struct_t *cmd) 1225b504601Sjiang wu - Sun Microsystems - Beijing China { 1235b504601Sjiang wu - Sun Microsystems - Beijing China m_event_struct_t *prev = mpt->m_ioc_event_cmdq; 1245b504601Sjiang wu - Sun Microsystems - Beijing China if (prev == cmd) { 1255b504601Sjiang wu - Sun Microsystems - Beijing China if ((mpt->m_ioc_event_cmdq = cmd->m_event_linkp) == NULL) { 1265b504601Sjiang wu - Sun Microsystems - Beijing China mpt->m_ioc_event_cmdtail = &mpt->m_ioc_event_cmdq; 1275b504601Sjiang wu - Sun Microsystems - Beijing China } 1285b504601Sjiang wu - Sun Microsystems - Beijing China cmd->m_event_linkp = NULL; 1295b504601Sjiang wu - Sun Microsystems - Beijing China return; 1305b504601Sjiang wu - Sun Microsystems - Beijing China } 1315b504601Sjiang wu - Sun Microsystems - Beijing China while (prev != NULL) { 1325b504601Sjiang wu - Sun Microsystems - Beijing China if (prev->m_event_linkp == cmd) { 1335b504601Sjiang wu - Sun Microsystems - Beijing China prev->m_event_linkp = cmd->m_event_linkp; 1345b504601Sjiang wu - Sun Microsystems - Beijing China if (cmd->m_event_linkp == NULL) { 1355b504601Sjiang wu - Sun Microsystems - Beijing China mpt->m_ioc_event_cmdtail = &prev->m_event_linkp; 1365b504601Sjiang wu - Sun Microsystems - Beijing China } 1375b504601Sjiang wu - Sun Microsystems - Beijing China 1385b504601Sjiang wu - Sun Microsystems - Beijing China cmd->m_event_linkp = NULL; 1395b504601Sjiang wu - Sun Microsystems - Beijing China return; 1405b504601Sjiang wu - Sun Microsystems - Beijing China } 1415b504601Sjiang wu - Sun Microsystems - Beijing China prev = prev->m_event_linkp; 1425b504601Sjiang wu - Sun Microsystems - Beijing China } 1435b504601Sjiang wu - Sun Microsystems - Beijing China } 1445b504601Sjiang wu - Sun Microsystems - Beijing China 1455b504601Sjiang wu - Sun Microsystems - Beijing China static m_event_struct_t * 1465b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_ioc_event_find_by_cmd(mptsas_t *mpt, struct mptsas_cmd *cmd) 1475b504601Sjiang wu - Sun Microsystems - Beijing China { 1485b504601Sjiang wu - Sun Microsystems - Beijing China m_event_struct_t *ioc_cmd = NULL; 1495b504601Sjiang wu - Sun Microsystems - Beijing China 1505b504601Sjiang wu - Sun Microsystems - Beijing China ioc_cmd = mpt->m_ioc_event_cmdq; 1515b504601Sjiang wu - Sun Microsystems - Beijing China while (ioc_cmd != NULL) { 1525b504601Sjiang wu - Sun Microsystems - Beijing China if (&(ioc_cmd->m_event_cmd) == cmd) { 1535b504601Sjiang wu - Sun Microsystems - Beijing China return (ioc_cmd); 1545b504601Sjiang wu - Sun Microsystems - Beijing China } 1555b504601Sjiang wu - Sun Microsystems - Beijing China ioc_cmd = ioc_cmd->m_event_linkp; 1565b504601Sjiang wu - Sun Microsystems - Beijing China } 1575b504601Sjiang wu - Sun Microsystems - Beijing China ioc_cmd = NULL; 1585b504601Sjiang wu - Sun Microsystems - Beijing China return (ioc_cmd); 1595b504601Sjiang wu - Sun Microsystems - Beijing China } 1605b504601Sjiang wu - Sun Microsystems - Beijing China 1615b504601Sjiang wu - Sun Microsystems - Beijing China void 1625b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_destroy_ioc_event_cmd(mptsas_t *mpt) 1635b504601Sjiang wu - Sun Microsystems - Beijing China { 1645b504601Sjiang wu - Sun Microsystems - Beijing China m_event_struct_t *ioc_cmd = NULL; 1655b504601Sjiang wu - Sun Microsystems - Beijing China m_event_struct_t *ioc_cmd_tmp = NULL; 1665b504601Sjiang wu - Sun Microsystems - Beijing China ioc_cmd = mpt->m_ioc_event_cmdq; 1675b504601Sjiang wu - Sun Microsystems - Beijing China 1685b504601Sjiang wu - Sun Microsystems - Beijing China /* 1695b504601Sjiang wu - Sun Microsystems - Beijing China * because the IOC event queue is resource of per instance for driver, 1705b504601Sjiang wu - Sun Microsystems - Beijing China * it's not only ACK event commands used it, but also some others used 1715b504601Sjiang wu - Sun Microsystems - Beijing China * it. We need destroy all ACK event commands when IOC reset, but can't 1725b504601Sjiang wu - Sun Microsystems - Beijing China * disturb others.So we use filter to clear the ACK event cmd in ioc 1735b504601Sjiang wu - Sun Microsystems - Beijing China * event queue, and other requests should be reserved, and they would 1745b504601Sjiang wu - Sun Microsystems - Beijing China * be free by its owner. 1755b504601Sjiang wu - Sun Microsystems - Beijing China */ 1765b504601Sjiang wu - Sun Microsystems - Beijing China while (ioc_cmd != NULL) { 1775b504601Sjiang wu - Sun Microsystems - Beijing China if (ioc_cmd->m_event_cmd.cmd_flags & CFLAG_CMDACK) { 1785b504601Sjiang wu - Sun Microsystems - Beijing China NDBG20(("destroy!! remove Ack Flag ioc_cmd\n")); 1795b504601Sjiang wu - Sun Microsystems - Beijing China if ((mpt->m_ioc_event_cmdq = 1805b504601Sjiang wu - Sun Microsystems - Beijing China ioc_cmd->m_event_linkp) == NULL) 1815b504601Sjiang wu - Sun Microsystems - Beijing China mpt->m_ioc_event_cmdtail = 1825b504601Sjiang wu - Sun Microsystems - Beijing China &mpt->m_ioc_event_cmdq; 1835b504601Sjiang wu - Sun Microsystems - Beijing China ioc_cmd_tmp = ioc_cmd; 1845b504601Sjiang wu - Sun Microsystems - Beijing China ioc_cmd = ioc_cmd->m_event_linkp; 1855b504601Sjiang wu - Sun Microsystems - Beijing China kmem_free(ioc_cmd_tmp, M_EVENT_STRUCT_SIZE); 1865b504601Sjiang wu - Sun Microsystems - Beijing China } else { 1875b504601Sjiang wu - Sun Microsystems - Beijing China /* 1885b504601Sjiang wu - Sun Microsystems - Beijing China * it's not ack cmd, so continue to check next one 1895b504601Sjiang wu - Sun Microsystems - Beijing China */ 1905b504601Sjiang wu - Sun Microsystems - Beijing China 1915b504601Sjiang wu - Sun Microsystems - Beijing China NDBG20(("destroy!! it's not Ack Flag, continue\n")); 1925b504601Sjiang wu - Sun Microsystems - Beijing China ioc_cmd = ioc_cmd->m_event_linkp; 1935b504601Sjiang wu - Sun Microsystems - Beijing China } 1945b504601Sjiang wu - Sun Microsystems - Beijing China 1955b504601Sjiang wu - Sun Microsystems - Beijing China } 1965b504601Sjiang wu - Sun Microsystems - Beijing China } 1975b504601Sjiang wu - Sun Microsystems - Beijing China 1985b504601Sjiang wu - Sun Microsystems - Beijing China void 1995b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_start_config_page_access(mptsas_t *mpt, mptsas_cmd_t *cmd) 2005b504601Sjiang wu - Sun Microsystems - Beijing China { 2015b504601Sjiang wu - Sun Microsystems - Beijing China pMpi2ConfigRequest_t request; 2025b504601Sjiang wu - Sun Microsystems - Beijing China pMpi2SGESimple64_t sge; 2035b504601Sjiang wu - Sun Microsystems - Beijing China struct scsi_pkt *pkt = cmd->cmd_pkt; 2045b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_config_request_t *config = pkt->pkt_ha_private; 2055b504601Sjiang wu - Sun Microsystems - Beijing China uint8_t direction; 2065b504601Sjiang wu - Sun Microsystems - Beijing China uint32_t length, flagslength, request_desc_low; 2075b504601Sjiang wu - Sun Microsystems - Beijing China 2085b504601Sjiang wu - Sun Microsystems - Beijing China ASSERT(mutex_owned(&mpt->m_mutex)); 2095b504601Sjiang wu - Sun Microsystems - Beijing China 2105b504601Sjiang wu - Sun Microsystems - Beijing China /* 2115b504601Sjiang wu - Sun Microsystems - Beijing China * Point to the correct message and clear it as well as the global 2125b504601Sjiang wu - Sun Microsystems - Beijing China * config page memory. 2135b504601Sjiang wu - Sun Microsystems - Beijing China */ 2145b504601Sjiang wu - Sun Microsystems - Beijing China request = (pMpi2ConfigRequest_t)(mpt->m_req_frame + 2155b504601Sjiang wu - Sun Microsystems - Beijing China (mpt->m_req_frame_size * cmd->cmd_slot)); 2165b504601Sjiang wu - Sun Microsystems - Beijing China bzero(request, mpt->m_req_frame_size); 2175b504601Sjiang wu - Sun Microsystems - Beijing China 2185b504601Sjiang wu - Sun Microsystems - Beijing China /* 2195b504601Sjiang wu - Sun Microsystems - Beijing China * Form the request message. 2205b504601Sjiang wu - Sun Microsystems - Beijing China */ 2215b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put8(mpt->m_acc_req_frame_hdl, &request->Function, 2225b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_FUNCTION_CONFIG); 2235b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put8(mpt->m_acc_req_frame_hdl, &request->Action, config->action); 2245b504601Sjiang wu - Sun Microsystems - Beijing China direction = MPI2_SGE_FLAGS_IOC_TO_HOST; 2255b504601Sjiang wu - Sun Microsystems - Beijing China length = 0; 2265b504601Sjiang wu - Sun Microsystems - Beijing China sge = (pMpi2SGESimple64_t)&request->PageBufferSGE; 2275b504601Sjiang wu - Sun Microsystems - Beijing China if (config->action == MPI2_CONFIG_ACTION_PAGE_HEADER) { 2285b504601Sjiang wu - Sun Microsystems - Beijing China if (config->page_type > MPI2_CONFIG_PAGETYPE_MASK) { 2295b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put8(mpt->m_acc_req_frame_hdl, 2305b504601Sjiang wu - Sun Microsystems - Beijing China &request->Header.PageType, 2315b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_CONFIG_PAGETYPE_EXTENDED); 2325b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put8(mpt->m_acc_req_frame_hdl, 2335b504601Sjiang wu - Sun Microsystems - Beijing China &request->ExtPageType, config->page_type); 2345b504601Sjiang wu - Sun Microsystems - Beijing China } else { 2355b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put8(mpt->m_acc_req_frame_hdl, 2365b504601Sjiang wu - Sun Microsystems - Beijing China &request->Header.PageType, config->page_type); 2375b504601Sjiang wu - Sun Microsystems - Beijing China } 2385b504601Sjiang wu - Sun Microsystems - Beijing China } else { 2395b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put8(mpt->m_acc_req_frame_hdl, &request->ExtPageType, 2405b504601Sjiang wu - Sun Microsystems - Beijing China config->ext_page_type); 2415b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put16(mpt->m_acc_req_frame_hdl, &request->ExtPageLength, 2425b504601Sjiang wu - Sun Microsystems - Beijing China config->ext_page_length); 2435b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put8(mpt->m_acc_req_frame_hdl, &request->Header.PageType, 2445b504601Sjiang wu - Sun Microsystems - Beijing China config->page_type); 2455b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put8(mpt->m_acc_req_frame_hdl, &request->Header.PageLength, 2465b504601Sjiang wu - Sun Microsystems - Beijing China config->page_length); 2475b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put8(mpt->m_acc_req_frame_hdl, 2485b504601Sjiang wu - Sun Microsystems - Beijing China &request->Header.PageVersion, config->page_version); 2495b504601Sjiang wu - Sun Microsystems - Beijing China if ((config->page_type & MPI2_CONFIG_PAGETYPE_MASK) == 2505b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_CONFIG_PAGETYPE_EXTENDED) { 2515b504601Sjiang wu - Sun Microsystems - Beijing China length = config->ext_page_length * 4; 2525b504601Sjiang wu - Sun Microsystems - Beijing China } else { 2535b504601Sjiang wu - Sun Microsystems - Beijing China length = config->page_length * 4; 2545b504601Sjiang wu - Sun Microsystems - Beijing China } 2555b504601Sjiang wu - Sun Microsystems - Beijing China 2565b504601Sjiang wu - Sun Microsystems - Beijing China if (config->action == MPI2_CONFIG_ACTION_PAGE_WRITE_NVRAM) { 2575b504601Sjiang wu - Sun Microsystems - Beijing China direction = MPI2_SGE_FLAGS_HOST_TO_IOC; 2585b504601Sjiang wu - Sun Microsystems - Beijing China } 2595b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put32(mpt->m_acc_req_frame_hdl, &sge->Address.Low, 2605b504601Sjiang wu - Sun Microsystems - Beijing China (uint32_t)cmd->cmd_dma_addr); 2615b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put32(mpt->m_acc_req_frame_hdl, &sge->Address.High, 2625b504601Sjiang wu - Sun Microsystems - Beijing China (uint32_t)(cmd->cmd_dma_addr >> 32)); 2635b504601Sjiang wu - Sun Microsystems - Beijing China } 2645b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put8(mpt->m_acc_req_frame_hdl, &request->Header.PageNumber, 2655b504601Sjiang wu - Sun Microsystems - Beijing China config->page_number); 2665b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put32(mpt->m_acc_req_frame_hdl, &request->PageAddress, 2675b504601Sjiang wu - Sun Microsystems - Beijing China config->page_address); 2685b504601Sjiang wu - Sun Microsystems - Beijing China flagslength = ((uint32_t)(MPI2_SGE_FLAGS_LAST_ELEMENT | 2695b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_SGE_FLAGS_END_OF_BUFFER | 2705b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_SGE_FLAGS_SIMPLE_ELEMENT | 2715b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_SGE_FLAGS_SYSTEM_ADDRESS | 2725b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_SGE_FLAGS_64_BIT_ADDRESSING | 2735b504601Sjiang wu - Sun Microsystems - Beijing China direction | 2745b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_SGE_FLAGS_END_OF_LIST) << MPI2_SGE_FLAGS_SHIFT); 2755b504601Sjiang wu - Sun Microsystems - Beijing China flagslength |= length; 2765b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put32(mpt->m_acc_req_frame_hdl, &sge->FlagsLength, flagslength); 2775b504601Sjiang wu - Sun Microsystems - Beijing China 2785b504601Sjiang wu - Sun Microsystems - Beijing China (void) ddi_dma_sync(mpt->m_dma_req_frame_hdl, 0, 0, 2795b504601Sjiang wu - Sun Microsystems - Beijing China DDI_DMA_SYNC_FORDEV); 2805b504601Sjiang wu - Sun Microsystems - Beijing China request_desc_low = (cmd->cmd_slot << 16) + 2815b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_REQ_DESCRIPT_FLAGS_DEFAULT_TYPE; 2825b504601Sjiang wu - Sun Microsystems - Beijing China cmd->cmd_rfm = NULL; 2835b504601Sjiang wu - Sun Microsystems - Beijing China MPTSAS_START_CMD(mpt, request_desc_low, 0); 2845b504601Sjiang wu - Sun Microsystems - Beijing China if ((mptsas_check_dma_handle(mpt->m_dma_req_frame_hdl) != 2855b504601Sjiang wu - Sun Microsystems - Beijing China DDI_SUCCESS) || 2865b504601Sjiang wu - Sun Microsystems - Beijing China (mptsas_check_acc_handle(mpt->m_acc_req_frame_hdl) != 2875b504601Sjiang wu - Sun Microsystems - Beijing China DDI_SUCCESS)) { 2885b504601Sjiang wu - Sun Microsystems - Beijing China ddi_fm_service_impact(mpt->m_dip, DDI_SERVICE_UNAFFECTED); 2895b504601Sjiang wu - Sun Microsystems - Beijing China } 2905b504601Sjiang wu - Sun Microsystems - Beijing China } 2915b504601Sjiang wu - Sun Microsystems - Beijing China 2925b504601Sjiang wu - Sun Microsystems - Beijing China int 2935b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_access_config_page(mptsas_t *mpt, uint8_t action, uint8_t page_type, 2945b504601Sjiang wu - Sun Microsystems - Beijing China uint8_t page_number, uint32_t page_address, int (*callback) (mptsas_t *, 2955b504601Sjiang wu - Sun Microsystems - Beijing China caddr_t, ddi_acc_handle_t, uint16_t, uint32_t, va_list), ...) 2965b504601Sjiang wu - Sun Microsystems - Beijing China { 2975b504601Sjiang wu - Sun Microsystems - Beijing China va_list ap; 2985b504601Sjiang wu - Sun Microsystems - Beijing China ddi_dma_attr_t attrs; 2995b504601Sjiang wu - Sun Microsystems - Beijing China uint_t ncookie; 3005b504601Sjiang wu - Sun Microsystems - Beijing China ddi_dma_cookie_t cookie; 3015b504601Sjiang wu - Sun Microsystems - Beijing China ddi_acc_handle_t accessp; 3025b504601Sjiang wu - Sun Microsystems - Beijing China size_t len = 0, alloc_len; 3035b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_config_request_t config; 3045b504601Sjiang wu - Sun Microsystems - Beijing China int rval = DDI_SUCCESS, config_flags = 0; 3055b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_cmd_t *cmd; 3065b504601Sjiang wu - Sun Microsystems - Beijing China struct scsi_pkt *pkt; 3075b504601Sjiang wu - Sun Microsystems - Beijing China pMpi2ConfigReply_t reply; 3085b504601Sjiang wu - Sun Microsystems - Beijing China uint16_t iocstatus = 0; 3095b504601Sjiang wu - Sun Microsystems - Beijing China uint32_t iocloginfo; 3105b504601Sjiang wu - Sun Microsystems - Beijing China caddr_t page_memp; 3115b504601Sjiang wu - Sun Microsystems - Beijing China 3125b504601Sjiang wu - Sun Microsystems - Beijing China va_start(ap, callback); 3135b504601Sjiang wu - Sun Microsystems - Beijing China ASSERT(mutex_owned(&mpt->m_mutex)); 3145b504601Sjiang wu - Sun Microsystems - Beijing China 3155b504601Sjiang wu - Sun Microsystems - Beijing China /* 3165b504601Sjiang wu - Sun Microsystems - Beijing China * Get a command from the pool. 3175b504601Sjiang wu - Sun Microsystems - Beijing China */ 3185b504601Sjiang wu - Sun Microsystems - Beijing China if ((rval = (mptsas_request_from_pool(mpt, &cmd, &pkt))) == -1) { 3195b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_log(mpt, CE_NOTE, "command pool is full for config " 3205b504601Sjiang wu - Sun Microsystems - Beijing China "page request"); 3215b504601Sjiang wu - Sun Microsystems - Beijing China rval = DDI_FAILURE; 3225b504601Sjiang wu - Sun Microsystems - Beijing China goto page_done; 3235b504601Sjiang wu - Sun Microsystems - Beijing China } 3245b504601Sjiang wu - Sun Microsystems - Beijing China config_flags |= MPTSAS_REQUEST_POOL_CMD; 3255b504601Sjiang wu - Sun Microsystems - Beijing China 3265b504601Sjiang wu - Sun Microsystems - Beijing China bzero((caddr_t)cmd, sizeof (*cmd)); 3275b504601Sjiang wu - Sun Microsystems - Beijing China bzero((caddr_t)pkt, scsi_pkt_size()); 3285b504601Sjiang wu - Sun Microsystems - Beijing China bzero((caddr_t)&config, sizeof (config)); 3295b504601Sjiang wu - Sun Microsystems - Beijing China 3305b504601Sjiang wu - Sun Microsystems - Beijing China /* 3315b504601Sjiang wu - Sun Microsystems - Beijing China * Save the data for this request to be used in the call to start the 3325b504601Sjiang wu - Sun Microsystems - Beijing China * config header request. 3335b504601Sjiang wu - Sun Microsystems - Beijing China */ 3345b504601Sjiang wu - Sun Microsystems - Beijing China config.action = MPI2_CONFIG_ACTION_PAGE_HEADER; 3355b504601Sjiang wu - Sun Microsystems - Beijing China config.page_type = page_type; 3365b504601Sjiang wu - Sun Microsystems - Beijing China config.page_number = page_number; 3375b504601Sjiang wu - Sun Microsystems - Beijing China config.page_address = page_address; 3385b504601Sjiang wu - Sun Microsystems - Beijing China 3395b504601Sjiang wu - Sun Microsystems - Beijing China /* 3405b504601Sjiang wu - Sun Microsystems - Beijing China * Form a blank cmd/pkt to store the acknowledgement message 3415b504601Sjiang wu - Sun Microsystems - Beijing China */ 3425b504601Sjiang wu - Sun Microsystems - Beijing China pkt->pkt_ha_private = (opaque_t)&config; 3435b504601Sjiang wu - Sun Microsystems - Beijing China pkt->pkt_flags = FLAG_HEAD; 3445b504601Sjiang wu - Sun Microsystems - Beijing China pkt->pkt_time = 60; 3455b504601Sjiang wu - Sun Microsystems - Beijing China cmd->cmd_pkt = pkt; 3465b504601Sjiang wu - Sun Microsystems - Beijing China cmd->cmd_flags = CFLAG_CMDIOC | CFLAG_CONFIG; 3475b504601Sjiang wu - Sun Microsystems - Beijing China 3485b504601Sjiang wu - Sun Microsystems - Beijing China /* 3495b504601Sjiang wu - Sun Microsystems - Beijing China * Save the config header request message in a slot. 3505b504601Sjiang wu - Sun Microsystems - Beijing China */ 3515b504601Sjiang wu - Sun Microsystems - Beijing China if (mptsas_save_cmd(mpt, cmd) == TRUE) { 3525b504601Sjiang wu - Sun Microsystems - Beijing China cmd->cmd_flags |= CFLAG_PREPARED; 3535b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_start_config_page_access(mpt, cmd); 3545b504601Sjiang wu - Sun Microsystems - Beijing China } else { 3555b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_waitq_add(mpt, cmd); 3565b504601Sjiang wu - Sun Microsystems - Beijing China } 3575b504601Sjiang wu - Sun Microsystems - Beijing China 3585b504601Sjiang wu - Sun Microsystems - Beijing China /* 3595b504601Sjiang wu - Sun Microsystems - Beijing China * Wait for the command to complete or timeout. 3605b504601Sjiang wu - Sun Microsystems - Beijing China */ 3615b504601Sjiang wu - Sun Microsystems - Beijing China while ((cmd->cmd_flags & CFLAG_FINISHED) == 0) { 3625b504601Sjiang wu - Sun Microsystems - Beijing China cv_wait(&mpt->m_config_cv, &mpt->m_mutex); 3635b504601Sjiang wu - Sun Microsystems - Beijing China } 3645b504601Sjiang wu - Sun Microsystems - Beijing China 3655b504601Sjiang wu - Sun Microsystems - Beijing China /* 3665b504601Sjiang wu - Sun Microsystems - Beijing China * Check if the header request completed without timing out 3675b504601Sjiang wu - Sun Microsystems - Beijing China */ 3685b504601Sjiang wu - Sun Microsystems - Beijing China if (cmd->cmd_flags & CFLAG_TIMEOUT) { 3695b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN, "config header request timeout"); 3705b504601Sjiang wu - Sun Microsystems - Beijing China rval = DDI_FAILURE; 3715b504601Sjiang wu - Sun Microsystems - Beijing China goto page_done; 3725b504601Sjiang wu - Sun Microsystems - Beijing China } 3735b504601Sjiang wu - Sun Microsystems - Beijing China 3745b504601Sjiang wu - Sun Microsystems - Beijing China /* 3755b504601Sjiang wu - Sun Microsystems - Beijing China * cmd_rfm points to the reply message if a reply was given. Check the 3765b504601Sjiang wu - Sun Microsystems - Beijing China * IOCStatus to make sure everything went OK with the header request. 3775b504601Sjiang wu - Sun Microsystems - Beijing China */ 3785b504601Sjiang wu - Sun Microsystems - Beijing China if (cmd->cmd_rfm) { 3795b504601Sjiang wu - Sun Microsystems - Beijing China config_flags |= MPTSAS_ADDRESS_REPLY; 3805b504601Sjiang wu - Sun Microsystems - Beijing China (void) ddi_dma_sync(mpt->m_dma_reply_frame_hdl, 0, 0, 3815b504601Sjiang wu - Sun Microsystems - Beijing China DDI_DMA_SYNC_FORCPU); 3825b504601Sjiang wu - Sun Microsystems - Beijing China reply = (pMpi2ConfigReply_t)(mpt->m_reply_frame + (cmd->cmd_rfm 3835b504601Sjiang wu - Sun Microsystems - Beijing China - mpt->m_reply_frame_dma_addr)); 3845b504601Sjiang wu - Sun Microsystems - Beijing China config.page_type = ddi_get8(mpt->m_acc_reply_frame_hdl, 3855b504601Sjiang wu - Sun Microsystems - Beijing China &reply->Header.PageType); 3865b504601Sjiang wu - Sun Microsystems - Beijing China config.page_number = ddi_get8(mpt->m_acc_reply_frame_hdl, 3875b504601Sjiang wu - Sun Microsystems - Beijing China &reply->Header.PageNumber); 3885b504601Sjiang wu - Sun Microsystems - Beijing China config.page_length = ddi_get8(mpt->m_acc_reply_frame_hdl, 3895b504601Sjiang wu - Sun Microsystems - Beijing China &reply->Header.PageLength); 3905b504601Sjiang wu - Sun Microsystems - Beijing China config.page_version = ddi_get8(mpt->m_acc_reply_frame_hdl, 3915b504601Sjiang wu - Sun Microsystems - Beijing China &reply->Header.PageVersion); 3925b504601Sjiang wu - Sun Microsystems - Beijing China config.ext_page_type = ddi_get8(mpt->m_acc_reply_frame_hdl, 3935b504601Sjiang wu - Sun Microsystems - Beijing China &reply->ExtPageType); 3945b504601Sjiang wu - Sun Microsystems - Beijing China config.ext_page_length = ddi_get16(mpt->m_acc_reply_frame_hdl, 3955b504601Sjiang wu - Sun Microsystems - Beijing China &reply->ExtPageLength); 3965b504601Sjiang wu - Sun Microsystems - Beijing China 3975b504601Sjiang wu - Sun Microsystems - Beijing China iocstatus = ddi_get16(mpt->m_acc_reply_frame_hdl, 3985b504601Sjiang wu - Sun Microsystems - Beijing China &reply->IOCStatus); 3995b504601Sjiang wu - Sun Microsystems - Beijing China iocloginfo = ddi_get32(mpt->m_acc_reply_frame_hdl, 4005b504601Sjiang wu - Sun Microsystems - Beijing China &reply->IOCLogInfo); 4015b504601Sjiang wu - Sun Microsystems - Beijing China 4025b504601Sjiang wu - Sun Microsystems - Beijing China if (iocstatus) { 4035b504601Sjiang wu - Sun Microsystems - Beijing China NDBG13(("mptsas_access_config_page header: " 4045b504601Sjiang wu - Sun Microsystems - Beijing China "IOCStatus=0x%x, IOCLogInfo=0x%x", iocstatus, 4055b504601Sjiang wu - Sun Microsystems - Beijing China iocloginfo)); 4065b504601Sjiang wu - Sun Microsystems - Beijing China rval = DDI_FAILURE; 4075b504601Sjiang wu - Sun Microsystems - Beijing China goto page_done; 4085b504601Sjiang wu - Sun Microsystems - Beijing China } 4095b504601Sjiang wu - Sun Microsystems - Beijing China 4105b504601Sjiang wu - Sun Microsystems - Beijing China if ((config.page_type & MPI2_CONFIG_PAGETYPE_MASK) == 4115b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_CONFIG_PAGETYPE_EXTENDED) 4125b504601Sjiang wu - Sun Microsystems - Beijing China len = (config.ext_page_length * 4); 4135b504601Sjiang wu - Sun Microsystems - Beijing China else 4145b504601Sjiang wu - Sun Microsystems - Beijing China len = (config.page_length * 4); 4155b504601Sjiang wu - Sun Microsystems - Beijing China 4165b504601Sjiang wu - Sun Microsystems - Beijing China } 4175b504601Sjiang wu - Sun Microsystems - Beijing China 4185b504601Sjiang wu - Sun Microsystems - Beijing China if (pkt->pkt_reason == CMD_RESET) { 4195b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN, "ioc reset abort config header " 4205b504601Sjiang wu - Sun Microsystems - Beijing China "request"); 4215b504601Sjiang wu - Sun Microsystems - Beijing China rval = DDI_FAILURE; 4225b504601Sjiang wu - Sun Microsystems - Beijing China goto page_done; 4235b504601Sjiang wu - Sun Microsystems - Beijing China } 4245b504601Sjiang wu - Sun Microsystems - Beijing China 4255b504601Sjiang wu - Sun Microsystems - Beijing China /* 4265b504601Sjiang wu - Sun Microsystems - Beijing China * Put the reply frame back on the free queue, increment the free 4275b504601Sjiang wu - Sun Microsystems - Beijing China * index, and write the new index to the free index register. But only 4285b504601Sjiang wu - Sun Microsystems - Beijing China * if this reply is an ADDRESS reply. 4295b504601Sjiang wu - Sun Microsystems - Beijing China */ 4305b504601Sjiang wu - Sun Microsystems - Beijing China if (config_flags & MPTSAS_ADDRESS_REPLY) { 4315b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put32(mpt->m_acc_free_queue_hdl, 432*08eb0b82SYong-Feng Du &((uint32_t *)(void *)mpt->m_free_queue)[mpt->m_free_index], 4335b504601Sjiang wu - Sun Microsystems - Beijing China cmd->cmd_rfm); 4345b504601Sjiang wu - Sun Microsystems - Beijing China (void) ddi_dma_sync(mpt->m_dma_free_queue_hdl, 0, 0, 4355b504601Sjiang wu - Sun Microsystems - Beijing China DDI_DMA_SYNC_FORDEV); 436*08eb0b82SYong-Feng Du if (++mpt->m_free_index == mpt->m_free_queue_depth) { 437*08eb0b82SYong-Feng Du mpt->m_free_index = 0; 4385b504601Sjiang wu - Sun Microsystems - Beijing China } 4395b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put32(mpt->m_datap, &mpt->m_reg->ReplyFreeHostIndex, 440*08eb0b82SYong-Feng Du mpt->m_free_index); 4415b504601Sjiang wu - Sun Microsystems - Beijing China config_flags &= (~MPTSAS_ADDRESS_REPLY); 4425b504601Sjiang wu - Sun Microsystems - Beijing China } 4435b504601Sjiang wu - Sun Microsystems - Beijing China 4445b504601Sjiang wu - Sun Microsystems - Beijing China /* 4455b504601Sjiang wu - Sun Microsystems - Beijing China * Allocate DMA buffer here. Store the info regarding this buffer in 4465b504601Sjiang wu - Sun Microsystems - Beijing China * the cmd struct so that it can be used for this specific command and 4475b504601Sjiang wu - Sun Microsystems - Beijing China * de-allocated after the command completes. The size of the reply 4485b504601Sjiang wu - Sun Microsystems - Beijing China * will not be larger than the reply frame size. 4495b504601Sjiang wu - Sun Microsystems - Beijing China */ 4505b504601Sjiang wu - Sun Microsystems - Beijing China attrs = mpt->m_msg_dma_attr; 4515b504601Sjiang wu - Sun Microsystems - Beijing China attrs.dma_attr_sgllen = 1; 4525b504601Sjiang wu - Sun Microsystems - Beijing China attrs.dma_attr_granular = (uint32_t)len; 4535b504601Sjiang wu - Sun Microsystems - Beijing China 4545b504601Sjiang wu - Sun Microsystems - Beijing China if (ddi_dma_alloc_handle(mpt->m_dip, &attrs, 4555b504601Sjiang wu - Sun Microsystems - Beijing China DDI_DMA_SLEEP, NULL, &cmd->cmd_dmahandle) != DDI_SUCCESS) { 4565b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN, "unable to allocate dma handle for " 4575b504601Sjiang wu - Sun Microsystems - Beijing China "config page."); 4585b504601Sjiang wu - Sun Microsystems - Beijing China rval = DDI_FAILURE; 4595b504601Sjiang wu - Sun Microsystems - Beijing China goto page_done; 4605b504601Sjiang wu - Sun Microsystems - Beijing China } 4615b504601Sjiang wu - Sun Microsystems - Beijing China if (ddi_dma_mem_alloc(cmd->cmd_dmahandle, len, 4625b504601Sjiang wu - Sun Microsystems - Beijing China &mpt->m_dev_acc_attr, DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, NULL, 4635b504601Sjiang wu - Sun Microsystems - Beijing China &page_memp, &alloc_len, &accessp) != DDI_SUCCESS) { 4645b504601Sjiang wu - Sun Microsystems - Beijing China ddi_dma_free_handle(&cmd->cmd_dmahandle); 4655b504601Sjiang wu - Sun Microsystems - Beijing China cmd->cmd_dmahandle = NULL; 4665b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN, "unable to allocate config page " 4675b504601Sjiang wu - Sun Microsystems - Beijing China "structure."); 4685b504601Sjiang wu - Sun Microsystems - Beijing China rval = DDI_FAILURE; 4695b504601Sjiang wu - Sun Microsystems - Beijing China goto page_done; 4705b504601Sjiang wu - Sun Microsystems - Beijing China } 4715b504601Sjiang wu - Sun Microsystems - Beijing China 4725b504601Sjiang wu - Sun Microsystems - Beijing China if (ddi_dma_addr_bind_handle(cmd->cmd_dmahandle, NULL, page_memp, 4735b504601Sjiang wu - Sun Microsystems - Beijing China alloc_len, DDI_DMA_RDWR | DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, NULL, 4745b504601Sjiang wu - Sun Microsystems - Beijing China &cookie, &ncookie) != DDI_DMA_MAPPED) { 4755b504601Sjiang wu - Sun Microsystems - Beijing China (void) ddi_dma_mem_free(&accessp); 4765b504601Sjiang wu - Sun Microsystems - Beijing China ddi_dma_free_handle(&cmd->cmd_dmahandle); 4775b504601Sjiang wu - Sun Microsystems - Beijing China cmd->cmd_dmahandle = NULL; 4785b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN, "unable to bind DMA resources for " 4795b504601Sjiang wu - Sun Microsystems - Beijing China "config page."); 4805b504601Sjiang wu - Sun Microsystems - Beijing China rval = DDI_FAILURE; 4815b504601Sjiang wu - Sun Microsystems - Beijing China goto page_done; 4825b504601Sjiang wu - Sun Microsystems - Beijing China } 4835b504601Sjiang wu - Sun Microsystems - Beijing China cmd->cmd_dma_addr = cookie.dmac_laddress; 4845b504601Sjiang wu - Sun Microsystems - Beijing China bzero(page_memp, len); 4855b504601Sjiang wu - Sun Microsystems - Beijing China 4865b504601Sjiang wu - Sun Microsystems - Beijing China /* 4875b504601Sjiang wu - Sun Microsystems - Beijing China * Save the data for this request to be used in the call to start the 4885b504601Sjiang wu - Sun Microsystems - Beijing China * config page read 4895b504601Sjiang wu - Sun Microsystems - Beijing China */ 4905b504601Sjiang wu - Sun Microsystems - Beijing China config.action = action; 4915b504601Sjiang wu - Sun Microsystems - Beijing China config.page_address = page_address; 4925b504601Sjiang wu - Sun Microsystems - Beijing China 4935b504601Sjiang wu - Sun Microsystems - Beijing China /* 4945b504601Sjiang wu - Sun Microsystems - Beijing China * Re-use the cmd that was used to get the header. Reset some of the 4955b504601Sjiang wu - Sun Microsystems - Beijing China * values. 4965b504601Sjiang wu - Sun Microsystems - Beijing China */ 4975b504601Sjiang wu - Sun Microsystems - Beijing China bzero((caddr_t)pkt, scsi_pkt_size()); 4985b504601Sjiang wu - Sun Microsystems - Beijing China pkt->pkt_ha_private = (opaque_t)&config; 4995b504601Sjiang wu - Sun Microsystems - Beijing China pkt->pkt_flags = FLAG_HEAD; 5005b504601Sjiang wu - Sun Microsystems - Beijing China pkt->pkt_time = 60; 5015b504601Sjiang wu - Sun Microsystems - Beijing China cmd->cmd_flags = CFLAG_PREPARED | CFLAG_CMDIOC | CFLAG_CONFIG; 5025b504601Sjiang wu - Sun Microsystems - Beijing China 5035b504601Sjiang wu - Sun Microsystems - Beijing China /* 5045b504601Sjiang wu - Sun Microsystems - Beijing China * Send the config page request. cmd is re-used from header request. 5055b504601Sjiang wu - Sun Microsystems - Beijing China */ 5065b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_start_config_page_access(mpt, cmd); 5075b504601Sjiang wu - Sun Microsystems - Beijing China 5085b504601Sjiang wu - Sun Microsystems - Beijing China /* 5095b504601Sjiang wu - Sun Microsystems - Beijing China * Wait for the command to complete or timeout. 5105b504601Sjiang wu - Sun Microsystems - Beijing China */ 5115b504601Sjiang wu - Sun Microsystems - Beijing China while ((cmd->cmd_flags & CFLAG_FINISHED) == 0) { 5125b504601Sjiang wu - Sun Microsystems - Beijing China cv_wait(&mpt->m_config_cv, &mpt->m_mutex); 5135b504601Sjiang wu - Sun Microsystems - Beijing China } 5145b504601Sjiang wu - Sun Microsystems - Beijing China 5155b504601Sjiang wu - Sun Microsystems - Beijing China /* 5165b504601Sjiang wu - Sun Microsystems - Beijing China * Check if the request completed without timing out 5175b504601Sjiang wu - Sun Microsystems - Beijing China */ 5185b504601Sjiang wu - Sun Microsystems - Beijing China if (cmd->cmd_flags & CFLAG_TIMEOUT) { 5195b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN, "config page request timeout"); 5205b504601Sjiang wu - Sun Microsystems - Beijing China rval = DDI_FAILURE; 5215b504601Sjiang wu - Sun Microsystems - Beijing China goto page_done; 5225b504601Sjiang wu - Sun Microsystems - Beijing China } 5235b504601Sjiang wu - Sun Microsystems - Beijing China 5245b504601Sjiang wu - Sun Microsystems - Beijing China /* 5255b504601Sjiang wu - Sun Microsystems - Beijing China * cmd_rfm points to the reply message if a reply was given. The reply 5265b504601Sjiang wu - Sun Microsystems - Beijing China * frame and the config page are returned from this function in the 5275b504601Sjiang wu - Sun Microsystems - Beijing China * param list. 5285b504601Sjiang wu - Sun Microsystems - Beijing China */ 5295b504601Sjiang wu - Sun Microsystems - Beijing China if (cmd->cmd_rfm) { 5305b504601Sjiang wu - Sun Microsystems - Beijing China config_flags |= MPTSAS_ADDRESS_REPLY; 5315b504601Sjiang wu - Sun Microsystems - Beijing China (void) ddi_dma_sync(mpt->m_dma_reply_frame_hdl, 0, 0, 5325b504601Sjiang wu - Sun Microsystems - Beijing China DDI_DMA_SYNC_FORCPU); 5335b504601Sjiang wu - Sun Microsystems - Beijing China (void) ddi_dma_sync(cmd->cmd_dmahandle, 0, 0, 5345b504601Sjiang wu - Sun Microsystems - Beijing China DDI_DMA_SYNC_FORCPU); 5355b504601Sjiang wu - Sun Microsystems - Beijing China reply = (pMpi2ConfigReply_t)(mpt->m_reply_frame + (cmd->cmd_rfm 5365b504601Sjiang wu - Sun Microsystems - Beijing China - mpt->m_reply_frame_dma_addr)); 5375b504601Sjiang wu - Sun Microsystems - Beijing China iocstatus = ddi_get16(mpt->m_acc_reply_frame_hdl, 5385b504601Sjiang wu - Sun Microsystems - Beijing China &reply->IOCStatus); 5395b504601Sjiang wu - Sun Microsystems - Beijing China iocstatus = MPTSAS_IOCSTATUS(iocstatus); 5405b504601Sjiang wu - Sun Microsystems - Beijing China iocloginfo = ddi_get32(mpt->m_acc_reply_frame_hdl, 5415b504601Sjiang wu - Sun Microsystems - Beijing China &reply->IOCLogInfo); 5425b504601Sjiang wu - Sun Microsystems - Beijing China } 5435b504601Sjiang wu - Sun Microsystems - Beijing China 5445b504601Sjiang wu - Sun Microsystems - Beijing China if (callback(mpt, page_memp, accessp, iocstatus, iocloginfo, ap)) { 5455b504601Sjiang wu - Sun Microsystems - Beijing China rval = DDI_FAILURE; 5465b504601Sjiang wu - Sun Microsystems - Beijing China goto page_done; 5475b504601Sjiang wu - Sun Microsystems - Beijing China } 5485b504601Sjiang wu - Sun Microsystems - Beijing China 5495b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_fma_check(mpt, cmd); 5505b504601Sjiang wu - Sun Microsystems - Beijing China /* 5515b504601Sjiang wu - Sun Microsystems - Beijing China * Check the DMA/ACC handles and then free the DMA buffer. 5525b504601Sjiang wu - Sun Microsystems - Beijing China */ 5535b504601Sjiang wu - Sun Microsystems - Beijing China if ((mptsas_check_dma_handle(cmd->cmd_dmahandle) != DDI_SUCCESS) || 5545b504601Sjiang wu - Sun Microsystems - Beijing China (mptsas_check_acc_handle(accessp) != DDI_SUCCESS)) { 5555b504601Sjiang wu - Sun Microsystems - Beijing China ddi_fm_service_impact(mpt->m_dip, DDI_SERVICE_UNAFFECTED); 5565b504601Sjiang wu - Sun Microsystems - Beijing China rval = DDI_FAILURE; 5575b504601Sjiang wu - Sun Microsystems - Beijing China } 5585b504601Sjiang wu - Sun Microsystems - Beijing China 5595b504601Sjiang wu - Sun Microsystems - Beijing China if (pkt->pkt_reason == CMD_TRAN_ERR) { 5605b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN, "config fma error"); 5615b504601Sjiang wu - Sun Microsystems - Beijing China rval = DDI_FAILURE; 5625b504601Sjiang wu - Sun Microsystems - Beijing China goto page_done; 5635b504601Sjiang wu - Sun Microsystems - Beijing China } 5645b504601Sjiang wu - Sun Microsystems - Beijing China if (pkt->pkt_reason == CMD_RESET) { 5655b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN, "ioc reset abort config request"); 5665b504601Sjiang wu - Sun Microsystems - Beijing China rval = DDI_FAILURE; 5675b504601Sjiang wu - Sun Microsystems - Beijing China goto page_done; 5685b504601Sjiang wu - Sun Microsystems - Beijing China } 5695b504601Sjiang wu - Sun Microsystems - Beijing China 5705b504601Sjiang wu - Sun Microsystems - Beijing China page_done: 5715b504601Sjiang wu - Sun Microsystems - Beijing China va_end(ap); 5725b504601Sjiang wu - Sun Microsystems - Beijing China /* 5735b504601Sjiang wu - Sun Microsystems - Beijing China * Put the reply frame back on the free queue, increment the free 5745b504601Sjiang wu - Sun Microsystems - Beijing China * index, and write the new index to the free index register. But only 5755b504601Sjiang wu - Sun Microsystems - Beijing China * if this reply is an ADDRESS reply. 5765b504601Sjiang wu - Sun Microsystems - Beijing China */ 5775b504601Sjiang wu - Sun Microsystems - Beijing China if (config_flags & MPTSAS_ADDRESS_REPLY) { 5785b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put32(mpt->m_acc_free_queue_hdl, 579*08eb0b82SYong-Feng Du &((uint32_t *)(void *)mpt->m_free_queue)[mpt->m_free_index], 5805b504601Sjiang wu - Sun Microsystems - Beijing China cmd->cmd_rfm); 5815b504601Sjiang wu - Sun Microsystems - Beijing China (void) ddi_dma_sync(mpt->m_dma_free_queue_hdl, 0, 0, 5825b504601Sjiang wu - Sun Microsystems - Beijing China DDI_DMA_SYNC_FORDEV); 583*08eb0b82SYong-Feng Du if (++mpt->m_free_index == mpt->m_free_queue_depth) { 584*08eb0b82SYong-Feng Du mpt->m_free_index = 0; 5855b504601Sjiang wu - Sun Microsystems - Beijing China } 5865b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put32(mpt->m_datap, &mpt->m_reg->ReplyFreeHostIndex, 587*08eb0b82SYong-Feng Du mpt->m_free_index); 5885b504601Sjiang wu - Sun Microsystems - Beijing China } 5895b504601Sjiang wu - Sun Microsystems - Beijing China 5905b504601Sjiang wu - Sun Microsystems - Beijing China if (cmd->cmd_dmahandle != NULL) { 5915b504601Sjiang wu - Sun Microsystems - Beijing China (void) ddi_dma_unbind_handle(cmd->cmd_dmahandle); 5925b504601Sjiang wu - Sun Microsystems - Beijing China (void) ddi_dma_mem_free(&accessp); 5935b504601Sjiang wu - Sun Microsystems - Beijing China ddi_dma_free_handle(&cmd->cmd_dmahandle); 5945b504601Sjiang wu - Sun Microsystems - Beijing China } 5955b504601Sjiang wu - Sun Microsystems - Beijing China 5965b504601Sjiang wu - Sun Microsystems - Beijing China if (cmd && (cmd->cmd_flags & CFLAG_PREPARED)) { 5975b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_remove_cmd(mpt, cmd); 5985b504601Sjiang wu - Sun Microsystems - Beijing China config_flags &= (~MPTSAS_REQUEST_POOL_CMD); 5995b504601Sjiang wu - Sun Microsystems - Beijing China } 6005b504601Sjiang wu - Sun Microsystems - Beijing China if (config_flags & MPTSAS_REQUEST_POOL_CMD) 6015b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_return_to_pool(mpt, cmd); 6025b504601Sjiang wu - Sun Microsystems - Beijing China 6035b504601Sjiang wu - Sun Microsystems - Beijing China if (config_flags & MPTSAS_CMD_TIMEOUT) { 6045b504601Sjiang wu - Sun Microsystems - Beijing China if ((mptsas_restart_ioc(mpt)) == DDI_FAILURE) { 6055b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN, "mptsas_restart_ioc failed"); 6065b504601Sjiang wu - Sun Microsystems - Beijing China } 6075b504601Sjiang wu - Sun Microsystems - Beijing China } 6085b504601Sjiang wu - Sun Microsystems - Beijing China 6095b504601Sjiang wu - Sun Microsystems - Beijing China return (rval); 6105b504601Sjiang wu - Sun Microsystems - Beijing China } 6115b504601Sjiang wu - Sun Microsystems - Beijing China 6125b504601Sjiang wu - Sun Microsystems - Beijing China int 6135b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_send_config_request_msg(mptsas_t *mpt, uint8_t action, uint8_t pagetype, 6145b504601Sjiang wu - Sun Microsystems - Beijing China uint32_t pageaddress, uint8_t pagenumber, uint8_t pageversion, 6155b504601Sjiang wu - Sun Microsystems - Beijing China uint8_t pagelength, uint32_t SGEflagslength, uint32_t SGEaddress32) 6165b504601Sjiang wu - Sun Microsystems - Beijing China { 6175b504601Sjiang wu - Sun Microsystems - Beijing China pMpi2ConfigRequest_t config; 6185b504601Sjiang wu - Sun Microsystems - Beijing China int send_numbytes; 6195b504601Sjiang wu - Sun Microsystems - Beijing China 6205b504601Sjiang wu - Sun Microsystems - Beijing China bzero(mpt->m_hshk_memp, sizeof (MPI2_CONFIG_REQUEST)); 6215b504601Sjiang wu - Sun Microsystems - Beijing China config = (pMpi2ConfigRequest_t)mpt->m_hshk_memp; 6225b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put8(mpt->m_hshk_acc_hdl, &config->Function, MPI2_FUNCTION_CONFIG); 6235b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put8(mpt->m_hshk_acc_hdl, &config->Action, action); 6245b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put8(mpt->m_hshk_acc_hdl, &config->Header.PageNumber, pagenumber); 6255b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put8(mpt->m_hshk_acc_hdl, &config->Header.PageType, pagetype); 6265b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put32(mpt->m_hshk_acc_hdl, &config->PageAddress, pageaddress); 6275b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put8(mpt->m_hshk_acc_hdl, &config->Header.PageVersion, pageversion); 6285b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put8(mpt->m_hshk_acc_hdl, &config->Header.PageLength, pagelength); 6295b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put32(mpt->m_hshk_acc_hdl, 6305b504601Sjiang wu - Sun Microsystems - Beijing China &config->PageBufferSGE.MpiSimple.FlagsLength, SGEflagslength); 6315b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put32(mpt->m_hshk_acc_hdl, 6325b504601Sjiang wu - Sun Microsystems - Beijing China &config->PageBufferSGE.MpiSimple.u.Address32, SGEaddress32); 6335b504601Sjiang wu - Sun Microsystems - Beijing China send_numbytes = sizeof (MPI2_CONFIG_REQUEST); 6345b504601Sjiang wu - Sun Microsystems - Beijing China 6355b504601Sjiang wu - Sun Microsystems - Beijing China /* 6365b504601Sjiang wu - Sun Microsystems - Beijing China * Post message via handshake 6375b504601Sjiang wu - Sun Microsystems - Beijing China */ 6385b504601Sjiang wu - Sun Microsystems - Beijing China if (mptsas_send_handshake_msg(mpt, (caddr_t)config, send_numbytes, 6395b504601Sjiang wu - Sun Microsystems - Beijing China mpt->m_hshk_acc_hdl)) { 6405b504601Sjiang wu - Sun Microsystems - Beijing China return (-1); 6415b504601Sjiang wu - Sun Microsystems - Beijing China } 6425b504601Sjiang wu - Sun Microsystems - Beijing China return (0); 6435b504601Sjiang wu - Sun Microsystems - Beijing China } 6445b504601Sjiang wu - Sun Microsystems - Beijing China 6455b504601Sjiang wu - Sun Microsystems - Beijing China int 6465b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_send_extended_config_request_msg(mptsas_t *mpt, uint8_t action, 6475b504601Sjiang wu - Sun Microsystems - Beijing China uint8_t extpagetype, uint32_t pageaddress, uint8_t pagenumber, 6485b504601Sjiang wu - Sun Microsystems - Beijing China uint8_t pageversion, uint16_t extpagelength, 6495b504601Sjiang wu - Sun Microsystems - Beijing China uint32_t SGEflagslength, uint32_t SGEaddress32) 6505b504601Sjiang wu - Sun Microsystems - Beijing China { 6515b504601Sjiang wu - Sun Microsystems - Beijing China pMpi2ConfigRequest_t config; 6525b504601Sjiang wu - Sun Microsystems - Beijing China int send_numbytes; 6535b504601Sjiang wu - Sun Microsystems - Beijing China 6545b504601Sjiang wu - Sun Microsystems - Beijing China bzero(mpt->m_hshk_memp, sizeof (MPI2_CONFIG_REQUEST)); 6555b504601Sjiang wu - Sun Microsystems - Beijing China config = (pMpi2ConfigRequest_t)mpt->m_hshk_memp; 6565b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put8(mpt->m_hshk_acc_hdl, &config->Function, MPI2_FUNCTION_CONFIG); 6575b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put8(mpt->m_hshk_acc_hdl, &config->Action, action); 6585b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put8(mpt->m_hshk_acc_hdl, &config->Header.PageNumber, pagenumber); 6595b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put8(mpt->m_hshk_acc_hdl, &config->Header.PageType, 6605b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_CONFIG_PAGETYPE_EXTENDED); 6615b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put8(mpt->m_hshk_acc_hdl, &config->ExtPageType, extpagetype); 6625b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put32(mpt->m_hshk_acc_hdl, &config->PageAddress, pageaddress); 6635b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put8(mpt->m_hshk_acc_hdl, &config->Header.PageVersion, pageversion); 6645b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put16(mpt->m_hshk_acc_hdl, &config->ExtPageLength, extpagelength); 6655b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put32(mpt->m_hshk_acc_hdl, 6665b504601Sjiang wu - Sun Microsystems - Beijing China &config->PageBufferSGE.MpiSimple.FlagsLength, SGEflagslength); 6675b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put32(mpt->m_hshk_acc_hdl, 6685b504601Sjiang wu - Sun Microsystems - Beijing China &config->PageBufferSGE.MpiSimple.u.Address32, SGEaddress32); 6695b504601Sjiang wu - Sun Microsystems - Beijing China send_numbytes = sizeof (MPI2_CONFIG_REQUEST); 6705b504601Sjiang wu - Sun Microsystems - Beijing China 6715b504601Sjiang wu - Sun Microsystems - Beijing China /* 6725b504601Sjiang wu - Sun Microsystems - Beijing China * Post message via handshake 6735b504601Sjiang wu - Sun Microsystems - Beijing China */ 6745b504601Sjiang wu - Sun Microsystems - Beijing China if (mptsas_send_handshake_msg(mpt, (caddr_t)config, send_numbytes, 6755b504601Sjiang wu - Sun Microsystems - Beijing China mpt->m_hshk_acc_hdl)) { 6765b504601Sjiang wu - Sun Microsystems - Beijing China return (-1); 6775b504601Sjiang wu - Sun Microsystems - Beijing China } 6785b504601Sjiang wu - Sun Microsystems - Beijing China return (0); 6795b504601Sjiang wu - Sun Microsystems - Beijing China } 6805b504601Sjiang wu - Sun Microsystems - Beijing China 6815b504601Sjiang wu - Sun Microsystems - Beijing China int 6825b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_ioc_wait_for_response(mptsas_t *mpt) 6835b504601Sjiang wu - Sun Microsystems - Beijing China { 6845b504601Sjiang wu - Sun Microsystems - Beijing China int polls = 0; 6855b504601Sjiang wu - Sun Microsystems - Beijing China 6865b504601Sjiang wu - Sun Microsystems - Beijing China while ((ddi_get32(mpt->m_datap, 6875b504601Sjiang wu - Sun Microsystems - Beijing China &mpt->m_reg->HostInterruptStatus) & MPI2_HIS_IOP_DOORBELL_STATUS)) { 6885b504601Sjiang wu - Sun Microsystems - Beijing China drv_usecwait(1000); 6895b504601Sjiang wu - Sun Microsystems - Beijing China if (polls++ > 60000) { 6905b504601Sjiang wu - Sun Microsystems - Beijing China return (-1); 6915b504601Sjiang wu - Sun Microsystems - Beijing China } 6925b504601Sjiang wu - Sun Microsystems - Beijing China } 6935b504601Sjiang wu - Sun Microsystems - Beijing China return (0); 6945b504601Sjiang wu - Sun Microsystems - Beijing China } 6955b504601Sjiang wu - Sun Microsystems - Beijing China 6965b504601Sjiang wu - Sun Microsystems - Beijing China int 6975b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_ioc_wait_for_doorbell(mptsas_t *mpt) 6985b504601Sjiang wu - Sun Microsystems - Beijing China { 6995b504601Sjiang wu - Sun Microsystems - Beijing China int polls = 0; 7005b504601Sjiang wu - Sun Microsystems - Beijing China 7015b504601Sjiang wu - Sun Microsystems - Beijing China while ((ddi_get32(mpt->m_datap, 7025b504601Sjiang wu - Sun Microsystems - Beijing China &mpt->m_reg->HostInterruptStatus) & MPI2_HIM_DIM) == 0) { 7035b504601Sjiang wu - Sun Microsystems - Beijing China drv_usecwait(1000); 7045b504601Sjiang wu - Sun Microsystems - Beijing China if (polls++ > 300000) { 7055b504601Sjiang wu - Sun Microsystems - Beijing China return (-1); 7065b504601Sjiang wu - Sun Microsystems - Beijing China } 7075b504601Sjiang wu - Sun Microsystems - Beijing China } 7085b504601Sjiang wu - Sun Microsystems - Beijing China return (0); 7095b504601Sjiang wu - Sun Microsystems - Beijing China } 7105b504601Sjiang wu - Sun Microsystems - Beijing China 7115b504601Sjiang wu - Sun Microsystems - Beijing China int 7125b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_send_handshake_msg(mptsas_t *mpt, caddr_t memp, int numbytes, 7135b504601Sjiang wu - Sun Microsystems - Beijing China ddi_acc_handle_t accessp) 7145b504601Sjiang wu - Sun Microsystems - Beijing China { 7155b504601Sjiang wu - Sun Microsystems - Beijing China int i; 7165b504601Sjiang wu - Sun Microsystems - Beijing China 7175b504601Sjiang wu - Sun Microsystems - Beijing China /* 7185b504601Sjiang wu - Sun Microsystems - Beijing China * clean pending doorbells 7195b504601Sjiang wu - Sun Microsystems - Beijing China */ 7205b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put32(mpt->m_datap, &mpt->m_reg->HostInterruptStatus, 0); 7215b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put32(mpt->m_datap, &mpt->m_reg->Doorbell, 7225b504601Sjiang wu - Sun Microsystems - Beijing China ((MPI2_FUNCTION_HANDSHAKE << MPI2_DOORBELL_FUNCTION_SHIFT) | 7235b504601Sjiang wu - Sun Microsystems - Beijing China ((numbytes / 4) << MPI2_DOORBELL_ADD_DWORDS_SHIFT))); 7245b504601Sjiang wu - Sun Microsystems - Beijing China 7255b504601Sjiang wu - Sun Microsystems - Beijing China if (mptsas_ioc_wait_for_doorbell(mpt)) { 7265b504601Sjiang wu - Sun Microsystems - Beijing China NDBG19(("mptsas_send_handshake failed. Doorbell not ready\n")); 7275b504601Sjiang wu - Sun Microsystems - Beijing China return (-1); 7285b504601Sjiang wu - Sun Microsystems - Beijing China } 7295b504601Sjiang wu - Sun Microsystems - Beijing China 7305b504601Sjiang wu - Sun Microsystems - Beijing China /* 7315b504601Sjiang wu - Sun Microsystems - Beijing China * clean pending doorbells again 7325b504601Sjiang wu - Sun Microsystems - Beijing China */ 7335b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put32(mpt->m_datap, &mpt->m_reg->HostInterruptStatus, 0); 7345b504601Sjiang wu - Sun Microsystems - Beijing China 7355b504601Sjiang wu - Sun Microsystems - Beijing China if (mptsas_ioc_wait_for_response(mpt)) { 7365b504601Sjiang wu - Sun Microsystems - Beijing China NDBG19(("mptsas_send_handshake failed. Doorbell not " 7375b504601Sjiang wu - Sun Microsystems - Beijing China "cleared\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 * post handshake message 7435b504601Sjiang wu - Sun Microsystems - Beijing China */ 7445b504601Sjiang wu - Sun Microsystems - Beijing China for (i = 0; (i < numbytes / 4); i++, memp += 4) { 7455b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put32(mpt->m_datap, &mpt->m_reg->Doorbell, 7465b504601Sjiang wu - Sun Microsystems - Beijing China ddi_get32(accessp, (uint32_t *)((void *)(memp)))); 7475b504601Sjiang wu - Sun Microsystems - Beijing China if (mptsas_ioc_wait_for_response(mpt)) { 7485b504601Sjiang wu - Sun Microsystems - Beijing China NDBG19(("mptsas_send_handshake failed posting " 7495b504601Sjiang wu - Sun Microsystems - Beijing China "message\n")); 7505b504601Sjiang wu - Sun Microsystems - Beijing China return (-1); 7515b504601Sjiang wu - Sun Microsystems - Beijing China } 7525b504601Sjiang wu - Sun Microsystems - Beijing China } 7535b504601Sjiang wu - Sun Microsystems - Beijing China 7545b504601Sjiang wu - Sun Microsystems - Beijing China if (mptsas_check_acc_handle(mpt->m_datap) != DDI_SUCCESS) { 7555b504601Sjiang wu - Sun Microsystems - Beijing China ddi_fm_service_impact(mpt->m_dip, DDI_SERVICE_UNAFFECTED); 7565b504601Sjiang wu - Sun Microsystems - Beijing China ddi_fm_acc_err_clear(mpt->m_datap, DDI_FME_VER0); 7575b504601Sjiang wu - Sun Microsystems - Beijing China return (-1); 7585b504601Sjiang wu - Sun Microsystems - Beijing China } 7595b504601Sjiang wu - Sun Microsystems - Beijing China 7605b504601Sjiang wu - Sun Microsystems - Beijing China return (0); 7615b504601Sjiang wu - Sun Microsystems - Beijing China } 7625b504601Sjiang wu - Sun Microsystems - Beijing China 7635b504601Sjiang wu - Sun Microsystems - Beijing China int 7645b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_get_handshake_msg(mptsas_t *mpt, caddr_t memp, int numbytes, 7655b504601Sjiang wu - Sun Microsystems - Beijing China ddi_acc_handle_t accessp) 7665b504601Sjiang wu - Sun Microsystems - Beijing China { 7675b504601Sjiang wu - Sun Microsystems - Beijing China int i, totalbytes, bytesleft; 7685b504601Sjiang wu - Sun Microsystems - Beijing China uint16_t val; 7695b504601Sjiang wu - Sun Microsystems - Beijing China 7705b504601Sjiang wu - Sun Microsystems - Beijing China /* 7715b504601Sjiang wu - Sun Microsystems - Beijing China * wait for doorbell 7725b504601Sjiang wu - Sun Microsystems - Beijing China */ 7735b504601Sjiang wu - Sun Microsystems - Beijing China if (mptsas_ioc_wait_for_doorbell(mpt)) { 7745b504601Sjiang wu - Sun Microsystems - Beijing China NDBG19(("mptsas_get_handshake failed. Doorbell not ready\n")); 7755b504601Sjiang wu - Sun Microsystems - Beijing China return (-1); 7765b504601Sjiang wu - Sun Microsystems - Beijing China } 7775b504601Sjiang wu - Sun Microsystems - Beijing China 7785b504601Sjiang wu - Sun Microsystems - Beijing China /* 7795b504601Sjiang wu - Sun Microsystems - Beijing China * get first 2 bytes of handshake message to determine how much 7805b504601Sjiang wu - Sun Microsystems - Beijing China * data we will be getting 7815b504601Sjiang wu - Sun Microsystems - Beijing China */ 7825b504601Sjiang wu - Sun Microsystems - Beijing China for (i = 0; i < 2; i++, memp += 2) { 7835b504601Sjiang wu - Sun Microsystems - Beijing China val = (ddi_get32(mpt->m_datap, 7845b504601Sjiang wu - Sun Microsystems - Beijing China &mpt->m_reg->Doorbell) & MPI2_DOORBELL_DATA_MASK); 7855b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put32(mpt->m_datap, &mpt->m_reg->HostInterruptStatus, 0); 7865b504601Sjiang wu - Sun Microsystems - Beijing China if (mptsas_ioc_wait_for_doorbell(mpt)) { 7875b504601Sjiang wu - Sun Microsystems - Beijing China NDBG19(("mptsas_get_handshake failure getting initial" 7885b504601Sjiang wu - Sun Microsystems - Beijing China " data\n")); 7895b504601Sjiang wu - Sun Microsystems - Beijing China return (-1); 7905b504601Sjiang wu - Sun Microsystems - Beijing China } 7915b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put16(accessp, (uint16_t *)((void *)(memp)), val); 7925b504601Sjiang wu - Sun Microsystems - Beijing China if (i == 1) { 7935b504601Sjiang wu - Sun Microsystems - Beijing China totalbytes = (val & 0xFF) * 2; 7945b504601Sjiang wu - Sun Microsystems - Beijing China } 7955b504601Sjiang wu - Sun Microsystems - Beijing China } 7965b504601Sjiang wu - Sun Microsystems - Beijing China 7975b504601Sjiang wu - Sun Microsystems - Beijing China /* 7985b504601Sjiang wu - Sun Microsystems - Beijing China * If we are expecting less bytes than the message wants to send 7995b504601Sjiang wu - Sun Microsystems - Beijing China * we simply save as much as we expected and then throw out the rest 8005b504601Sjiang wu - Sun Microsystems - Beijing China * later 8015b504601Sjiang wu - Sun Microsystems - Beijing China */ 8025b504601Sjiang wu - Sun Microsystems - Beijing China if (totalbytes > (numbytes / 2)) { 8035b504601Sjiang wu - Sun Microsystems - Beijing China bytesleft = ((numbytes / 2) - 2); 8045b504601Sjiang wu - Sun Microsystems - Beijing China } else { 8055b504601Sjiang wu - Sun Microsystems - Beijing China bytesleft = (totalbytes - 2); 8065b504601Sjiang wu - Sun Microsystems - Beijing China } 8075b504601Sjiang wu - Sun Microsystems - Beijing China 8085b504601Sjiang wu - Sun Microsystems - Beijing China /* 8095b504601Sjiang wu - Sun Microsystems - Beijing China * Get the rest of the data 8105b504601Sjiang wu - Sun Microsystems - Beijing China */ 8115b504601Sjiang wu - Sun Microsystems - Beijing China for (i = 0; i < bytesleft; i++, memp += 2) { 8125b504601Sjiang wu - Sun Microsystems - Beijing China val = (ddi_get32(mpt->m_datap, 8135b504601Sjiang wu - Sun Microsystems - Beijing China &mpt->m_reg->Doorbell) & MPI2_DOORBELL_DATA_MASK); 8145b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put32(mpt->m_datap, &mpt->m_reg->HostInterruptStatus, 0); 8155b504601Sjiang wu - Sun Microsystems - Beijing China if (mptsas_ioc_wait_for_doorbell(mpt)) { 8165b504601Sjiang wu - Sun Microsystems - Beijing China NDBG19(("mptsas_get_handshake failure getting" 8175b504601Sjiang wu - Sun Microsystems - Beijing China " main data\n")); 8185b504601Sjiang wu - Sun Microsystems - Beijing China return (-1); 8195b504601Sjiang wu - Sun Microsystems - Beijing China } 8205b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put16(accessp, (uint16_t *)((void *)(memp)), val); 8215b504601Sjiang wu - Sun Microsystems - Beijing China } 8225b504601Sjiang wu - Sun Microsystems - Beijing China 8235b504601Sjiang wu - Sun Microsystems - Beijing China /* 8245b504601Sjiang wu - Sun Microsystems - Beijing China * Sometimes the device will send more data than is expected 8255b504601Sjiang wu - Sun Microsystems - Beijing China * This data is not used by us but needs to be cleared from 8265b504601Sjiang wu - Sun Microsystems - Beijing China * ioc doorbell. So we just read the values and throw 8275b504601Sjiang wu - Sun Microsystems - Beijing China * them out. 8285b504601Sjiang wu - Sun Microsystems - Beijing China */ 8295b504601Sjiang wu - Sun Microsystems - Beijing China if (totalbytes > (numbytes / 2)) { 8305b504601Sjiang wu - Sun Microsystems - Beijing China for (i = (numbytes / 2); i < totalbytes; i++) { 8315b504601Sjiang wu - Sun Microsystems - Beijing China val = (ddi_get32(mpt->m_datap, 8325b504601Sjiang wu - Sun Microsystems - Beijing China &mpt->m_reg->Doorbell) & 8335b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_DOORBELL_DATA_MASK); 8345b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put32(mpt->m_datap, 8355b504601Sjiang wu - Sun Microsystems - Beijing China &mpt->m_reg->HostInterruptStatus, 0); 8365b504601Sjiang wu - Sun Microsystems - Beijing China if (mptsas_ioc_wait_for_doorbell(mpt)) { 8375b504601Sjiang wu - Sun Microsystems - Beijing China NDBG19(("mptsas_get_handshake failure getting " 8385b504601Sjiang wu - Sun Microsystems - Beijing China "extra garbage data\n")); 8395b504601Sjiang wu - Sun Microsystems - Beijing China return (-1); 8405b504601Sjiang wu - Sun Microsystems - Beijing China } 8415b504601Sjiang wu - Sun Microsystems - Beijing China } 8425b504601Sjiang wu - Sun Microsystems - Beijing China } 8435b504601Sjiang wu - Sun Microsystems - Beijing China 8445b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put32(mpt->m_datap, &mpt->m_reg->HostInterruptStatus, 0); 8455b504601Sjiang wu - Sun Microsystems - Beijing China 8465b504601Sjiang wu - Sun Microsystems - Beijing China if (mptsas_check_acc_handle(mpt->m_datap) != DDI_SUCCESS) { 8475b504601Sjiang wu - Sun Microsystems - Beijing China ddi_fm_service_impact(mpt->m_dip, DDI_SERVICE_UNAFFECTED); 8485b504601Sjiang wu - Sun Microsystems - Beijing China ddi_fm_acc_err_clear(mpt->m_datap, DDI_FME_VER0); 8495b504601Sjiang wu - Sun Microsystems - Beijing China return (-1); 8505b504601Sjiang wu - Sun Microsystems - Beijing China } 8515b504601Sjiang wu - Sun Microsystems - Beijing China 8525b504601Sjiang wu - Sun Microsystems - Beijing China return (0); 8535b504601Sjiang wu - Sun Microsystems - Beijing China } 8545b504601Sjiang wu - Sun Microsystems - Beijing China 8555b504601Sjiang wu - Sun Microsystems - Beijing China int 8565b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_kick_start(mptsas_t *mpt) 8575b504601Sjiang wu - Sun Microsystems - Beijing China { 8585b504601Sjiang wu - Sun Microsystems - Beijing China int polls = 0; 8595b504601Sjiang wu - Sun Microsystems - Beijing China uint32_t diag_reg, ioc_state, saved_HCB_size; 8605b504601Sjiang wu - Sun Microsystems - Beijing China 8615b504601Sjiang wu - Sun Microsystems - Beijing China /* 8625b504601Sjiang wu - Sun Microsystems - Beijing China * Start a hard reset. Write magic number and wait 900 uSeconds. 8635b504601Sjiang wu - Sun Microsystems - Beijing China */ 8645b504601Sjiang wu - Sun Microsystems - Beijing China MPTSAS_ENABLE_DRWE(mpt); 8655b504601Sjiang wu - Sun Microsystems - Beijing China drv_usecwait(900); 8665b504601Sjiang wu - Sun Microsystems - Beijing China 8675b504601Sjiang wu - Sun Microsystems - Beijing China /* 8685b504601Sjiang wu - Sun Microsystems - Beijing China * Read the current Diag Reg and save the Host Controlled Boot size. 8695b504601Sjiang wu - Sun Microsystems - Beijing China */ 8705b504601Sjiang wu - Sun Microsystems - Beijing China diag_reg = ddi_get32(mpt->m_datap, &mpt->m_reg->HostDiagnostic); 8715b504601Sjiang wu - Sun Microsystems - Beijing China saved_HCB_size = ddi_get32(mpt->m_datap, &mpt->m_reg->HCBSize); 8725b504601Sjiang wu - Sun Microsystems - Beijing China 8735b504601Sjiang wu - Sun Microsystems - Beijing China /* 8745b504601Sjiang wu - Sun Microsystems - Beijing China * Set Reset Adapter bit and wait 30 mSeconds. 8755b504601Sjiang wu - Sun Microsystems - Beijing China */ 8765b504601Sjiang wu - Sun Microsystems - Beijing China diag_reg |= MPI2_DIAG_RESET_ADAPTER; 8775b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put32(mpt->m_datap, &mpt->m_reg->HostDiagnostic, diag_reg); 8785b504601Sjiang wu - Sun Microsystems - Beijing China drv_usecwait(30000); 8795b504601Sjiang wu - Sun Microsystems - Beijing China 8805b504601Sjiang wu - Sun Microsystems - Beijing China /* 8815b504601Sjiang wu - Sun Microsystems - Beijing China * Poll, waiting for Reset Adapter bit to clear. 300 Seconds max 8825b504601Sjiang wu - Sun Microsystems - Beijing China * (600000 * 500 = 300,000,000 uSeconds, 300 seconds). 8835b504601Sjiang wu - Sun Microsystems - Beijing China * If no more adapter (all FF's), just return failure. 8845b504601Sjiang wu - Sun Microsystems - Beijing China */ 8855b504601Sjiang wu - Sun Microsystems - Beijing China for (polls = 0; polls < 600000; polls++) { 8865b504601Sjiang wu - Sun Microsystems - Beijing China diag_reg = ddi_get32(mpt->m_datap, 8875b504601Sjiang wu - Sun Microsystems - Beijing China &mpt->m_reg->HostDiagnostic); 8885b504601Sjiang wu - Sun Microsystems - Beijing China if (diag_reg == 0xFFFFFFFF) { 8895b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_fm_ereport(mpt, DDI_FM_DEVICE_NO_RESPONSE); 8905b504601Sjiang wu - Sun Microsystems - Beijing China ddi_fm_service_impact(mpt->m_dip, DDI_SERVICE_LOST); 8915b504601Sjiang wu - Sun Microsystems - Beijing China return (DDI_FAILURE); 8925b504601Sjiang wu - Sun Microsystems - Beijing China } 8935b504601Sjiang wu - Sun Microsystems - Beijing China if (!(diag_reg & MPI2_DIAG_RESET_ADAPTER)) { 8945b504601Sjiang wu - Sun Microsystems - Beijing China break; 8955b504601Sjiang wu - Sun Microsystems - Beijing China } 8965b504601Sjiang wu - Sun Microsystems - Beijing China drv_usecwait(500); 8975b504601Sjiang wu - Sun Microsystems - Beijing China } 8985b504601Sjiang wu - Sun Microsystems - Beijing China if (polls == 600000) { 8995b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_fm_ereport(mpt, DDI_FM_DEVICE_NO_RESPONSE); 9005b504601Sjiang wu - Sun Microsystems - Beijing China ddi_fm_service_impact(mpt->m_dip, DDI_SERVICE_LOST); 9015b504601Sjiang wu - Sun Microsystems - Beijing China return (DDI_FAILURE); 9025b504601Sjiang wu - Sun Microsystems - Beijing China } 9035b504601Sjiang wu - Sun Microsystems - Beijing China 9045b504601Sjiang wu - Sun Microsystems - Beijing China /* 9055b504601Sjiang wu - Sun Microsystems - Beijing China * Check if adapter is in Host Boot Mode. If so, restart adapter 9065b504601Sjiang wu - Sun Microsystems - Beijing China * assuming the HCB points to good FW. 9075b504601Sjiang wu - Sun Microsystems - Beijing China * Set BootDeviceSel to HCDW (Host Code and Data Window). 9085b504601Sjiang wu - Sun Microsystems - Beijing China */ 9095b504601Sjiang wu - Sun Microsystems - Beijing China if (diag_reg & MPI2_DIAG_HCB_MODE) { 9105b504601Sjiang wu - Sun Microsystems - Beijing China diag_reg &= ~MPI2_DIAG_BOOT_DEVICE_SELECT_MASK; 9115b504601Sjiang wu - Sun Microsystems - Beijing China diag_reg |= MPI2_DIAG_BOOT_DEVICE_SELECT_HCDW; 9125b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put32(mpt->m_datap, &mpt->m_reg->HostDiagnostic, diag_reg); 9135b504601Sjiang wu - Sun Microsystems - Beijing China 9145b504601Sjiang wu - Sun Microsystems - Beijing China /* 9155b504601Sjiang wu - Sun Microsystems - Beijing China * Re-enable the HCDW. 9165b504601Sjiang wu - Sun Microsystems - Beijing China */ 9175b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put32(mpt->m_datap, &mpt->m_reg->HCBSize, 9185b504601Sjiang wu - Sun Microsystems - Beijing China (saved_HCB_size | MPI2_HCB_SIZE_HCB_ENABLE)); 9195b504601Sjiang wu - Sun Microsystems - Beijing China } 9205b504601Sjiang wu - Sun Microsystems - Beijing China 9215b504601Sjiang wu - Sun Microsystems - Beijing China /* 9225b504601Sjiang wu - Sun Microsystems - Beijing China * Restart the adapter. 9235b504601Sjiang wu - Sun Microsystems - Beijing China */ 9245b504601Sjiang wu - Sun Microsystems - Beijing China diag_reg &= ~MPI2_DIAG_HOLD_IOC_RESET; 9255b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put32(mpt->m_datap, &mpt->m_reg->HostDiagnostic, diag_reg); 9265b504601Sjiang wu - Sun Microsystems - Beijing China 9275b504601Sjiang wu - Sun Microsystems - Beijing China /* 9285b504601Sjiang wu - Sun Microsystems - Beijing China * Disable writes to the Host Diag register. 9295b504601Sjiang wu - Sun Microsystems - Beijing China */ 9305b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put32(mpt->m_datap, &mpt->m_reg->WriteSequence, 9315b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_WRSEQ_FLUSH_KEY_VALUE); 9325b504601Sjiang wu - Sun Microsystems - Beijing China 9335b504601Sjiang wu - Sun Microsystems - Beijing China /* 9345b504601Sjiang wu - Sun Microsystems - Beijing China * Wait 20 seconds max for FW to come to ready state. 9355b504601Sjiang wu - Sun Microsystems - Beijing China */ 9365b504601Sjiang wu - Sun Microsystems - Beijing China for (polls = 0; polls < 20000; polls++) { 9375b504601Sjiang wu - Sun Microsystems - Beijing China ioc_state = ddi_get32(mpt->m_datap, &mpt->m_reg->Doorbell); 9385b504601Sjiang wu - Sun Microsystems - Beijing China if (ioc_state == 0xFFFFFFFF) { 9395b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_fm_ereport(mpt, DDI_FM_DEVICE_NO_RESPONSE); 9405b504601Sjiang wu - Sun Microsystems - Beijing China ddi_fm_service_impact(mpt->m_dip, DDI_SERVICE_LOST); 9415b504601Sjiang wu - Sun Microsystems - Beijing China return (DDI_FAILURE); 9425b504601Sjiang wu - Sun Microsystems - Beijing China } 9435b504601Sjiang wu - Sun Microsystems - Beijing China if ((ioc_state & MPI2_IOC_STATE_MASK) == 9445b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_IOC_STATE_READY) { 9455b504601Sjiang wu - Sun Microsystems - Beijing China break; 9465b504601Sjiang wu - Sun Microsystems - Beijing China } 9475b504601Sjiang wu - Sun Microsystems - Beijing China drv_usecwait(1000); 9485b504601Sjiang wu - Sun Microsystems - Beijing China } 9495b504601Sjiang wu - Sun Microsystems - Beijing China if (polls == 20000) { 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 9555b504601Sjiang wu - Sun Microsystems - Beijing China /* 9565b504601Sjiang wu - Sun Microsystems - Beijing China * Clear the ioc ack events queue. 9575b504601Sjiang wu - Sun Microsystems - Beijing China */ 9585b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_destroy_ioc_event_cmd(mpt); 9595b504601Sjiang wu - Sun Microsystems - Beijing China 9605b504601Sjiang wu - Sun Microsystems - Beijing China return (DDI_SUCCESS); 9615b504601Sjiang wu - Sun Microsystems - Beijing China } 9625b504601Sjiang wu - Sun Microsystems - Beijing China 9635b504601Sjiang wu - Sun Microsystems - Beijing China int 9645b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_ioc_reset(mptsas_t *mpt) 9655b504601Sjiang wu - Sun Microsystems - Beijing China { 9665b504601Sjiang wu - Sun Microsystems - Beijing China #ifdef SLM 9675b504601Sjiang wu - Sun Microsystems - Beijing China int polls = 0; 9685b504601Sjiang wu - Sun Microsystems - Beijing China uint32_t reset_msg; 9695b504601Sjiang wu - Sun Microsystems - Beijing China 9705b504601Sjiang wu - Sun Microsystems - Beijing China #endif 9715b504601Sjiang wu - Sun Microsystems - Beijing China uint32_t ioc_state; 9725b504601Sjiang wu - Sun Microsystems - Beijing China ioc_state = ddi_get32(mpt->m_datap, &mpt->m_reg->Doorbell); 9735b504601Sjiang wu - Sun Microsystems - Beijing China /* 9745b504601Sjiang wu - Sun Microsystems - Beijing China * If chip is already in ready state then there is nothing to do. 9755b504601Sjiang wu - Sun Microsystems - Beijing China */ 9765b504601Sjiang wu - Sun Microsystems - Beijing China if (ioc_state == MPI2_IOC_STATE_READY) { 9775b504601Sjiang wu - Sun Microsystems - Beijing China return (MPTSAS_NO_RESET); 9785b504601Sjiang wu - Sun Microsystems - Beijing China } 9795b504601Sjiang wu - Sun Microsystems - Beijing China 9805b504601Sjiang wu - Sun Microsystems - Beijing China /* 9815b504601Sjiang wu - Sun Microsystems - Beijing China * SLM-test; skip MUR for now 9825b504601Sjiang wu - Sun Microsystems - Beijing China */ 9835b504601Sjiang wu - Sun Microsystems - Beijing China #ifdef SLM 9845b504601Sjiang wu - Sun Microsystems - Beijing China /* 9855b504601Sjiang wu - Sun Microsystems - Beijing China * If the chip is already operational, we just need to send 9865b504601Sjiang wu - Sun Microsystems - Beijing China * it a message unit reset to put it back in the ready state 9875b504601Sjiang wu - Sun Microsystems - Beijing China */ 9885b504601Sjiang wu - Sun Microsystems - Beijing China if (ioc_state & MPI2_IOC_STATE_OPERATIONAL) { 9895b504601Sjiang wu - Sun Microsystems - Beijing China reset_msg = MPI2_FUNCTION_IOC_MESSAGE_UNIT_RESET; 9905b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put32(mpt->m_datap, &mpt->m_reg->Doorbell, 9915b504601Sjiang wu - Sun Microsystems - Beijing China (reset_msg << MPI2_DOORBELL_FUNCTION_SHIFT)); 9925b504601Sjiang wu - Sun Microsystems - Beijing China if (mptsas_ioc_wait_for_response(mpt)) { 9935b504601Sjiang wu - Sun Microsystems - Beijing China NDBG19(("mptsas_ioc_reset failure sending " 9945b504601Sjiang wu - Sun Microsystems - Beijing China "message_unit_reset\n")); 9955b504601Sjiang wu - Sun Microsystems - Beijing China goto hard_reset; 9965b504601Sjiang wu - Sun Microsystems - Beijing China } 9975b504601Sjiang wu - Sun Microsystems - Beijing China 9985b504601Sjiang wu - Sun Microsystems - Beijing China /* 9995b504601Sjiang wu - Sun Microsystems - Beijing China * Wait for chip to become ready 10005b504601Sjiang wu - Sun Microsystems - Beijing China */ 10015b504601Sjiang wu - Sun Microsystems - Beijing China while ((ddi_get32(mpt->m_datap, &mpt->m_reg->Doorbell) & 10025b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_IOC_STATE_READY) == 0x0) { 10035b504601Sjiang wu - Sun Microsystems - Beijing China drv_usecwait(1000); 10045b504601Sjiang wu - Sun Microsystems - Beijing China if (polls++ > 20000) { 10055b504601Sjiang wu - Sun Microsystems - Beijing China goto hard_reset; 10065b504601Sjiang wu - Sun Microsystems - Beijing China } 10075b504601Sjiang wu - Sun Microsystems - Beijing China } 10085b504601Sjiang wu - Sun Microsystems - Beijing China /* 10095b504601Sjiang wu - Sun Microsystems - Beijing China * the message unit reset would do reset operations 10105b504601Sjiang wu - Sun Microsystems - Beijing China * clear reply and request queue, so we should clear 10115b504601Sjiang wu - Sun Microsystems - Beijing China * ACK event cmd. 10125b504601Sjiang wu - Sun Microsystems - Beijing China */ 10135b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_destroy_ioc_event_cmd(mpt); 10145b504601Sjiang wu - Sun Microsystems - Beijing China return (MPTSAS_NO_RESET); 10155b504601Sjiang wu - Sun Microsystems - Beijing China } 10165b504601Sjiang wu - Sun Microsystems - Beijing China 10175b504601Sjiang wu - Sun Microsystems - Beijing China hard_reset: 10185b504601Sjiang wu - Sun Microsystems - Beijing China #endif 10195b504601Sjiang wu - Sun Microsystems - Beijing China if (mptsas_kick_start(mpt) == DDI_FAILURE) { 10205b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_fm_ereport(mpt, DDI_FM_DEVICE_NO_RESPONSE); 10215b504601Sjiang wu - Sun Microsystems - Beijing China ddi_fm_service_impact(mpt->m_dip, DDI_SERVICE_LOST); 10225b504601Sjiang wu - Sun Microsystems - Beijing China return (MPTSAS_RESET_FAIL); 10235b504601Sjiang wu - Sun Microsystems - Beijing China } 10245b504601Sjiang wu - Sun Microsystems - Beijing China return (MPTSAS_SUCCESS_HARDRESET); 10255b504601Sjiang wu - Sun Microsystems - Beijing China } 10265b504601Sjiang wu - Sun Microsystems - Beijing China 10275b504601Sjiang wu - Sun Microsystems - Beijing China 10285b504601Sjiang wu - Sun Microsystems - Beijing China int 10295b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_request_from_pool(mptsas_t *mpt, mptsas_cmd_t **cmd, 10305b504601Sjiang wu - Sun Microsystems - Beijing China struct scsi_pkt **pkt) 10315b504601Sjiang wu - Sun Microsystems - Beijing China { 10325b504601Sjiang wu - Sun Microsystems - Beijing China m_event_struct_t *ioc_cmd = NULL; 10335b504601Sjiang wu - Sun Microsystems - Beijing China 10345b504601Sjiang wu - Sun Microsystems - Beijing China ioc_cmd = kmem_zalloc(M_EVENT_STRUCT_SIZE, KM_SLEEP); 10355b504601Sjiang wu - Sun Microsystems - Beijing China if (ioc_cmd == NULL) { 10365b504601Sjiang wu - Sun Microsystems - Beijing China return (DDI_FAILURE); 10375b504601Sjiang wu - Sun Microsystems - Beijing China } 10385b504601Sjiang wu - Sun Microsystems - Beijing China ioc_cmd->m_event_linkp = NULL; 10395b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_ioc_event_cmdq_add(mpt, ioc_cmd); 10405b504601Sjiang wu - Sun Microsystems - Beijing China *cmd = &(ioc_cmd->m_event_cmd); 10415b504601Sjiang wu - Sun Microsystems - Beijing China *pkt = &(ioc_cmd->m_event_pkt); 10425b504601Sjiang wu - Sun Microsystems - Beijing China 10435b504601Sjiang wu - Sun Microsystems - Beijing China return (DDI_SUCCESS); 10445b504601Sjiang wu - Sun Microsystems - Beijing China } 10455b504601Sjiang wu - Sun Microsystems - Beijing China 10465b504601Sjiang wu - Sun Microsystems - Beijing China void 10475b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_return_to_pool(mptsas_t *mpt, mptsas_cmd_t *cmd) 10485b504601Sjiang wu - Sun Microsystems - Beijing China { 10495b504601Sjiang wu - Sun Microsystems - Beijing China m_event_struct_t *ioc_cmd = NULL; 10505b504601Sjiang wu - Sun Microsystems - Beijing China 10515b504601Sjiang wu - Sun Microsystems - Beijing China ioc_cmd = mptsas_ioc_event_find_by_cmd(mpt, cmd); 10525b504601Sjiang wu - Sun Microsystems - Beijing China if (ioc_cmd == NULL) { 10535b504601Sjiang wu - Sun Microsystems - Beijing China return; 10545b504601Sjiang wu - Sun Microsystems - Beijing China } 10555b504601Sjiang wu - Sun Microsystems - Beijing China 10565b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_ioc_event_cmdq_delete(mpt, ioc_cmd); 10575b504601Sjiang wu - Sun Microsystems - Beijing China kmem_free(ioc_cmd, M_EVENT_STRUCT_SIZE); 10585b504601Sjiang wu - Sun Microsystems - Beijing China ioc_cmd = NULL; 10595b504601Sjiang wu - Sun Microsystems - Beijing China } 10605b504601Sjiang wu - Sun Microsystems - Beijing China 10615b504601Sjiang wu - Sun Microsystems - Beijing China /* 10625b504601Sjiang wu - Sun Microsystems - Beijing China * NOTE: We should be able to queue TM requests in the controller to make this 10635b504601Sjiang wu - Sun Microsystems - Beijing China * a lot faster. If resetting all targets, for example, we can load the hi 10645b504601Sjiang wu - Sun Microsystems - Beijing China * priority queue with its limit and the controller will reply as they are 10655b504601Sjiang wu - Sun Microsystems - Beijing China * completed. This way, we don't have to poll for one reply at a time. 10665b504601Sjiang wu - Sun Microsystems - Beijing China * Think about enhancing this later. 10675b504601Sjiang wu - Sun Microsystems - Beijing China */ 10685b504601Sjiang wu - Sun Microsystems - Beijing China int 10695b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_ioc_task_management(mptsas_t *mpt, int task_type, uint16_t dev_handle, 10705b504601Sjiang wu - Sun Microsystems - Beijing China int lun) 10715b504601Sjiang wu - Sun Microsystems - Beijing China { 10725b504601Sjiang wu - Sun Microsystems - Beijing China /* 10735b504601Sjiang wu - Sun Microsystems - Beijing China * In order to avoid allocating variables on the stack, 10745b504601Sjiang wu - Sun Microsystems - Beijing China * we make use of the pre-existing mptsas_cmd_t and 10755b504601Sjiang wu - Sun Microsystems - Beijing China * scsi_pkt which are included in the mptsas_t which 10765b504601Sjiang wu - Sun Microsystems - Beijing China * is passed to this routine. 10775b504601Sjiang wu - Sun Microsystems - Beijing China */ 10785b504601Sjiang wu - Sun Microsystems - Beijing China 10795b504601Sjiang wu - Sun Microsystems - Beijing China pMpi2SCSITaskManagementRequest_t task; 10805b504601Sjiang wu - Sun Microsystems - Beijing China int rval = FALSE; 10815b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_cmd_t *cmd; 10825b504601Sjiang wu - Sun Microsystems - Beijing China struct scsi_pkt *pkt; 10835b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_slots_t *slots = mpt->m_active; 1084*08eb0b82SYong-Feng Du uint32_t request_desc_low; 10855b504601Sjiang wu - Sun Microsystems - Beijing China 10865b504601Sjiang wu - Sun Microsystems - Beijing China /* 10875b504601Sjiang wu - Sun Microsystems - Beijing China * Can't start another task management routine. 10885b504601Sjiang wu - Sun Microsystems - Beijing China */ 10895b504601Sjiang wu - Sun Microsystems - Beijing China if (slots->m_slot[MPTSAS_TM_SLOT(mpt)] != NULL) { 10905b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN, "Can only start 1 task management" 10915b504601Sjiang wu - Sun Microsystems - Beijing China " command at a time\n"); 10925b504601Sjiang wu - Sun Microsystems - Beijing China return (FALSE); 10935b504601Sjiang wu - Sun Microsystems - Beijing China } 10945b504601Sjiang wu - Sun Microsystems - Beijing China 10955b504601Sjiang wu - Sun Microsystems - Beijing China cmd = &(mpt->m_event_task_mgmt.m_event_cmd); 10965b504601Sjiang wu - Sun Microsystems - Beijing China pkt = &(mpt->m_event_task_mgmt.m_event_pkt); 10975b504601Sjiang wu - Sun Microsystems - Beijing China 10985b504601Sjiang wu - Sun Microsystems - Beijing China bzero((caddr_t)cmd, sizeof (*cmd)); 10995b504601Sjiang wu - Sun Microsystems - Beijing China bzero((caddr_t)pkt, scsi_pkt_size()); 11005b504601Sjiang wu - Sun Microsystems - Beijing China 11015b504601Sjiang wu - Sun Microsystems - Beijing China pkt->pkt_cdbp = (opaque_t)&cmd->cmd_cdb[0]; 11025b504601Sjiang wu - Sun Microsystems - Beijing China pkt->pkt_scbp = (opaque_t)&cmd->cmd_scb; 11035b504601Sjiang wu - Sun Microsystems - Beijing China pkt->pkt_ha_private = (opaque_t)cmd; 11045b504601Sjiang wu - Sun Microsystems - Beijing China pkt->pkt_flags = (FLAG_NOINTR | FLAG_HEAD); 11055b504601Sjiang wu - Sun Microsystems - Beijing China pkt->pkt_time = 60; 11065b504601Sjiang wu - Sun Microsystems - Beijing China pkt->pkt_address.a_target = dev_handle; 11075b504601Sjiang wu - Sun Microsystems - Beijing China pkt->pkt_address.a_lun = (uchar_t)lun; 11085b504601Sjiang wu - Sun Microsystems - Beijing China cmd->cmd_pkt = pkt; 11095b504601Sjiang wu - Sun Microsystems - Beijing China cmd->cmd_scblen = 1; 11105b504601Sjiang wu - Sun Microsystems - Beijing China cmd->cmd_flags = CFLAG_TM_CMD; 11115b504601Sjiang wu - Sun Microsystems - Beijing China cmd->cmd_slot = MPTSAS_TM_SLOT(mpt); 11125b504601Sjiang wu - Sun Microsystems - Beijing China 11135b504601Sjiang wu - Sun Microsystems - Beijing China slots->m_slot[MPTSAS_TM_SLOT(mpt)] = cmd; 11145b504601Sjiang wu - Sun Microsystems - Beijing China 11155b504601Sjiang wu - Sun Microsystems - Beijing China /* 11165b504601Sjiang wu - Sun Microsystems - Beijing China * Store the TM message in memory location corresponding to the TM slot 11175b504601Sjiang wu - Sun Microsystems - Beijing China * number. 11185b504601Sjiang wu - Sun Microsystems - Beijing China */ 11195b504601Sjiang wu - Sun Microsystems - Beijing China task = (pMpi2SCSITaskManagementRequest_t)(mpt->m_req_frame + 11205b504601Sjiang wu - Sun Microsystems - Beijing China (mpt->m_req_frame_size * cmd->cmd_slot)); 11215b504601Sjiang wu - Sun Microsystems - Beijing China bzero(task, mpt->m_req_frame_size); 11225b504601Sjiang wu - Sun Microsystems - Beijing China 11235b504601Sjiang wu - Sun Microsystems - Beijing China /* 11245b504601Sjiang wu - Sun Microsystems - Beijing China * form message for requested task 11255b504601Sjiang wu - Sun Microsystems - Beijing China */ 11265b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_init_std_hdr(mpt->m_acc_req_frame_hdl, task, dev_handle, lun, 0, 11275b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_FUNCTION_SCSI_TASK_MGMT); 11285b504601Sjiang wu - Sun Microsystems - Beijing China 11295b504601Sjiang wu - Sun Microsystems - Beijing China /* 11305b504601Sjiang wu - Sun Microsystems - Beijing China * Set the task type 11315b504601Sjiang wu - Sun Microsystems - Beijing China */ 11325b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put8(mpt->m_acc_req_frame_hdl, &task->TaskType, task_type); 11335b504601Sjiang wu - Sun Microsystems - Beijing China 11345b504601Sjiang wu - Sun Microsystems - Beijing China /* 11355b504601Sjiang wu - Sun Microsystems - Beijing China * Send TM request using High Priority Queue. 11365b504601Sjiang wu - Sun Microsystems - Beijing China */ 11375b504601Sjiang wu - Sun Microsystems - Beijing China (void) ddi_dma_sync(mpt->m_dma_req_frame_hdl, 0, 0, 11385b504601Sjiang wu - Sun Microsystems - Beijing China DDI_DMA_SYNC_FORDEV); 11395b504601Sjiang wu - Sun Microsystems - Beijing China request_desc_low = (cmd->cmd_slot << 16) + 11405b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_REQ_DESCRIPT_FLAGS_HIGH_PRIORITY; 11415b504601Sjiang wu - Sun Microsystems - Beijing China MPTSAS_START_CMD(mpt, request_desc_low, 0); 11425b504601Sjiang wu - Sun Microsystems - Beijing China rval = mptsas_poll(mpt, cmd, MPTSAS_POLL_TIME); 11435b504601Sjiang wu - Sun Microsystems - Beijing China 11445b504601Sjiang wu - Sun Microsystems - Beijing China if (pkt->pkt_reason == CMD_INCOMPLETE) 11455b504601Sjiang wu - Sun Microsystems - Beijing China rval = FALSE; 11465b504601Sjiang wu - Sun Microsystems - Beijing China 11475b504601Sjiang wu - Sun Microsystems - Beijing China /* 11485b504601Sjiang wu - Sun Microsystems - Beijing China * clear the TM slot before returning 11495b504601Sjiang wu - Sun Microsystems - Beijing China */ 11505b504601Sjiang wu - Sun Microsystems - Beijing China slots->m_slot[MPTSAS_TM_SLOT(mpt)] = NULL; 11515b504601Sjiang wu - Sun Microsystems - Beijing China 11525b504601Sjiang wu - Sun Microsystems - Beijing China /* 11535b504601Sjiang wu - Sun Microsystems - Beijing China * If we lost our task management command 11545b504601Sjiang wu - Sun Microsystems - Beijing China * we need to reset the ioc 11555b504601Sjiang wu - Sun Microsystems - Beijing China */ 11565b504601Sjiang wu - Sun Microsystems - Beijing China if (rval == FALSE) { 11575b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN, "mptsas_ioc_task_management failed " 11585b504601Sjiang wu - Sun Microsystems - Beijing China "try to reset ioc to recovery!"); 11595b504601Sjiang wu - Sun Microsystems - Beijing China if (mptsas_restart_ioc(mpt)) { 11605b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN, "mptsas_restart_ioc failed"); 11615b504601Sjiang wu - Sun Microsystems - Beijing China rval = FAILED; 11625b504601Sjiang wu - Sun Microsystems - Beijing China } 11635b504601Sjiang wu - Sun Microsystems - Beijing China } 11645b504601Sjiang wu - Sun Microsystems - Beijing China 11655b504601Sjiang wu - Sun Microsystems - Beijing China return (rval); 11665b504601Sjiang wu - Sun Microsystems - Beijing China } 11675b504601Sjiang wu - Sun Microsystems - Beijing China 11685b504601Sjiang wu - Sun Microsystems - Beijing China int 11695b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_update_flash(mptsas_t *mpt, caddr_t ptrbuffer, uint32_t size, 11705b504601Sjiang wu - Sun Microsystems - Beijing China uint8_t type, int mode) 11715b504601Sjiang wu - Sun Microsystems - Beijing China { 11725b504601Sjiang wu - Sun Microsystems - Beijing China 11735b504601Sjiang wu - Sun Microsystems - Beijing China /* 11745b504601Sjiang wu - Sun Microsystems - Beijing China * In order to avoid allocating variables on the stack, 11755b504601Sjiang wu - Sun Microsystems - Beijing China * we make use of the pre-existing mptsas_cmd_t and 11765b504601Sjiang wu - Sun Microsystems - Beijing China * scsi_pkt which are included in the mptsas_t which 11775b504601Sjiang wu - Sun Microsystems - Beijing China * is passed to this routine. 11785b504601Sjiang wu - Sun Microsystems - Beijing China */ 11795b504601Sjiang wu - Sun Microsystems - Beijing China 11805b504601Sjiang wu - Sun Microsystems - Beijing China ddi_dma_attr_t flsh_dma_attrs; 11815b504601Sjiang wu - Sun Microsystems - Beijing China uint_t flsh_ncookie; 11825b504601Sjiang wu - Sun Microsystems - Beijing China ddi_dma_cookie_t flsh_cookie; 11835b504601Sjiang wu - Sun Microsystems - Beijing China ddi_dma_handle_t flsh_dma_handle; 11845b504601Sjiang wu - Sun Microsystems - Beijing China ddi_acc_handle_t flsh_accessp; 11855b504601Sjiang wu - Sun Microsystems - Beijing China size_t flsh_alloc_len; 11865b504601Sjiang wu - Sun Microsystems - Beijing China caddr_t memp, flsh_memp; 11875b504601Sjiang wu - Sun Microsystems - Beijing China uint32_t flagslength; 11885b504601Sjiang wu - Sun Microsystems - Beijing China pMpi2FWDownloadRequest fwdownload; 11895b504601Sjiang wu - Sun Microsystems - Beijing China pMpi2FWDownloadTCSGE_t tcsge; 11905b504601Sjiang wu - Sun Microsystems - Beijing China pMpi2SGESimple64_t sge; 11915b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_cmd_t *cmd; 11925b504601Sjiang wu - Sun Microsystems - Beijing China struct scsi_pkt *pkt; 11935b504601Sjiang wu - Sun Microsystems - Beijing China int i; 11945b504601Sjiang wu - Sun Microsystems - Beijing China int rvalue = 0; 11955b504601Sjiang wu - Sun Microsystems - Beijing China uint32_t request_desc_low; 11965b504601Sjiang wu - Sun Microsystems - Beijing China 11975b504601Sjiang wu - Sun Microsystems - Beijing China if ((rvalue = (mptsas_request_from_pool(mpt, &cmd, &pkt))) == -1) { 11985b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN, "mptsas_update_flash(): allocation " 11995b504601Sjiang wu - Sun Microsystems - Beijing China "failed. event ack command pool is full\n"); 12005b504601Sjiang wu - Sun Microsystems - Beijing China return (rvalue); 12015b504601Sjiang wu - Sun Microsystems - Beijing China } 12025b504601Sjiang wu - Sun Microsystems - Beijing China 12035b504601Sjiang wu - Sun Microsystems - Beijing China bzero((caddr_t)cmd, sizeof (*cmd)); 12045b504601Sjiang wu - Sun Microsystems - Beijing China bzero((caddr_t)pkt, scsi_pkt_size()); 12055b504601Sjiang wu - Sun Microsystems - Beijing China cmd->ioc_cmd_slot = (uint32_t)rvalue; 12065b504601Sjiang wu - Sun Microsystems - Beijing China 12075b504601Sjiang wu - Sun Microsystems - Beijing China /* 12085b504601Sjiang wu - Sun Microsystems - Beijing China * dynamically create a customized dma attribute structure 12095b504601Sjiang wu - Sun Microsystems - Beijing China * that describes the flash file. 12105b504601Sjiang wu - Sun Microsystems - Beijing China */ 12115b504601Sjiang wu - Sun Microsystems - Beijing China flsh_dma_attrs = mpt->m_msg_dma_attr; 12125b504601Sjiang wu - Sun Microsystems - Beijing China flsh_dma_attrs.dma_attr_sgllen = 1; 12135b504601Sjiang wu - Sun Microsystems - Beijing China 12145b504601Sjiang wu - Sun Microsystems - Beijing China if (ddi_dma_alloc_handle(mpt->m_dip, &flsh_dma_attrs, 12155b504601Sjiang wu - Sun Microsystems - Beijing China DDI_DMA_SLEEP, NULL, &flsh_dma_handle) != DDI_SUCCESS) { 12165b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN, 12175b504601Sjiang wu - Sun Microsystems - Beijing China "(unable to allocate dma handle."); 12185b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_return_to_pool(mpt, cmd); 12195b504601Sjiang wu - Sun Microsystems - Beijing China return (-1); 12205b504601Sjiang wu - Sun Microsystems - Beijing China } 12215b504601Sjiang wu - Sun Microsystems - Beijing China 12225b504601Sjiang wu - Sun Microsystems - Beijing China if (ddi_dma_mem_alloc(flsh_dma_handle, size, 12235b504601Sjiang wu - Sun Microsystems - Beijing China &mpt->m_dev_acc_attr, DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, NULL, 12245b504601Sjiang wu - Sun Microsystems - Beijing China &flsh_memp, &flsh_alloc_len, &flsh_accessp) != DDI_SUCCESS) { 12255b504601Sjiang wu - Sun Microsystems - Beijing China ddi_dma_free_handle(&flsh_dma_handle); 12265b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN, 12275b504601Sjiang wu - Sun Microsystems - Beijing China "unable to allocate flash structure."); 12285b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_return_to_pool(mpt, cmd); 12295b504601Sjiang wu - Sun Microsystems - Beijing China return (-1); 12305b504601Sjiang wu - Sun Microsystems - Beijing China } 12315b504601Sjiang wu - Sun Microsystems - Beijing China 12325b504601Sjiang wu - Sun Microsystems - Beijing China if (ddi_dma_addr_bind_handle(flsh_dma_handle, NULL, flsh_memp, 12335b504601Sjiang wu - Sun Microsystems - Beijing China flsh_alloc_len, DDI_DMA_RDWR | DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, 12345b504601Sjiang wu - Sun Microsystems - Beijing China NULL, &flsh_cookie, &flsh_ncookie) != DDI_DMA_MAPPED) { 12355b504601Sjiang wu - Sun Microsystems - Beijing China (void) ddi_dma_mem_free(&flsh_accessp); 12365b504601Sjiang wu - Sun Microsystems - Beijing China ddi_dma_free_handle(&flsh_dma_handle); 12375b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN, "unable to bind DMA resources."); 12385b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_return_to_pool(mpt, cmd); 12395b504601Sjiang wu - Sun Microsystems - Beijing China return (-1); 12405b504601Sjiang wu - Sun Microsystems - Beijing China } 12415b504601Sjiang wu - Sun Microsystems - Beijing China bzero(flsh_memp, size); 12425b504601Sjiang wu - Sun Microsystems - Beijing China 12435b504601Sjiang wu - Sun Microsystems - Beijing China for (i = 0; i < size; i++) { 12445b504601Sjiang wu - Sun Microsystems - Beijing China (void) ddi_copyin(ptrbuffer + i, flsh_memp + i, 1, mode); 12455b504601Sjiang wu - Sun Microsystems - Beijing China } 12465b504601Sjiang wu - Sun Microsystems - Beijing China (void) ddi_dma_sync(flsh_dma_handle, 0, 0, DDI_DMA_SYNC_FORDEV); 12475b504601Sjiang wu - Sun Microsystems - Beijing China 12485b504601Sjiang wu - Sun Microsystems - Beijing China /* 12495b504601Sjiang wu - Sun Microsystems - Beijing China * form a cmd/pkt to store the fw download message 12505b504601Sjiang wu - Sun Microsystems - Beijing China */ 12515b504601Sjiang wu - Sun Microsystems - Beijing China pkt->pkt_cdbp = (opaque_t)&cmd->cmd_cdb[0]; 12525b504601Sjiang wu - Sun Microsystems - Beijing China pkt->pkt_scbp = (opaque_t)&cmd->cmd_scb; 12535b504601Sjiang wu - Sun Microsystems - Beijing China pkt->pkt_ha_private = (opaque_t)cmd; 12545b504601Sjiang wu - Sun Microsystems - Beijing China pkt->pkt_flags = FLAG_HEAD; 12555b504601Sjiang wu - Sun Microsystems - Beijing China pkt->pkt_time = 60; 12565b504601Sjiang wu - Sun Microsystems - Beijing China cmd->cmd_pkt = pkt; 12575b504601Sjiang wu - Sun Microsystems - Beijing China cmd->cmd_scblen = 1; 12585b504601Sjiang wu - Sun Microsystems - Beijing China cmd->cmd_flags = CFLAG_CMDIOC | CFLAG_FW_CMD; 12595b504601Sjiang wu - Sun Microsystems - Beijing China 12605b504601Sjiang wu - Sun Microsystems - Beijing China /* 12615b504601Sjiang wu - Sun Microsystems - Beijing China * Save the command in a slot 12625b504601Sjiang wu - Sun Microsystems - Beijing China */ 12635b504601Sjiang wu - Sun Microsystems - Beijing China if (mptsas_save_cmd(mpt, cmd) == FALSE) { 12645b504601Sjiang wu - Sun Microsystems - Beijing China (void) ddi_dma_unbind_handle(flsh_dma_handle); 12655b504601Sjiang wu - Sun Microsystems - Beijing China (void) ddi_dma_mem_free(&flsh_accessp); 12665b504601Sjiang wu - Sun Microsystems - Beijing China ddi_dma_free_handle(&flsh_dma_handle); 12675b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_return_to_pool(mpt, cmd); 12685b504601Sjiang wu - Sun Microsystems - Beijing China return (-1); 12695b504601Sjiang wu - Sun Microsystems - Beijing China } 12705b504601Sjiang wu - Sun Microsystems - Beijing China 12715b504601Sjiang wu - Sun Microsystems - Beijing China /* 12725b504601Sjiang wu - Sun Microsystems - Beijing China * Fill in fw download message 12735b504601Sjiang wu - Sun Microsystems - Beijing China */ 12745b504601Sjiang wu - Sun Microsystems - Beijing China ASSERT(cmd->cmd_slot != 0); 12755b504601Sjiang wu - Sun Microsystems - Beijing China memp = mpt->m_req_frame + (mpt->m_req_frame_size * cmd->cmd_slot); 12765b504601Sjiang wu - Sun Microsystems - Beijing China bzero(memp, mpt->m_req_frame_size); 12775b504601Sjiang wu - Sun Microsystems - Beijing China fwdownload = (void *)memp; 12785b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put8(mpt->m_acc_req_frame_hdl, &fwdownload->Function, 12795b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_FUNCTION_FW_DOWNLOAD); 12805b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put8(mpt->m_acc_req_frame_hdl, &fwdownload->ImageType, type); 12815b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put8(mpt->m_acc_req_frame_hdl, &fwdownload->MsgFlags, 12825b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_FW_DOWNLOAD_MSGFLGS_LAST_SEGMENT); 12835b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put32(mpt->m_acc_req_frame_hdl, &fwdownload->TotalImageSize, size); 12845b504601Sjiang wu - Sun Microsystems - Beijing China 12855b504601Sjiang wu - Sun Microsystems - Beijing China tcsge = (pMpi2FWDownloadTCSGE_t)&fwdownload->SGL; 12865b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put8(mpt->m_acc_req_frame_hdl, &tcsge->ContextSize, 0); 12875b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put8(mpt->m_acc_req_frame_hdl, &tcsge->DetailsLength, 12); 12885b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put8(mpt->m_acc_req_frame_hdl, &tcsge->Flags, 0); 12895b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put32(mpt->m_acc_req_frame_hdl, &tcsge->ImageOffset, 0); 12905b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put32(mpt->m_acc_req_frame_hdl, &tcsge->ImageSize, size); 12915b504601Sjiang wu - Sun Microsystems - Beijing China 12925b504601Sjiang wu - Sun Microsystems - Beijing China sge = (pMpi2SGESimple64_t)(tcsge + 1); 12935b504601Sjiang wu - Sun Microsystems - Beijing China flagslength = size; 12945b504601Sjiang wu - Sun Microsystems - Beijing China flagslength |= ((uint32_t)(MPI2_SGE_FLAGS_LAST_ELEMENT | 12955b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_SGE_FLAGS_END_OF_BUFFER | 12965b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_SGE_FLAGS_SIMPLE_ELEMENT | 12975b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_SGE_FLAGS_SYSTEM_ADDRESS | 12985b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_SGE_FLAGS_64_BIT_ADDRESSING | 12995b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_SGE_FLAGS_HOST_TO_IOC | 13005b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_SGE_FLAGS_END_OF_LIST) << MPI2_SGE_FLAGS_SHIFT); 13015b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put32(mpt->m_acc_req_frame_hdl, &sge->FlagsLength, flagslength); 13025b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put32(mpt->m_acc_req_frame_hdl, &sge->Address.Low, 13035b504601Sjiang wu - Sun Microsystems - Beijing China flsh_cookie.dmac_address); 13045b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put32(mpt->m_acc_req_frame_hdl, &sge->Address.High, 13055b504601Sjiang wu - Sun Microsystems - Beijing China (uint32_t)(flsh_cookie.dmac_laddress >> 32)); 13065b504601Sjiang wu - Sun Microsystems - Beijing China 13075b504601Sjiang wu - Sun Microsystems - Beijing China /* 13085b504601Sjiang wu - Sun Microsystems - Beijing China * Start command 13095b504601Sjiang wu - Sun Microsystems - Beijing China */ 13105b504601Sjiang wu - Sun Microsystems - Beijing China (void) ddi_dma_sync(mpt->m_dma_req_frame_hdl, 0, 0, 13115b504601Sjiang wu - Sun Microsystems - Beijing China DDI_DMA_SYNC_FORDEV); 13125b504601Sjiang wu - Sun Microsystems - Beijing China request_desc_low = (cmd->cmd_slot << 16) + 13135b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_REQ_DESCRIPT_FLAGS_DEFAULT_TYPE; 13145b504601Sjiang wu - Sun Microsystems - Beijing China cmd->cmd_rfm = NULL; 13155b504601Sjiang wu - Sun Microsystems - Beijing China MPTSAS_START_CMD(mpt, request_desc_low, 0); 13165b504601Sjiang wu - Sun Microsystems - Beijing China 13175b504601Sjiang wu - Sun Microsystems - Beijing China rvalue = 0; 13185b504601Sjiang wu - Sun Microsystems - Beijing China (void) cv_timedwait(&mpt->m_fw_cv, &mpt->m_mutex, 13195b504601Sjiang wu - Sun Microsystems - Beijing China MPTSAS_CV_TIMEOUT(60)); 13205b504601Sjiang wu - Sun Microsystems - Beijing China if (!(cmd->cmd_flags & CFLAG_FINISHED)) { 13215b504601Sjiang wu - Sun Microsystems - Beijing China if ((mptsas_restart_ioc(mpt)) == DDI_FAILURE) { 13225b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN, "mptsas_restart_ioc failed"); 13235b504601Sjiang wu - Sun Microsystems - Beijing China } 13245b504601Sjiang wu - Sun Microsystems - Beijing China rvalue = -1; 13255b504601Sjiang wu - Sun Microsystems - Beijing China } 13265b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_remove_cmd(mpt, cmd); 13275b504601Sjiang wu - Sun Microsystems - Beijing China 13285b504601Sjiang wu - Sun Microsystems - Beijing China (void) ddi_dma_unbind_handle(flsh_dma_handle); 13295b504601Sjiang wu - Sun Microsystems - Beijing China (void) ddi_dma_mem_free(&flsh_accessp); 13305b504601Sjiang wu - Sun Microsystems - Beijing China ddi_dma_free_handle(&flsh_dma_handle); 13315b504601Sjiang wu - Sun Microsystems - Beijing China 13325b504601Sjiang wu - Sun Microsystems - Beijing China return (rvalue); 13335b504601Sjiang wu - Sun Microsystems - Beijing China } 13345b504601Sjiang wu - Sun Microsystems - Beijing China 13355b504601Sjiang wu - Sun Microsystems - Beijing China static int 13365b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_sasdevpage_0_cb(mptsas_t *mpt, caddr_t page_memp, 13375b504601Sjiang wu - Sun Microsystems - Beijing China ddi_acc_handle_t accessp, uint16_t iocstatus, uint32_t iocloginfo, 13385b504601Sjiang wu - Sun Microsystems - Beijing China va_list ap) 13395b504601Sjiang wu - Sun Microsystems - Beijing China { 13405b504601Sjiang wu - Sun Microsystems - Beijing China #ifndef __lock_lint 13415b504601Sjiang wu - Sun Microsystems - Beijing China _NOTE(ARGUNUSED(ap)) 13425b504601Sjiang wu - Sun Microsystems - Beijing China #endif 13435b504601Sjiang wu - Sun Microsystems - Beijing China pMpi2SasDevicePage0_t sasdevpage; 13445b504601Sjiang wu - Sun Microsystems - Beijing China int rval = DDI_SUCCESS, i; 13455b504601Sjiang wu - Sun Microsystems - Beijing China uint8_t *sas_addr = NULL; 13465b504601Sjiang wu - Sun Microsystems - Beijing China uint8_t tmp_sas_wwn[SAS_WWN_BYTE_SIZE]; 13475b504601Sjiang wu - Sun Microsystems - Beijing China uint16_t *devhdl; 13485b504601Sjiang wu - Sun Microsystems - Beijing China uint64_t *sas_wwn; 13495b504601Sjiang wu - Sun Microsystems - Beijing China uint32_t *dev_info; 13505b504601Sjiang wu - Sun Microsystems - Beijing China uint8_t *physport, *phynum; 13515b504601Sjiang wu - Sun Microsystems - Beijing China uint32_t page_address; 13525b504601Sjiang wu - Sun Microsystems - Beijing China 13535b504601Sjiang wu - Sun Microsystems - Beijing China if ((iocstatus != MPI2_IOCSTATUS_SUCCESS) && 13545b504601Sjiang wu - Sun Microsystems - Beijing China (iocstatus != MPI2_IOCSTATUS_CONFIG_INVALID_PAGE)) { 13555b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN, "mptsas_get_sas_device_page0 " 13565b504601Sjiang wu - Sun Microsystems - Beijing China "header: IOCStatus=0x%x, IOCLogInfo=0x%x", 13575b504601Sjiang wu - Sun Microsystems - Beijing China iocstatus, iocloginfo); 13585b504601Sjiang wu - Sun Microsystems - Beijing China rval = DDI_FAILURE; 13595b504601Sjiang wu - Sun Microsystems - Beijing China return (rval); 13605b504601Sjiang wu - Sun Microsystems - Beijing China } 13615b504601Sjiang wu - Sun Microsystems - Beijing China page_address = va_arg(ap, uint32_t); 13625b504601Sjiang wu - Sun Microsystems - Beijing China /* 13635b504601Sjiang wu - Sun Microsystems - Beijing China * The INVALID_PAGE status is normal if using GET_NEXT_HANDLE and there 13645b504601Sjiang wu - Sun Microsystems - Beijing China * are no more pages. If everything is OK up to this point but the 13655b504601Sjiang wu - Sun Microsystems - Beijing China * status is INVALID_PAGE, change rval to FAILURE and quit. Also, 13665b504601Sjiang wu - Sun Microsystems - Beijing China * signal that device traversal is complete. 13675b504601Sjiang wu - Sun Microsystems - Beijing China */ 13685b504601Sjiang wu - Sun Microsystems - Beijing China if (iocstatus == MPI2_IOCSTATUS_CONFIG_INVALID_PAGE) { 13695b504601Sjiang wu - Sun Microsystems - Beijing China if ((page_address & MPI2_SAS_DEVICE_PGAD_FORM_MASK) == 13705b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_SAS_DEVICE_PGAD_FORM_GET_NEXT_HANDLE) { 13715b504601Sjiang wu - Sun Microsystems - Beijing China mpt->m_done_traverse_dev = 1; 13725b504601Sjiang wu - Sun Microsystems - Beijing China } 13735b504601Sjiang wu - Sun Microsystems - Beijing China rval = DDI_FAILURE; 13745b504601Sjiang wu - Sun Microsystems - Beijing China return (rval); 13755b504601Sjiang wu - Sun Microsystems - Beijing China } 13765b504601Sjiang wu - Sun Microsystems - Beijing China devhdl = va_arg(ap, uint16_t *); 13775b504601Sjiang wu - Sun Microsystems - Beijing China sas_wwn = va_arg(ap, uint64_t *); 13785b504601Sjiang wu - Sun Microsystems - Beijing China dev_info = va_arg(ap, uint32_t *); 13795b504601Sjiang wu - Sun Microsystems - Beijing China physport = va_arg(ap, uint8_t *); 13805b504601Sjiang wu - Sun Microsystems - Beijing China phynum = va_arg(ap, uint8_t *); 13815b504601Sjiang wu - Sun Microsystems - Beijing China 13825b504601Sjiang wu - Sun Microsystems - Beijing China sasdevpage = (pMpi2SasDevicePage0_t)page_memp; 13835b504601Sjiang wu - Sun Microsystems - Beijing China 13845b504601Sjiang wu - Sun Microsystems - Beijing China *dev_info = ddi_get32(accessp, &sasdevpage->DeviceInfo); 13855b504601Sjiang wu - Sun Microsystems - Beijing China *devhdl = ddi_get16(accessp, &sasdevpage->DevHandle); 13865b504601Sjiang wu - Sun Microsystems - Beijing China sas_addr = (uint8_t *)(&sasdevpage->SASAddress); 13875b504601Sjiang wu - Sun Microsystems - Beijing China for (i = 0; i < SAS_WWN_BYTE_SIZE; i++) { 13885b504601Sjiang wu - Sun Microsystems - Beijing China tmp_sas_wwn[i] = ddi_get8(accessp, sas_addr + i); 13895b504601Sjiang wu - Sun Microsystems - Beijing China } 13905b504601Sjiang wu - Sun Microsystems - Beijing China bcopy(tmp_sas_wwn, sas_wwn, SAS_WWN_BYTE_SIZE); 13915b504601Sjiang wu - Sun Microsystems - Beijing China *sas_wwn = LE_64(*sas_wwn); 13925b504601Sjiang wu - Sun Microsystems - Beijing China *physport = ddi_get8(accessp, &sasdevpage->PhysicalPort); 13935b504601Sjiang wu - Sun Microsystems - Beijing China *phynum = ddi_get8(accessp, &sasdevpage->PhyNum); 13945b504601Sjiang wu - Sun Microsystems - Beijing China return (rval); 13955b504601Sjiang wu - Sun Microsystems - Beijing China } 13965b504601Sjiang wu - Sun Microsystems - Beijing China 13975b504601Sjiang wu - Sun Microsystems - Beijing China /* 13985b504601Sjiang wu - Sun Microsystems - Beijing China * Request MPI configuration page SAS device page 0 to get DevHandle, device 13995b504601Sjiang wu - Sun Microsystems - Beijing China * info and SAS address. 14005b504601Sjiang wu - Sun Microsystems - Beijing China */ 14015b504601Sjiang wu - Sun Microsystems - Beijing China int 14025b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_get_sas_device_page0(mptsas_t *mpt, uint32_t page_address, 14035b504601Sjiang wu - Sun Microsystems - Beijing China uint16_t *dev_handle, uint64_t *sas_wwn, uint32_t *dev_info, 14045b504601Sjiang wu - Sun Microsystems - Beijing China uint8_t *physport, uint8_t *phynum) 14055b504601Sjiang wu - Sun Microsystems - Beijing China { 14065b504601Sjiang wu - Sun Microsystems - Beijing China int rval = DDI_SUCCESS; 14075b504601Sjiang wu - Sun Microsystems - Beijing China 14085b504601Sjiang wu - Sun Microsystems - Beijing China ASSERT(mutex_owned(&mpt->m_mutex)); 14095b504601Sjiang wu - Sun Microsystems - Beijing China 14105b504601Sjiang wu - Sun Microsystems - Beijing China /* 14115b504601Sjiang wu - Sun Microsystems - Beijing China * Get the header and config page. reply contains the reply frame, 14125b504601Sjiang wu - Sun Microsystems - Beijing China * which holds status info for the request. 14135b504601Sjiang wu - Sun Microsystems - Beijing China */ 14145b504601Sjiang wu - Sun Microsystems - Beijing China rval = mptsas_access_config_page(mpt, 14155b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_CONFIG_ACTION_PAGE_READ_CURRENT, 14165b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_CONFIG_EXTPAGETYPE_SAS_DEVICE, 0, page_address, 14175b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_sasdevpage_0_cb, page_address, dev_handle, sas_wwn, 14185b504601Sjiang wu - Sun Microsystems - Beijing China dev_info, physport, phynum); 14195b504601Sjiang wu - Sun Microsystems - Beijing China 14205b504601Sjiang wu - Sun Microsystems - Beijing China return (rval); 14215b504601Sjiang wu - Sun Microsystems - Beijing China } 14225b504601Sjiang wu - Sun Microsystems - Beijing China 14235b504601Sjiang wu - Sun Microsystems - Beijing China static int 14245b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_sasexpdpage_0_cb(mptsas_t *mpt, caddr_t page_memp, 14255b504601Sjiang wu - Sun Microsystems - Beijing China ddi_acc_handle_t accessp, uint16_t iocstatus, uint32_t iocloginfo, 14265b504601Sjiang wu - Sun Microsystems - Beijing China va_list ap) 14275b504601Sjiang wu - Sun Microsystems - Beijing China { 14285b504601Sjiang wu - Sun Microsystems - Beijing China #ifndef __lock_lint 14295b504601Sjiang wu - Sun Microsystems - Beijing China _NOTE(ARGUNUSED(ap)) 14305b504601Sjiang wu - Sun Microsystems - Beijing China #endif 14315b504601Sjiang wu - Sun Microsystems - Beijing China pMpi2ExpanderPage0_t expddevpage; 14325b504601Sjiang wu - Sun Microsystems - Beijing China int rval = DDI_SUCCESS, i; 14335b504601Sjiang wu - Sun Microsystems - Beijing China uint8_t *sas_addr = NULL; 14345b504601Sjiang wu - Sun Microsystems - Beijing China uint8_t tmp_sas_wwn[SAS_WWN_BYTE_SIZE]; 14355b504601Sjiang wu - Sun Microsystems - Beijing China uint16_t *devhdl; 14365b504601Sjiang wu - Sun Microsystems - Beijing China uint64_t *sas_wwn; 14375b504601Sjiang wu - Sun Microsystems - Beijing China uint8_t physport, *phymask; 14385b504601Sjiang wu - Sun Microsystems - Beijing China uint32_t page_address; 14395b504601Sjiang wu - Sun Microsystems - Beijing China 14405b504601Sjiang wu - Sun Microsystems - Beijing China if ((iocstatus != MPI2_IOCSTATUS_SUCCESS) && 14415b504601Sjiang wu - Sun Microsystems - Beijing China (iocstatus != MPI2_IOCSTATUS_CONFIG_INVALID_PAGE)) { 14425b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN, "mptsas_get_sas_expander_page0 " 14435b504601Sjiang wu - Sun Microsystems - Beijing China "config: IOCStatus=0x%x, IOCLogInfo=0x%x", 14445b504601Sjiang wu - Sun Microsystems - Beijing China iocstatus, iocloginfo); 14455b504601Sjiang wu - Sun Microsystems - Beijing China rval = DDI_FAILURE; 14465b504601Sjiang wu - Sun Microsystems - Beijing China return (rval); 14475b504601Sjiang wu - Sun Microsystems - Beijing China } 14485b504601Sjiang wu - Sun Microsystems - Beijing China page_address = va_arg(ap, uint32_t); 14495b504601Sjiang wu - Sun Microsystems - Beijing China /* 14505b504601Sjiang wu - Sun Microsystems - Beijing China * The INVALID_PAGE status is normal if using GET_NEXT_HANDLE and there 14515b504601Sjiang wu - Sun Microsystems - Beijing China * are no more pages. If everything is OK up to this point but the 14525b504601Sjiang wu - Sun Microsystems - Beijing China * status is INVALID_PAGE, change rval to FAILURE and quit. Also, 14535b504601Sjiang wu - Sun Microsystems - Beijing China * signal that device traversal is complete. 14545b504601Sjiang wu - Sun Microsystems - Beijing China */ 14555b504601Sjiang wu - Sun Microsystems - Beijing China if (iocstatus == MPI2_IOCSTATUS_CONFIG_INVALID_PAGE) { 14565b504601Sjiang wu - Sun Microsystems - Beijing China if ((page_address & MPI2_SAS_EXPAND_PGAD_FORM_MASK) == 14575b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_SAS_EXPAND_PGAD_FORM_GET_NEXT_HNDL) { 14585b504601Sjiang wu - Sun Microsystems - Beijing China mpt->m_done_traverse_smp = 1; 14595b504601Sjiang wu - Sun Microsystems - Beijing China } 14605b504601Sjiang wu - Sun Microsystems - Beijing China rval = DDI_FAILURE; 14615b504601Sjiang wu - Sun Microsystems - Beijing China return (rval); 14625b504601Sjiang wu - Sun Microsystems - Beijing China } 14635b504601Sjiang wu - Sun Microsystems - Beijing China devhdl = va_arg(ap, uint16_t *); 14645b504601Sjiang wu - Sun Microsystems - Beijing China sas_wwn = va_arg(ap, uint64_t *); 14655b504601Sjiang wu - Sun Microsystems - Beijing China phymask = va_arg(ap, uint8_t *); 14665b504601Sjiang wu - Sun Microsystems - Beijing China 14675b504601Sjiang wu - Sun Microsystems - Beijing China expddevpage = (pMpi2ExpanderPage0_t)page_memp; 14685b504601Sjiang wu - Sun Microsystems - Beijing China 14695b504601Sjiang wu - Sun Microsystems - Beijing China *devhdl = ddi_get16(accessp, &expddevpage->DevHandle); 14705b504601Sjiang wu - Sun Microsystems - Beijing China physport = ddi_get8(accessp, &expddevpage->PhysicalPort); 14715b504601Sjiang wu - Sun Microsystems - Beijing China *phymask = mptsas_physport_to_phymask(mpt, physport); 14725b504601Sjiang wu - Sun Microsystems - Beijing China sas_addr = (uint8_t *)(&expddevpage->SASAddress); 14735b504601Sjiang wu - Sun Microsystems - Beijing China for (i = 0; i < SAS_WWN_BYTE_SIZE; i++) { 14745b504601Sjiang wu - Sun Microsystems - Beijing China tmp_sas_wwn[i] = ddi_get8(accessp, sas_addr + i); 14755b504601Sjiang wu - Sun Microsystems - Beijing China } 14765b504601Sjiang wu - Sun Microsystems - Beijing China bcopy(tmp_sas_wwn, sas_wwn, SAS_WWN_BYTE_SIZE); 14775b504601Sjiang wu - Sun Microsystems - Beijing China *sas_wwn = LE_64(*sas_wwn); 14785b504601Sjiang wu - Sun Microsystems - Beijing China return (rval); 14795b504601Sjiang wu - Sun Microsystems - Beijing China } 14805b504601Sjiang wu - Sun Microsystems - Beijing China 14815b504601Sjiang wu - Sun Microsystems - Beijing China /* 14825b504601Sjiang wu - Sun Microsystems - Beijing China * Request MPI configuration page SAS device page 0 to get DevHandle, phymask 14835b504601Sjiang wu - Sun Microsystems - Beijing China * and SAS address. 14845b504601Sjiang wu - Sun Microsystems - Beijing China */ 14855b504601Sjiang wu - Sun Microsystems - Beijing China int 14865b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_get_sas_expander_page0(mptsas_t *mpt, uint32_t page_address, 14875b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_smp_t *info) 14885b504601Sjiang wu - Sun Microsystems - Beijing China { 14895b504601Sjiang wu - Sun Microsystems - Beijing China int rval = DDI_SUCCESS; 14905b504601Sjiang wu - Sun Microsystems - Beijing China 14915b504601Sjiang wu - Sun Microsystems - Beijing China ASSERT(mutex_owned(&mpt->m_mutex)); 14925b504601Sjiang wu - Sun Microsystems - Beijing China 14935b504601Sjiang wu - Sun Microsystems - Beijing China /* 14945b504601Sjiang wu - Sun Microsystems - Beijing China * Get the header and config page. reply contains the reply frame, 14955b504601Sjiang wu - Sun Microsystems - Beijing China * which holds status info for the request. 14965b504601Sjiang wu - Sun Microsystems - Beijing China */ 14975b504601Sjiang wu - Sun Microsystems - Beijing China rval = mptsas_access_config_page(mpt, 14985b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_CONFIG_ACTION_PAGE_READ_CURRENT, 14995b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_CONFIG_EXTPAGETYPE_SAS_EXPANDER, 0, page_address, 15005b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_sasexpdpage_0_cb, page_address, &info->m_devhdl, 15015b504601Sjiang wu - Sun Microsystems - Beijing China &info->m_sasaddr, &info->m_phymask); 15025b504601Sjiang wu - Sun Microsystems - Beijing China 15035b504601Sjiang wu - Sun Microsystems - Beijing China return (rval); 15045b504601Sjiang wu - Sun Microsystems - Beijing China } 15055b504601Sjiang wu - Sun Microsystems - Beijing China 15065b504601Sjiang wu - Sun Microsystems - Beijing China static int 15075b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_sasportpage_0_cb(mptsas_t *mpt, caddr_t page_memp, 15085b504601Sjiang wu - Sun Microsystems - Beijing China ddi_acc_handle_t accessp, uint16_t iocstatus, uint32_t iocloginfo, 15095b504601Sjiang wu - Sun Microsystems - Beijing China va_list ap) 15105b504601Sjiang wu - Sun Microsystems - Beijing China { 15115b504601Sjiang wu - Sun Microsystems - Beijing China #ifndef __lock_lint 15125b504601Sjiang wu - Sun Microsystems - Beijing China _NOTE(ARGUNUSED(ap)) 15135b504601Sjiang wu - Sun Microsystems - Beijing China #endif 15145b504601Sjiang wu - Sun Microsystems - Beijing China int rval = DDI_SUCCESS, i; 15155b504601Sjiang wu - Sun Microsystems - Beijing China uint8_t *sas_addr = NULL; 15165b504601Sjiang wu - Sun Microsystems - Beijing China uint64_t *sas_wwn; 15175b504601Sjiang wu - Sun Microsystems - Beijing China uint8_t tmp_sas_wwn[SAS_WWN_BYTE_SIZE]; 15185b504601Sjiang wu - Sun Microsystems - Beijing China uint8_t *portwidth; 15195b504601Sjiang wu - Sun Microsystems - Beijing China pMpi2SasPortPage0_t sasportpage; 15205b504601Sjiang wu - Sun Microsystems - Beijing China 15215b504601Sjiang wu - Sun Microsystems - Beijing China if (iocstatus != MPI2_IOCSTATUS_SUCCESS) { 15225b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN, "mptsas_get_sas_port_page0 " 15235b504601Sjiang wu - Sun Microsystems - Beijing China "config: IOCStatus=0x%x, IOCLogInfo=0x%x", 15245b504601Sjiang wu - Sun Microsystems - Beijing China iocstatus, iocloginfo); 15255b504601Sjiang wu - Sun Microsystems - Beijing China rval = DDI_FAILURE; 15265b504601Sjiang wu - Sun Microsystems - Beijing China return (rval); 15275b504601Sjiang wu - Sun Microsystems - Beijing China } 15285b504601Sjiang wu - Sun Microsystems - Beijing China sas_wwn = va_arg(ap, uint64_t *); 15295b504601Sjiang wu - Sun Microsystems - Beijing China portwidth = va_arg(ap, uint8_t *); 15305b504601Sjiang wu - Sun Microsystems - Beijing China 15315b504601Sjiang wu - Sun Microsystems - Beijing China sasportpage = (pMpi2SasPortPage0_t)page_memp; 15325b504601Sjiang wu - Sun Microsystems - Beijing China sas_addr = (uint8_t *)(&sasportpage->SASAddress); 15335b504601Sjiang wu - Sun Microsystems - Beijing China for (i = 0; i < SAS_WWN_BYTE_SIZE; i++) { 15345b504601Sjiang wu - Sun Microsystems - Beijing China tmp_sas_wwn[i] = ddi_get8(accessp, sas_addr + i); 15355b504601Sjiang wu - Sun Microsystems - Beijing China } 15365b504601Sjiang wu - Sun Microsystems - Beijing China bcopy(tmp_sas_wwn, sas_wwn, SAS_WWN_BYTE_SIZE); 15375b504601Sjiang wu - Sun Microsystems - Beijing China *sas_wwn = LE_64(*sas_wwn); 15385b504601Sjiang wu - Sun Microsystems - Beijing China *portwidth = ddi_get8(accessp, &sasportpage->PortWidth); 15395b504601Sjiang wu - Sun Microsystems - Beijing China return (rval); 15405b504601Sjiang wu - Sun Microsystems - Beijing China } 15415b504601Sjiang wu - Sun Microsystems - Beijing China 15425b504601Sjiang wu - Sun Microsystems - Beijing China /* 15435b504601Sjiang wu - Sun Microsystems - Beijing China * Request MPI configuration page SAS port page 0 to get initiator SAS address 15445b504601Sjiang wu - Sun Microsystems - Beijing China * and port width. 15455b504601Sjiang wu - Sun Microsystems - Beijing China */ 15465b504601Sjiang wu - Sun Microsystems - Beijing China int 15475b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_get_sas_port_page0(mptsas_t *mpt, uint32_t page_address, 15485b504601Sjiang wu - Sun Microsystems - Beijing China uint64_t *sas_wwn, uint8_t *portwidth) 15495b504601Sjiang wu - Sun Microsystems - Beijing China { 15505b504601Sjiang wu - Sun Microsystems - Beijing China int rval = DDI_SUCCESS; 15515b504601Sjiang wu - Sun Microsystems - Beijing China 15525b504601Sjiang wu - Sun Microsystems - Beijing China ASSERT(mutex_owned(&mpt->m_mutex)); 15535b504601Sjiang wu - Sun Microsystems - Beijing China 15545b504601Sjiang wu - Sun Microsystems - Beijing China /* 15555b504601Sjiang wu - Sun Microsystems - Beijing China * Get the header and config page. reply contains the reply frame, 15565b504601Sjiang wu - Sun Microsystems - Beijing China * which holds status info for the request. 15575b504601Sjiang wu - Sun Microsystems - Beijing China */ 15585b504601Sjiang wu - Sun Microsystems - Beijing China rval = mptsas_access_config_page(mpt, 15595b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_CONFIG_ACTION_PAGE_READ_CURRENT, 15605b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_CONFIG_EXTPAGETYPE_SAS_PORT, 0, page_address, 15615b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_sasportpage_0_cb, sas_wwn, portwidth); 15625b504601Sjiang wu - Sun Microsystems - Beijing China 15635b504601Sjiang wu - Sun Microsystems - Beijing China return (rval); 15645b504601Sjiang wu - Sun Microsystems - Beijing China } 15655b504601Sjiang wu - Sun Microsystems - Beijing China 15665b504601Sjiang wu - Sun Microsystems - Beijing China static int 15675b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_sasiou_page_0_cb(mptsas_t *mpt, caddr_t page_memp, 15685b504601Sjiang wu - Sun Microsystems - Beijing China ddi_acc_handle_t accessp, uint16_t iocstatus, uint32_t iocloginfo, 15695b504601Sjiang wu - Sun Microsystems - Beijing China va_list ap) 15705b504601Sjiang wu - Sun Microsystems - Beijing China { 15715b504601Sjiang wu - Sun Microsystems - Beijing China #ifndef __lock_lint 15725b504601Sjiang wu - Sun Microsystems - Beijing China _NOTE(ARGUNUSED(ap)) 15735b504601Sjiang wu - Sun Microsystems - Beijing China #endif 15745b504601Sjiang wu - Sun Microsystems - Beijing China int rval = DDI_SUCCESS; 15755b504601Sjiang wu - Sun Microsystems - Beijing China pMpi2SasIOUnitPage0_t sasioupage0; 15765b504601Sjiang wu - Sun Microsystems - Beijing China int i, num_phys; 15775b504601Sjiang wu - Sun Microsystems - Beijing China uint32_t cpdi[8], *retrypage0, *readpage1; 15785b504601Sjiang wu - Sun Microsystems - Beijing China uint8_t port_flags; 15795b504601Sjiang wu - Sun Microsystems - Beijing China 15805b504601Sjiang wu - Sun Microsystems - Beijing China if (iocstatus != MPI2_IOCSTATUS_SUCCESS) { 15815b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN, "mptsas_get_sas_io_unit_page0 " 15825b504601Sjiang wu - Sun Microsystems - Beijing China "config: IOCStatus=0x%x, IOCLogInfo=0x%x", 15835b504601Sjiang wu - Sun Microsystems - Beijing China iocstatus, iocloginfo); 15845b504601Sjiang wu - Sun Microsystems - Beijing China rval = DDI_FAILURE; 15855b504601Sjiang wu - Sun Microsystems - Beijing China return (rval); 15865b504601Sjiang wu - Sun Microsystems - Beijing China } 15875b504601Sjiang wu - Sun Microsystems - Beijing China readpage1 = va_arg(ap, uint32_t *); 15885b504601Sjiang wu - Sun Microsystems - Beijing China retrypage0 = va_arg(ap, uint32_t *); 15895b504601Sjiang wu - Sun Microsystems - Beijing China 15905b504601Sjiang wu - Sun Microsystems - Beijing China sasioupage0 = (pMpi2SasIOUnitPage0_t)page_memp; 15915b504601Sjiang wu - Sun Microsystems - Beijing China 15925b504601Sjiang wu - Sun Microsystems - Beijing China num_phys = ddi_get8(accessp, &sasioupage0->NumPhys); 15935b504601Sjiang wu - Sun Microsystems - Beijing China for (i = 0; i < num_phys; i++) { 15945b504601Sjiang wu - Sun Microsystems - Beijing China cpdi[i] = ddi_get32(accessp, 15955b504601Sjiang wu - Sun Microsystems - Beijing China &sasioupage0->PhyData[i]. 15965b504601Sjiang wu - Sun Microsystems - Beijing China ControllerPhyDeviceInfo); 15975b504601Sjiang wu - Sun Microsystems - Beijing China port_flags = ddi_get8(accessp, 15985b504601Sjiang wu - Sun Microsystems - Beijing China &sasioupage0->PhyData[i].PortFlags); 15995b504601Sjiang wu - Sun Microsystems - Beijing China mpt->m_phy_info[i].port_num = 16005b504601Sjiang wu - Sun Microsystems - Beijing China ddi_get8(accessp, 16015b504601Sjiang wu - Sun Microsystems - Beijing China &sasioupage0->PhyData[i].Port); 16025b504601Sjiang wu - Sun Microsystems - Beijing China mpt->m_phy_info[i].ctrl_devhdl = 16035b504601Sjiang wu - Sun Microsystems - Beijing China ddi_get16(accessp, &sasioupage0-> 16045b504601Sjiang wu - Sun Microsystems - Beijing China PhyData[i].ControllerDevHandle); 16055b504601Sjiang wu - Sun Microsystems - Beijing China mpt->m_phy_info[i].attached_devhdl = 16065b504601Sjiang wu - Sun Microsystems - Beijing China ddi_get16(accessp, &sasioupage0-> 16075b504601Sjiang wu - Sun Microsystems - Beijing China PhyData[i].AttachedDevHandle); 16085b504601Sjiang wu - Sun Microsystems - Beijing China mpt->m_phy_info[i].phy_device_type = cpdi[i]; 16095b504601Sjiang wu - Sun Microsystems - Beijing China mpt->m_phy_info[i].port_flags = port_flags; 16105b504601Sjiang wu - Sun Microsystems - Beijing China 16115b504601Sjiang wu - Sun Microsystems - Beijing China if (port_flags & DISCOVERY_IN_PROGRESS) { 16125b504601Sjiang wu - Sun Microsystems - Beijing China *retrypage0 = *retrypage0 + 1; 16135b504601Sjiang wu - Sun Microsystems - Beijing China break; 16145b504601Sjiang wu - Sun Microsystems - Beijing China } else { 16155b504601Sjiang wu - Sun Microsystems - Beijing China *retrypage0 = 0; 16165b504601Sjiang wu - Sun Microsystems - Beijing China } 16175b504601Sjiang wu - Sun Microsystems - Beijing China if (!(port_flags & AUTO_PORT_CONFIGURATION)) { 16185b504601Sjiang wu - Sun Microsystems - Beijing China /* 16195b504601Sjiang wu - Sun Microsystems - Beijing China * some PHY configuration described in 16205b504601Sjiang wu - Sun Microsystems - Beijing China * SAS IO Unit Page1 16215b504601Sjiang wu - Sun Microsystems - Beijing China */ 16225b504601Sjiang wu - Sun Microsystems - Beijing China *readpage1 = 1; 16235b504601Sjiang wu - Sun Microsystems - Beijing China } 16245b504601Sjiang wu - Sun Microsystems - Beijing China } 16255b504601Sjiang wu - Sun Microsystems - Beijing China 16265b504601Sjiang wu - Sun Microsystems - Beijing China return (rval); 16275b504601Sjiang wu - Sun Microsystems - Beijing China } 16285b504601Sjiang wu - Sun Microsystems - Beijing China 16295b504601Sjiang wu - Sun Microsystems - Beijing China static int 16305b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_sasiou_page_1_cb(mptsas_t *mpt, caddr_t page_memp, 16315b504601Sjiang wu - Sun Microsystems - Beijing China ddi_acc_handle_t accessp, uint16_t iocstatus, uint32_t iocloginfo, 16325b504601Sjiang wu - Sun Microsystems - Beijing China va_list ap) 16335b504601Sjiang wu - Sun Microsystems - Beijing China { 16345b504601Sjiang wu - Sun Microsystems - Beijing China #ifndef __lock_lint 16355b504601Sjiang wu - Sun Microsystems - Beijing China _NOTE(ARGUNUSED(ap)) 16365b504601Sjiang wu - Sun Microsystems - Beijing China #endif 16375b504601Sjiang wu - Sun Microsystems - Beijing China int rval = DDI_SUCCESS; 16385b504601Sjiang wu - Sun Microsystems - Beijing China pMpi2SasIOUnitPage1_t sasioupage1; 16395b504601Sjiang wu - Sun Microsystems - Beijing China int i, num_phys; 16405b504601Sjiang wu - Sun Microsystems - Beijing China uint32_t cpdi[8]; 16415b504601Sjiang wu - Sun Microsystems - Beijing China uint8_t port_flags; 16425b504601Sjiang wu - Sun Microsystems - Beijing China 16435b504601Sjiang wu - Sun Microsystems - Beijing China if (iocstatus != MPI2_IOCSTATUS_SUCCESS) { 16445b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN, "mptsas_get_sas_io_unit_page1 " 16455b504601Sjiang wu - Sun Microsystems - Beijing China "config: IOCStatus=0x%x, IOCLogInfo=0x%x", 16465b504601Sjiang wu - Sun Microsystems - Beijing China iocstatus, iocloginfo); 16475b504601Sjiang wu - Sun Microsystems - Beijing China rval = DDI_FAILURE; 16485b504601Sjiang wu - Sun Microsystems - Beijing China return (rval); 16495b504601Sjiang wu - Sun Microsystems - Beijing China } 16505b504601Sjiang wu - Sun Microsystems - Beijing China 16515b504601Sjiang wu - Sun Microsystems - Beijing China sasioupage1 = (pMpi2SasIOUnitPage1_t)page_memp; 16525b504601Sjiang wu - Sun Microsystems - Beijing China num_phys = ddi_get8(accessp, &sasioupage1->NumPhys); 16535b504601Sjiang wu - Sun Microsystems - Beijing China for (i = 0; i < num_phys; i++) { 16545b504601Sjiang wu - Sun Microsystems - Beijing China cpdi[i] = ddi_get32(accessp, &sasioupage1->PhyData[i]. 16555b504601Sjiang wu - Sun Microsystems - Beijing China ControllerPhyDeviceInfo); 16565b504601Sjiang wu - Sun Microsystems - Beijing China port_flags = ddi_get8(accessp, 16575b504601Sjiang wu - Sun Microsystems - Beijing China &sasioupage1->PhyData[i].PortFlags); 16585b504601Sjiang wu - Sun Microsystems - Beijing China mpt->m_phy_info[i].port_num = 16595b504601Sjiang wu - Sun Microsystems - Beijing China ddi_get8(accessp, 16605b504601Sjiang wu - Sun Microsystems - Beijing China &sasioupage1->PhyData[i].Port); 16615b504601Sjiang wu - Sun Microsystems - Beijing China mpt->m_phy_info[i].port_flags = port_flags; 16625b504601Sjiang wu - Sun Microsystems - Beijing China mpt->m_phy_info[i].phy_device_type = cpdi[i]; 16635b504601Sjiang wu - Sun Microsystems - Beijing China 16645b504601Sjiang wu - Sun Microsystems - Beijing China } 16655b504601Sjiang wu - Sun Microsystems - Beijing China return (rval); 16665b504601Sjiang wu - Sun Microsystems - Beijing China } 16675b504601Sjiang wu - Sun Microsystems - Beijing China 16685b504601Sjiang wu - Sun Microsystems - Beijing China /* 16695b504601Sjiang wu - Sun Microsystems - Beijing China * Read IO unit page 0 to get information for each PHY. If needed, Read IO Unit 16705b504601Sjiang wu - Sun Microsystems - Beijing China * page1 to update the PHY information. This is the message passing method of 16715b504601Sjiang wu - Sun Microsystems - Beijing China * this function which should be called except during initialization. 16725b504601Sjiang wu - Sun Microsystems - Beijing China */ 16735b504601Sjiang wu - Sun Microsystems - Beijing China int 16745b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_get_sas_io_unit_page(mptsas_t *mpt) 16755b504601Sjiang wu - Sun Microsystems - Beijing China { 16765b504601Sjiang wu - Sun Microsystems - Beijing China int rval = DDI_SUCCESS, state; 16775b504601Sjiang wu - Sun Microsystems - Beijing China uint32_t readpage1 = 0, retrypage0 = 0; 16785b504601Sjiang wu - Sun Microsystems - Beijing China 16795b504601Sjiang wu - Sun Microsystems - Beijing China ASSERT(mutex_owned(&mpt->m_mutex)); 16805b504601Sjiang wu - Sun Microsystems - Beijing China 16815b504601Sjiang wu - Sun Microsystems - Beijing China /* 16825b504601Sjiang wu - Sun Microsystems - Beijing China * Now we cycle through the state machine. Here's what happens: 16835b504601Sjiang wu - Sun Microsystems - Beijing China * 1. Read IO unit page 0 and set phy information 16845b504601Sjiang wu - Sun Microsystems - Beijing China * 2. See if Read IO unit page1 is needed because of port configuration 16855b504601Sjiang wu - Sun Microsystems - Beijing China * 3. Read IO unit page 1 and update phy information. 16865b504601Sjiang wu - Sun Microsystems - Beijing China */ 16875b504601Sjiang wu - Sun Microsystems - Beijing China state = IOUC_READ_PAGE0; 16885b504601Sjiang wu - Sun Microsystems - Beijing China while (state != IOUC_DONE) { 16895b504601Sjiang wu - Sun Microsystems - Beijing China if (state == IOUC_READ_PAGE0) { 16905b504601Sjiang wu - Sun Microsystems - Beijing China rval = mptsas_access_config_page(mpt, 16915b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_CONFIG_ACTION_PAGE_READ_CURRENT, 16925b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_CONFIG_EXTPAGETYPE_SAS_IO_UNIT, 0, 0, 16935b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_sasiou_page_0_cb, &readpage1, 16945b504601Sjiang wu - Sun Microsystems - Beijing China &retrypage0); 16955b504601Sjiang wu - Sun Microsystems - Beijing China } else if (state == IOUC_READ_PAGE1) { 16965b504601Sjiang wu - Sun Microsystems - Beijing China rval = mptsas_access_config_page(mpt, 16975b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_CONFIG_ACTION_PAGE_READ_CURRENT, 16985b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_CONFIG_EXTPAGETYPE_SAS_IO_UNIT, 1, 0, 16995b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_sasiou_page_1_cb); 17005b504601Sjiang wu - Sun Microsystems - Beijing China } 17015b504601Sjiang wu - Sun Microsystems - Beijing China 17025b504601Sjiang wu - Sun Microsystems - Beijing China if (rval == DDI_SUCCESS) { 17035b504601Sjiang wu - Sun Microsystems - Beijing China switch (state) { 17045b504601Sjiang wu - Sun Microsystems - Beijing China case IOUC_READ_PAGE0: 17055b504601Sjiang wu - Sun Microsystems - Beijing China /* 17065b504601Sjiang wu - Sun Microsystems - Beijing China * retry 30 times if discovery is in process 17075b504601Sjiang wu - Sun Microsystems - Beijing China */ 17085b504601Sjiang wu - Sun Microsystems - Beijing China if (retrypage0 && (retrypage0 < 30)) { 17095b504601Sjiang wu - Sun Microsystems - Beijing China drv_usecwait(1000 * 100); 17105b504601Sjiang wu - Sun Microsystems - Beijing China state = IOUC_READ_PAGE0; 17115b504601Sjiang wu - Sun Microsystems - Beijing China break; 17125b504601Sjiang wu - Sun Microsystems - Beijing China } else if (retrypage0 == 30) { 17135b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN, 17145b504601Sjiang wu - Sun Microsystems - Beijing China "!Discovery in progress, can't " 17155b504601Sjiang wu - Sun Microsystems - Beijing China "verify IO unit config, then " 17165b504601Sjiang wu - Sun Microsystems - Beijing China "after 30 times retry, give " 17175b504601Sjiang wu - Sun Microsystems - Beijing China "up!"); 17185b504601Sjiang wu - Sun Microsystems - Beijing China state = IOUC_DONE; 17195b504601Sjiang wu - Sun Microsystems - Beijing China rval = DDI_FAILURE; 17205b504601Sjiang wu - Sun Microsystems - Beijing China break; 17215b504601Sjiang wu - Sun Microsystems - Beijing China } 17225b504601Sjiang wu - Sun Microsystems - Beijing China 17235b504601Sjiang wu - Sun Microsystems - Beijing China if (readpage1 == 0) { 17245b504601Sjiang wu - Sun Microsystems - Beijing China state = IOUC_DONE; 17255b504601Sjiang wu - Sun Microsystems - Beijing China rval = DDI_SUCCESS; 17265b504601Sjiang wu - Sun Microsystems - Beijing China break; 17275b504601Sjiang wu - Sun Microsystems - Beijing China } 17285b504601Sjiang wu - Sun Microsystems - Beijing China 17295b504601Sjiang wu - Sun Microsystems - Beijing China state = IOUC_READ_PAGE1; 17305b504601Sjiang wu - Sun Microsystems - Beijing China break; 17315b504601Sjiang wu - Sun Microsystems - Beijing China 17325b504601Sjiang wu - Sun Microsystems - Beijing China case IOUC_READ_PAGE1: 17335b504601Sjiang wu - Sun Microsystems - Beijing China state = IOUC_DONE; 17345b504601Sjiang wu - Sun Microsystems - Beijing China rval = DDI_SUCCESS; 17355b504601Sjiang wu - Sun Microsystems - Beijing China break; 17365b504601Sjiang wu - Sun Microsystems - Beijing China } 17375b504601Sjiang wu - Sun Microsystems - Beijing China } else { 17385b504601Sjiang wu - Sun Microsystems - Beijing China return (rval); 17395b504601Sjiang wu - Sun Microsystems - Beijing China } 17405b504601Sjiang wu - Sun Microsystems - Beijing China } 17415b504601Sjiang wu - Sun Microsystems - Beijing China 17425b504601Sjiang wu - Sun Microsystems - Beijing China return (rval); 17435b504601Sjiang wu - Sun Microsystems - Beijing China } 17445b504601Sjiang wu - Sun Microsystems - Beijing China 1745*08eb0b82SYong-Feng Du static int 1746*08eb0b82SYong-Feng Du mptsas_biospage_3_cb(mptsas_t *mpt, caddr_t page_memp, 1747*08eb0b82SYong-Feng Du ddi_acc_handle_t accessp, uint16_t iocstatus, uint32_t iocloginfo, 1748*08eb0b82SYong-Feng Du va_list ap) 1749*08eb0b82SYong-Feng Du { 1750*08eb0b82SYong-Feng Du #ifndef __lock_lint 1751*08eb0b82SYong-Feng Du _NOTE(ARGUNUSED(ap)) 1752*08eb0b82SYong-Feng Du #endif 1753*08eb0b82SYong-Feng Du pMpi2BiosPage3_t sasbiospage; 1754*08eb0b82SYong-Feng Du int rval = DDI_SUCCESS; 1755*08eb0b82SYong-Feng Du uint32_t *bios_version; 1756*08eb0b82SYong-Feng Du 1757*08eb0b82SYong-Feng Du if ((iocstatus != MPI2_IOCSTATUS_SUCCESS) && 1758*08eb0b82SYong-Feng Du (iocstatus != MPI2_IOCSTATUS_CONFIG_INVALID_PAGE)) { 1759*08eb0b82SYong-Feng Du mptsas_log(mpt, CE_WARN, "mptsas_get_bios_page3 header: " 1760*08eb0b82SYong-Feng Du "IOCStatus=0x%x, IOCLogInfo=0x%x", iocstatus, iocloginfo); 1761*08eb0b82SYong-Feng Du rval = DDI_FAILURE; 1762*08eb0b82SYong-Feng Du return (rval); 1763*08eb0b82SYong-Feng Du } 1764*08eb0b82SYong-Feng Du bios_version = va_arg(ap, uint32_t *); 1765*08eb0b82SYong-Feng Du sasbiospage = (pMpi2BiosPage3_t)page_memp; 1766*08eb0b82SYong-Feng Du *bios_version = ddi_get32(accessp, &sasbiospage->BiosVersion); 1767*08eb0b82SYong-Feng Du 1768*08eb0b82SYong-Feng Du return (rval); 1769*08eb0b82SYong-Feng Du } 1770*08eb0b82SYong-Feng Du 1771*08eb0b82SYong-Feng Du /* 1772*08eb0b82SYong-Feng Du * Request MPI configuration page BIOS page 3 to get BIOS version. Since all 1773*08eb0b82SYong-Feng Du * other information in this page is not needed, just ignore it. 1774*08eb0b82SYong-Feng Du */ 1775*08eb0b82SYong-Feng Du int 1776*08eb0b82SYong-Feng Du mptsas_get_bios_page3(mptsas_t *mpt, uint32_t *bios_version) 1777*08eb0b82SYong-Feng Du { 1778*08eb0b82SYong-Feng Du int rval = DDI_SUCCESS; 1779*08eb0b82SYong-Feng Du 1780*08eb0b82SYong-Feng Du ASSERT(mutex_owned(&mpt->m_mutex)); 1781*08eb0b82SYong-Feng Du 1782*08eb0b82SYong-Feng Du /* 1783*08eb0b82SYong-Feng Du * Get the header and config page. reply contains the reply frame, 1784*08eb0b82SYong-Feng Du * which holds status info for the request. 1785*08eb0b82SYong-Feng Du */ 1786*08eb0b82SYong-Feng Du rval = mptsas_access_config_page(mpt, 1787*08eb0b82SYong-Feng Du MPI2_CONFIG_ACTION_PAGE_READ_CURRENT, MPI2_CONFIG_PAGETYPE_BIOS, 3, 1788*08eb0b82SYong-Feng Du 0, mptsas_biospage_3_cb, bios_version); 1789*08eb0b82SYong-Feng Du 1790*08eb0b82SYong-Feng Du return (rval); 1791*08eb0b82SYong-Feng Du } 1792*08eb0b82SYong-Feng Du 17935b504601Sjiang wu - Sun Microsystems - Beijing China /* 17945b504601Sjiang wu - Sun Microsystems - Beijing China * Read IO unit page 0 to get information for each PHY. If needed, Read IO Unit 17955b504601Sjiang wu - Sun Microsystems - Beijing China * page1 to update the PHY information. This is the handshaking version of 17965b504601Sjiang wu - Sun Microsystems - Beijing China * this function, which should be called during initialization only. 17975b504601Sjiang wu - Sun Microsystems - Beijing China */ 17985b504601Sjiang wu - Sun Microsystems - Beijing China int 17995b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_get_sas_io_unit_page_hndshk(mptsas_t *mpt) 18005b504601Sjiang wu - Sun Microsystems - Beijing China { 18015b504601Sjiang wu - Sun Microsystems - Beijing China ddi_dma_attr_t recv_dma_attrs, page_dma_attrs; 18025b504601Sjiang wu - Sun Microsystems - Beijing China uint_t recv_ncookie, page_ncookie; 18035b504601Sjiang wu - Sun Microsystems - Beijing China ddi_dma_cookie_t recv_cookie, page_cookie; 18045b504601Sjiang wu - Sun Microsystems - Beijing China ddi_dma_handle_t recv_dma_handle, page_dma_handle; 18055b504601Sjiang wu - Sun Microsystems - Beijing China ddi_acc_handle_t recv_accessp, page_accessp; 18065b504601Sjiang wu - Sun Microsystems - Beijing China size_t recv_alloc_len, page_alloc_len; 18075b504601Sjiang wu - Sun Microsystems - Beijing China pMpi2ConfigReply_t configreply; 18085b504601Sjiang wu - Sun Microsystems - Beijing China pMpi2SasIOUnitPage0_t sasioupage0; 18095b504601Sjiang wu - Sun Microsystems - Beijing China pMpi2SasIOUnitPage1_t sasioupage1; 18105b504601Sjiang wu - Sun Microsystems - Beijing China int recv_numbytes; 18115b504601Sjiang wu - Sun Microsystems - Beijing China caddr_t recv_memp, page_memp; 18125b504601Sjiang wu - Sun Microsystems - Beijing China int recv_dmastate = 0; 18135b504601Sjiang wu - Sun Microsystems - Beijing China int page_dmastate = 0; 18145b504601Sjiang wu - Sun Microsystems - Beijing China int i, num_phys; 18155b504601Sjiang wu - Sun Microsystems - Beijing China int page0_size = 18165b504601Sjiang wu - Sun Microsystems - Beijing China sizeof (MPI2_CONFIG_PAGE_SASIOUNIT_0) + 18175b504601Sjiang wu - Sun Microsystems - Beijing China (sizeof (MPI2_SAS_IO_UNIT0_PHY_DATA) * 7); 18185b504601Sjiang wu - Sun Microsystems - Beijing China int page1_size = 18195b504601Sjiang wu - Sun Microsystems - Beijing China sizeof (MPI2_CONFIG_PAGE_SASIOUNIT_1) + 18205b504601Sjiang wu - Sun Microsystems - Beijing China (sizeof (MPI2_SAS_IO_UNIT1_PHY_DATA) * 7); 18215b504601Sjiang wu - Sun Microsystems - Beijing China uint32_t flags_length; 18225b504601Sjiang wu - Sun Microsystems - Beijing China uint32_t cpdi[8], readpage1 = 0, retrypage0 = 0; 18235b504601Sjiang wu - Sun Microsystems - Beijing China uint16_t iocstatus; 18245b504601Sjiang wu - Sun Microsystems - Beijing China uint8_t port_flags, page_number, action; 18255b504601Sjiang wu - Sun Microsystems - Beijing China uint32_t reply_size = 256; /* Big enough for any page */ 18265b504601Sjiang wu - Sun Microsystems - Beijing China uint_t state; 18275b504601Sjiang wu - Sun Microsystems - Beijing China int rval = DDI_FAILURE; 18285b504601Sjiang wu - Sun Microsystems - Beijing China 18295b504601Sjiang wu - Sun Microsystems - Beijing China /* 18305b504601Sjiang wu - Sun Microsystems - Beijing China * Initialize our "state machine". This is a bit convoluted, 18315b504601Sjiang wu - Sun Microsystems - Beijing China * but it keeps us from having to do the ddi allocations numerous 18325b504601Sjiang wu - Sun Microsystems - Beijing China * times. 18335b504601Sjiang wu - Sun Microsystems - Beijing China */ 18345b504601Sjiang wu - Sun Microsystems - Beijing China 18355b504601Sjiang wu - Sun Microsystems - Beijing China NDBG20(("mptsas_get_sas_io_unit_page_hndshk enter")); 18365b504601Sjiang wu - Sun Microsystems - Beijing China ASSERT(mutex_owned(&mpt->m_mutex)); 18375b504601Sjiang wu - Sun Microsystems - Beijing China state = IOUC_READ_PAGE0; 18385b504601Sjiang wu - Sun Microsystems - Beijing China 18395b504601Sjiang wu - Sun Microsystems - Beijing China /* 18405b504601Sjiang wu - Sun Microsystems - Beijing China * dynamically create a customized dma attribute structure 18415b504601Sjiang wu - Sun Microsystems - Beijing China * that describes mpt's config reply page request structure. 18425b504601Sjiang wu - Sun Microsystems - Beijing China */ 18435b504601Sjiang wu - Sun Microsystems - Beijing China recv_dma_attrs = mpt->m_msg_dma_attr; 18445b504601Sjiang wu - Sun Microsystems - Beijing China recv_dma_attrs.dma_attr_sgllen = 1; 18455b504601Sjiang wu - Sun Microsystems - Beijing China recv_dma_attrs.dma_attr_granular = (sizeof (MPI2_CONFIG_REPLY)); 18465b504601Sjiang wu - Sun Microsystems - Beijing China 18475b504601Sjiang wu - Sun Microsystems - Beijing China if (ddi_dma_alloc_handle(mpt->m_dip, &recv_dma_attrs, 18485b504601Sjiang wu - Sun Microsystems - Beijing China DDI_DMA_SLEEP, NULL, &recv_dma_handle) != DDI_SUCCESS) { 18495b504601Sjiang wu - Sun Microsystems - Beijing China goto cleanup; 18505b504601Sjiang wu - Sun Microsystems - Beijing China } 18515b504601Sjiang wu - Sun Microsystems - Beijing China 18525b504601Sjiang wu - Sun Microsystems - Beijing China recv_dmastate |= MPTSAS_DMA_HANDLE_ALLOCD; 18535b504601Sjiang wu - Sun Microsystems - Beijing China 18545b504601Sjiang wu - Sun Microsystems - Beijing China if (ddi_dma_mem_alloc(recv_dma_handle, 18555b504601Sjiang wu - Sun Microsystems - Beijing China (sizeof (MPI2_CONFIG_REPLY)), 18565b504601Sjiang wu - Sun Microsystems - Beijing China &mpt->m_dev_acc_attr, DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, NULL, 18575b504601Sjiang wu - Sun Microsystems - Beijing China &recv_memp, &recv_alloc_len, &recv_accessp) != DDI_SUCCESS) { 18585b504601Sjiang wu - Sun Microsystems - Beijing China goto cleanup; 18595b504601Sjiang wu - Sun Microsystems - Beijing China } 18605b504601Sjiang wu - Sun Microsystems - Beijing China 18615b504601Sjiang wu - Sun Microsystems - Beijing China recv_dmastate |= MPTSAS_DMA_MEMORY_ALLOCD; 18625b504601Sjiang wu - Sun Microsystems - Beijing China 18635b504601Sjiang wu - Sun Microsystems - Beijing China if (ddi_dma_addr_bind_handle(recv_dma_handle, NULL, recv_memp, 18645b504601Sjiang wu - Sun Microsystems - Beijing China recv_alloc_len, DDI_DMA_RDWR | DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, 18655b504601Sjiang wu - Sun Microsystems - Beijing China NULL, &recv_cookie, &recv_ncookie) != DDI_DMA_MAPPED) { 18665b504601Sjiang wu - Sun Microsystems - Beijing China goto cleanup; 18675b504601Sjiang wu - Sun Microsystems - Beijing China } 18685b504601Sjiang wu - Sun Microsystems - Beijing China 18695b504601Sjiang wu - Sun Microsystems - Beijing China recv_dmastate |= MPTSAS_DMA_HANDLE_BOUND; 18705b504601Sjiang wu - Sun Microsystems - Beijing China 18715b504601Sjiang wu - Sun Microsystems - Beijing China page_dma_attrs = mpt->m_msg_dma_attr; 18725b504601Sjiang wu - Sun Microsystems - Beijing China page_dma_attrs.dma_attr_sgllen = 1; 18735b504601Sjiang wu - Sun Microsystems - Beijing China page_dma_attrs.dma_attr_granular = reply_size; 18745b504601Sjiang wu - Sun Microsystems - Beijing China 18755b504601Sjiang wu - Sun Microsystems - Beijing China if (ddi_dma_alloc_handle(mpt->m_dip, &page_dma_attrs, 18765b504601Sjiang wu - Sun Microsystems - Beijing China DDI_DMA_SLEEP, NULL, &page_dma_handle) != DDI_SUCCESS) { 18775b504601Sjiang wu - Sun Microsystems - Beijing China goto cleanup; 18785b504601Sjiang wu - Sun Microsystems - Beijing China } 18795b504601Sjiang wu - Sun Microsystems - Beijing China 18805b504601Sjiang wu - Sun Microsystems - Beijing China page_dmastate |= MPTSAS_DMA_HANDLE_ALLOCD; 18815b504601Sjiang wu - Sun Microsystems - Beijing China 18825b504601Sjiang wu - Sun Microsystems - Beijing China /* 18835b504601Sjiang wu - Sun Microsystems - Beijing China * Page 0 size is larger, so just use that for both. 18845b504601Sjiang wu - Sun Microsystems - Beijing China */ 18855b504601Sjiang wu - Sun Microsystems - Beijing China 18865b504601Sjiang wu - Sun Microsystems - Beijing China if (ddi_dma_mem_alloc(page_dma_handle, reply_size, 18875b504601Sjiang wu - Sun Microsystems - Beijing China &mpt->m_dev_acc_attr, DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, NULL, 18885b504601Sjiang wu - Sun Microsystems - Beijing China &page_memp, &page_alloc_len, &page_accessp) != DDI_SUCCESS) { 18895b504601Sjiang wu - Sun Microsystems - Beijing China goto cleanup; 18905b504601Sjiang wu - Sun Microsystems - Beijing China } 18915b504601Sjiang wu - Sun Microsystems - Beijing China 18925b504601Sjiang wu - Sun Microsystems - Beijing China page_dmastate |= MPTSAS_DMA_MEMORY_ALLOCD; 18935b504601Sjiang wu - Sun Microsystems - Beijing China 18945b504601Sjiang wu - Sun Microsystems - Beijing China if (ddi_dma_addr_bind_handle(page_dma_handle, NULL, page_memp, 18955b504601Sjiang wu - Sun Microsystems - Beijing China page_alloc_len, DDI_DMA_RDWR | DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, 18965b504601Sjiang wu - Sun Microsystems - Beijing China NULL, &page_cookie, &page_ncookie) != DDI_DMA_MAPPED) { 18975b504601Sjiang wu - Sun Microsystems - Beijing China goto cleanup; 18985b504601Sjiang wu - Sun Microsystems - Beijing China } 18995b504601Sjiang wu - Sun Microsystems - Beijing China 19005b504601Sjiang wu - Sun Microsystems - Beijing China page_dmastate |= MPTSAS_DMA_HANDLE_BOUND; 19015b504601Sjiang wu - Sun Microsystems - Beijing China 19025b504601Sjiang wu - Sun Microsystems - Beijing China /* 19035b504601Sjiang wu - Sun Microsystems - Beijing China * Now we cycle through the state machine. Here's what happens: 19045b504601Sjiang wu - Sun Microsystems - Beijing China * 1. Read IO unit page 0 and set phy information 19055b504601Sjiang wu - Sun Microsystems - Beijing China * 2. See if Read IO unit page1 is needed because of port configuration 19065b504601Sjiang wu - Sun Microsystems - Beijing China * 3. Read IO unit page 1 and update phy information. 19075b504601Sjiang wu - Sun Microsystems - Beijing China */ 19085b504601Sjiang wu - Sun Microsystems - Beijing China 19095b504601Sjiang wu - Sun Microsystems - Beijing China sasioupage0 = (pMpi2SasIOUnitPage0_t)page_memp; 19105b504601Sjiang wu - Sun Microsystems - Beijing China sasioupage1 = (pMpi2SasIOUnitPage1_t)page_memp; 19115b504601Sjiang wu - Sun Microsystems - Beijing China 19125b504601Sjiang wu - Sun Microsystems - Beijing China while (state != IOUC_DONE) { 19135b504601Sjiang wu - Sun Microsystems - Beijing China switch (state) { 19145b504601Sjiang wu - Sun Microsystems - Beijing China case IOUC_READ_PAGE0: 19155b504601Sjiang wu - Sun Microsystems - Beijing China page_number = 0; 19165b504601Sjiang wu - Sun Microsystems - Beijing China action = MPI2_CONFIG_ACTION_PAGE_READ_CURRENT; 19175b504601Sjiang wu - Sun Microsystems - Beijing China flags_length = (uint32_t)page0_size; 19185b504601Sjiang wu - Sun Microsystems - Beijing China flags_length |= ((uint32_t)( 19195b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_SGE_FLAGS_LAST_ELEMENT | 19205b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_SGE_FLAGS_END_OF_BUFFER | 19215b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_SGE_FLAGS_SIMPLE_ELEMENT | 19225b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_SGE_FLAGS_SYSTEM_ADDRESS | 19235b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_SGE_FLAGS_32_BIT_ADDRESSING | 19245b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_SGE_FLAGS_IOC_TO_HOST | 19255b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_SGE_FLAGS_END_OF_LIST) << 19265b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_SGE_FLAGS_SHIFT); 19275b504601Sjiang wu - Sun Microsystems - Beijing China 19285b504601Sjiang wu - Sun Microsystems - Beijing China break; 19295b504601Sjiang wu - Sun Microsystems - Beijing China 19305b504601Sjiang wu - Sun Microsystems - Beijing China case IOUC_READ_PAGE1: 19315b504601Sjiang wu - Sun Microsystems - Beijing China page_number = 1; 19325b504601Sjiang wu - Sun Microsystems - Beijing China action = MPI2_CONFIG_ACTION_PAGE_READ_CURRENT; 19335b504601Sjiang wu - Sun Microsystems - Beijing China flags_length = (uint32_t)page1_size; 19345b504601Sjiang wu - Sun Microsystems - Beijing China flags_length |= ((uint32_t)( 19355b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_SGE_FLAGS_LAST_ELEMENT | 19365b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_SGE_FLAGS_END_OF_BUFFER | 19375b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_SGE_FLAGS_SIMPLE_ELEMENT | 19385b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_SGE_FLAGS_SYSTEM_ADDRESS | 19395b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_SGE_FLAGS_32_BIT_ADDRESSING | 19405b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_SGE_FLAGS_IOC_TO_HOST | 19415b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_SGE_FLAGS_END_OF_LIST) << 19425b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_SGE_FLAGS_SHIFT); 19435b504601Sjiang wu - Sun Microsystems - Beijing China 19445b504601Sjiang wu - Sun Microsystems - Beijing China break; 19455b504601Sjiang wu - Sun Microsystems - Beijing China default: 19465b504601Sjiang wu - Sun Microsystems - Beijing China break; 19475b504601Sjiang wu - Sun Microsystems - Beijing China } 19485b504601Sjiang wu - Sun Microsystems - Beijing China 19495b504601Sjiang wu - Sun Microsystems - Beijing China bzero(recv_memp, sizeof (MPI2_CONFIG_REPLY)); 19505b504601Sjiang wu - Sun Microsystems - Beijing China configreply = (pMpi2ConfigReply_t)recv_memp; 19515b504601Sjiang wu - Sun Microsystems - Beijing China recv_numbytes = sizeof (MPI2_CONFIG_REPLY); 19525b504601Sjiang wu - Sun Microsystems - Beijing China 19535b504601Sjiang wu - Sun Microsystems - Beijing China if (mptsas_send_extended_config_request_msg(mpt, 19545b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_CONFIG_ACTION_PAGE_HEADER, 19555b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_CONFIG_EXTPAGETYPE_SAS_IO_UNIT, 19565b504601Sjiang wu - Sun Microsystems - Beijing China 0, page_number, 0, 0, 0, 0)) { 19575b504601Sjiang wu - Sun Microsystems - Beijing China goto cleanup; 19585b504601Sjiang wu - Sun Microsystems - Beijing China } 19595b504601Sjiang wu - Sun Microsystems - Beijing China 19605b504601Sjiang wu - Sun Microsystems - Beijing China if (mptsas_get_handshake_msg(mpt, recv_memp, recv_numbytes, 19615b504601Sjiang wu - Sun Microsystems - Beijing China recv_accessp)) { 19625b504601Sjiang wu - Sun Microsystems - Beijing China goto cleanup; 19635b504601Sjiang wu - Sun Microsystems - Beijing China } 19645b504601Sjiang wu - Sun Microsystems - Beijing China 19655b504601Sjiang wu - Sun Microsystems - Beijing China iocstatus = ddi_get16(recv_accessp, &configreply->IOCStatus); 19665b504601Sjiang wu - Sun Microsystems - Beijing China iocstatus = MPTSAS_IOCSTATUS(iocstatus); 19675b504601Sjiang wu - Sun Microsystems - Beijing China 19685b504601Sjiang wu - Sun Microsystems - Beijing China if (iocstatus != MPI2_IOCSTATUS_SUCCESS) { 19695b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN, 19705b504601Sjiang wu - Sun Microsystems - Beijing China "mptsas_get_sas_io_unit_page_hndshk: read page " 19715b504601Sjiang wu - Sun Microsystems - Beijing China "header iocstatus = 0x%x", iocstatus); 19725b504601Sjiang wu - Sun Microsystems - Beijing China goto cleanup; 19735b504601Sjiang wu - Sun Microsystems - Beijing China } 19745b504601Sjiang wu - Sun Microsystems - Beijing China 19755b504601Sjiang wu - Sun Microsystems - Beijing China if (action != MPI2_CONFIG_ACTION_PAGE_WRITE_NVRAM) { 19765b504601Sjiang wu - Sun Microsystems - Beijing China bzero(page_memp, reply_size); 19775b504601Sjiang wu - Sun Microsystems - Beijing China } 19785b504601Sjiang wu - Sun Microsystems - Beijing China 19795b504601Sjiang wu - Sun Microsystems - Beijing China if (mptsas_send_extended_config_request_msg(mpt, action, 19805b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_CONFIG_EXTPAGETYPE_SAS_IO_UNIT, 0, page_number, 19815b504601Sjiang wu - Sun Microsystems - Beijing China ddi_get8(recv_accessp, &configreply->Header.PageVersion), 19825b504601Sjiang wu - Sun Microsystems - Beijing China ddi_get16(recv_accessp, &configreply->ExtPageLength), 19835b504601Sjiang wu - Sun Microsystems - Beijing China flags_length, page_cookie.dmac_address)) { 19845b504601Sjiang wu - Sun Microsystems - Beijing China goto cleanup; 19855b504601Sjiang wu - Sun Microsystems - Beijing China } 19865b504601Sjiang wu - Sun Microsystems - Beijing China 19875b504601Sjiang wu - Sun Microsystems - Beijing China if (mptsas_get_handshake_msg(mpt, recv_memp, recv_numbytes, 19885b504601Sjiang wu - Sun Microsystems - Beijing China recv_accessp)) { 19895b504601Sjiang wu - Sun Microsystems - Beijing China goto cleanup; 19905b504601Sjiang wu - Sun Microsystems - Beijing China } 19915b504601Sjiang wu - Sun Microsystems - Beijing China 19925b504601Sjiang wu - Sun Microsystems - Beijing China iocstatus = ddi_get16(recv_accessp, &configreply->IOCStatus); 19935b504601Sjiang wu - Sun Microsystems - Beijing China iocstatus = MPTSAS_IOCSTATUS(iocstatus); 19945b504601Sjiang wu - Sun Microsystems - Beijing China 19955b504601Sjiang wu - Sun Microsystems - Beijing China if (iocstatus != MPI2_IOCSTATUS_SUCCESS) { 19965b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN, 19975b504601Sjiang wu - Sun Microsystems - Beijing China "mptsas_get_sas_io_unit_page_hndshk: IO unit " 19985b504601Sjiang wu - Sun Microsystems - Beijing China "config failed for action %d, iocstatus = 0x%x", 19995b504601Sjiang wu - Sun Microsystems - Beijing China action, iocstatus); 20005b504601Sjiang wu - Sun Microsystems - Beijing China goto cleanup; 20015b504601Sjiang wu - Sun Microsystems - Beijing China } 20025b504601Sjiang wu - Sun Microsystems - Beijing China 20035b504601Sjiang wu - Sun Microsystems - Beijing China switch (state) { 20045b504601Sjiang wu - Sun Microsystems - Beijing China case IOUC_READ_PAGE0: 20055b504601Sjiang wu - Sun Microsystems - Beijing China if ((ddi_dma_sync(page_dma_handle, 0, 0, 20065b504601Sjiang wu - Sun Microsystems - Beijing China DDI_DMA_SYNC_FORCPU)) != DDI_SUCCESS) { 20075b504601Sjiang wu - Sun Microsystems - Beijing China goto cleanup; 20085b504601Sjiang wu - Sun Microsystems - Beijing China } 20095b504601Sjiang wu - Sun Microsystems - Beijing China 20105b504601Sjiang wu - Sun Microsystems - Beijing China num_phys = ddi_get8(page_accessp, 20115b504601Sjiang wu - Sun Microsystems - Beijing China &sasioupage0->NumPhys); 20125b504601Sjiang wu - Sun Microsystems - Beijing China for (i = 0; i < num_phys; i++) { 20135b504601Sjiang wu - Sun Microsystems - Beijing China cpdi[i] = ddi_get32(page_accessp, 20145b504601Sjiang wu - Sun Microsystems - Beijing China &sasioupage0->PhyData[i]. 20155b504601Sjiang wu - Sun Microsystems - Beijing China ControllerPhyDeviceInfo); 20165b504601Sjiang wu - Sun Microsystems - Beijing China port_flags = ddi_get8(page_accessp, 20175b504601Sjiang wu - Sun Microsystems - Beijing China &sasioupage0->PhyData[i].PortFlags); 20185b504601Sjiang wu - Sun Microsystems - Beijing China 20195b504601Sjiang wu - Sun Microsystems - Beijing China mpt->m_phy_info[i].port_num = 20205b504601Sjiang wu - Sun Microsystems - Beijing China ddi_get8(page_accessp, 20215b504601Sjiang wu - Sun Microsystems - Beijing China &sasioupage0->PhyData[i].Port); 20225b504601Sjiang wu - Sun Microsystems - Beijing China mpt->m_phy_info[i].ctrl_devhdl = 20235b504601Sjiang wu - Sun Microsystems - Beijing China ddi_get16(page_accessp, &sasioupage0-> 20245b504601Sjiang wu - Sun Microsystems - Beijing China PhyData[i].ControllerDevHandle); 20255b504601Sjiang wu - Sun Microsystems - Beijing China mpt->m_phy_info[i].attached_devhdl = 20265b504601Sjiang wu - Sun Microsystems - Beijing China ddi_get16(page_accessp, &sasioupage0-> 20275b504601Sjiang wu - Sun Microsystems - Beijing China PhyData[i].AttachedDevHandle); 20285b504601Sjiang wu - Sun Microsystems - Beijing China mpt->m_phy_info[i].phy_device_type = cpdi[i]; 20295b504601Sjiang wu - Sun Microsystems - Beijing China mpt->m_phy_info[i].port_flags = port_flags; 20305b504601Sjiang wu - Sun Microsystems - Beijing China 20315b504601Sjiang wu - Sun Microsystems - Beijing China if (port_flags & DISCOVERY_IN_PROGRESS) { 20325b504601Sjiang wu - Sun Microsystems - Beijing China retrypage0++; 20335b504601Sjiang wu - Sun Microsystems - Beijing China NDBG20(("Discovery in progress, can't " 20345b504601Sjiang wu - Sun Microsystems - Beijing China "verify IO unit config, then NO.%d" 20355b504601Sjiang wu - Sun Microsystems - Beijing China " times retry", retrypage0)); 20365b504601Sjiang wu - Sun Microsystems - Beijing China break; 20375b504601Sjiang wu - Sun Microsystems - Beijing China } else { 20385b504601Sjiang wu - Sun Microsystems - Beijing China retrypage0 = 0; 20395b504601Sjiang wu - Sun Microsystems - Beijing China } 20405b504601Sjiang wu - Sun Microsystems - Beijing China if (!(port_flags & AUTO_PORT_CONFIGURATION)) { 20415b504601Sjiang wu - Sun Microsystems - Beijing China /* 20425b504601Sjiang wu - Sun Microsystems - Beijing China * some PHY configuration described in 20435b504601Sjiang wu - Sun Microsystems - Beijing China * SAS IO Unit Page1 20445b504601Sjiang wu - Sun Microsystems - Beijing China */ 20455b504601Sjiang wu - Sun Microsystems - Beijing China readpage1 = 1; 20465b504601Sjiang wu - Sun Microsystems - Beijing China } 20475b504601Sjiang wu - Sun Microsystems - Beijing China } 20485b504601Sjiang wu - Sun Microsystems - Beijing China 20495b504601Sjiang wu - Sun Microsystems - Beijing China /* 20505b504601Sjiang wu - Sun Microsystems - Beijing China * retry 30 times if discovery is in process 20515b504601Sjiang wu - Sun Microsystems - Beijing China */ 20525b504601Sjiang wu - Sun Microsystems - Beijing China if (retrypage0 && (retrypage0 < 30)) { 20535b504601Sjiang wu - Sun Microsystems - Beijing China drv_usecwait(1000 * 100); 20545b504601Sjiang wu - Sun Microsystems - Beijing China state = IOUC_READ_PAGE0; 20555b504601Sjiang wu - Sun Microsystems - Beijing China break; 20565b504601Sjiang wu - Sun Microsystems - Beijing China } else if (retrypage0 == 30) { 20575b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN, 20585b504601Sjiang wu - Sun Microsystems - Beijing China "!Discovery in progress, can't " 20595b504601Sjiang wu - Sun Microsystems - Beijing China "verify IO unit config, then after" 20605b504601Sjiang wu - Sun Microsystems - Beijing China " 30 times retry, give up!"); 20615b504601Sjiang wu - Sun Microsystems - Beijing China state = IOUC_DONE; 20625b504601Sjiang wu - Sun Microsystems - Beijing China rval = DDI_FAILURE; 20635b504601Sjiang wu - Sun Microsystems - Beijing China break; 20645b504601Sjiang wu - Sun Microsystems - Beijing China } 20655b504601Sjiang wu - Sun Microsystems - Beijing China 20665b504601Sjiang wu - Sun Microsystems - Beijing China if (readpage1 == 0) { 20675b504601Sjiang wu - Sun Microsystems - Beijing China state = IOUC_DONE; 20685b504601Sjiang wu - Sun Microsystems - Beijing China rval = DDI_SUCCESS; 20695b504601Sjiang wu - Sun Microsystems - Beijing China break; 20705b504601Sjiang wu - Sun Microsystems - Beijing China } 20715b504601Sjiang wu - Sun Microsystems - Beijing China 20725b504601Sjiang wu - Sun Microsystems - Beijing China state = IOUC_READ_PAGE1; 20735b504601Sjiang wu - Sun Microsystems - Beijing China break; 20745b504601Sjiang wu - Sun Microsystems - Beijing China 20755b504601Sjiang wu - Sun Microsystems - Beijing China case IOUC_READ_PAGE1: 20765b504601Sjiang wu - Sun Microsystems - Beijing China if ((ddi_dma_sync(page_dma_handle, 0, 0, 20775b504601Sjiang wu - Sun Microsystems - Beijing China DDI_DMA_SYNC_FORCPU)) != DDI_SUCCESS) { 20785b504601Sjiang wu - Sun Microsystems - Beijing China goto cleanup; 20795b504601Sjiang wu - Sun Microsystems - Beijing China } 20805b504601Sjiang wu - Sun Microsystems - Beijing China 20815b504601Sjiang wu - Sun Microsystems - Beijing China num_phys = ddi_get8(page_accessp, 20825b504601Sjiang wu - Sun Microsystems - Beijing China &sasioupage1->NumPhys); 20835b504601Sjiang wu - Sun Microsystems - Beijing China 20845b504601Sjiang wu - Sun Microsystems - Beijing China for (i = 0; i < num_phys; i++) { 20855b504601Sjiang wu - Sun Microsystems - Beijing China cpdi[i] = ddi_get32(page_accessp, 20865b504601Sjiang wu - Sun Microsystems - Beijing China &sasioupage1->PhyData[i]. 20875b504601Sjiang wu - Sun Microsystems - Beijing China ControllerPhyDeviceInfo); 20885b504601Sjiang wu - Sun Microsystems - Beijing China port_flags = ddi_get8(page_accessp, 20895b504601Sjiang wu - Sun Microsystems - Beijing China &sasioupage1->PhyData[i].PortFlags); 20905b504601Sjiang wu - Sun Microsystems - Beijing China mpt->m_phy_info[i].port_num = 20915b504601Sjiang wu - Sun Microsystems - Beijing China ddi_get8(page_accessp, 20925b504601Sjiang wu - Sun Microsystems - Beijing China &sasioupage1->PhyData[i].Port); 20935b504601Sjiang wu - Sun Microsystems - Beijing China mpt->m_phy_info[i].port_flags = port_flags; 20945b504601Sjiang wu - Sun Microsystems - Beijing China mpt->m_phy_info[i].phy_device_type = cpdi[i]; 20955b504601Sjiang wu - Sun Microsystems - Beijing China 20965b504601Sjiang wu - Sun Microsystems - Beijing China } 20975b504601Sjiang wu - Sun Microsystems - Beijing China 20985b504601Sjiang wu - Sun Microsystems - Beijing China state = IOUC_DONE; 20995b504601Sjiang wu - Sun Microsystems - Beijing China rval = DDI_SUCCESS; 21005b504601Sjiang wu - Sun Microsystems - Beijing China break; 21015b504601Sjiang wu - Sun Microsystems - Beijing China } 21025b504601Sjiang wu - Sun Microsystems - Beijing China } 21035b504601Sjiang wu - Sun Microsystems - Beijing China if ((mptsas_check_dma_handle(recv_dma_handle) != DDI_SUCCESS) || 21045b504601Sjiang wu - Sun Microsystems - Beijing China (mptsas_check_dma_handle(page_dma_handle) != DDI_SUCCESS)) { 21055b504601Sjiang wu - Sun Microsystems - Beijing China ddi_fm_service_impact(mpt->m_dip, DDI_SERVICE_UNAFFECTED); 21065b504601Sjiang wu - Sun Microsystems - Beijing China rval = DDI_FAILURE; 21075b504601Sjiang wu - Sun Microsystems - Beijing China goto cleanup; 21085b504601Sjiang wu - Sun Microsystems - Beijing China } 21095b504601Sjiang wu - Sun Microsystems - Beijing China if ((mptsas_check_acc_handle(recv_accessp) != DDI_SUCCESS) || 21105b504601Sjiang wu - Sun Microsystems - Beijing China (mptsas_check_acc_handle(page_accessp) != DDI_SUCCESS)) { 21115b504601Sjiang wu - Sun Microsystems - Beijing China ddi_fm_service_impact(mpt->m_dip, DDI_SERVICE_UNAFFECTED); 21125b504601Sjiang wu - Sun Microsystems - Beijing China rval = DDI_FAILURE; 21135b504601Sjiang wu - Sun Microsystems - Beijing China goto cleanup; 21145b504601Sjiang wu - Sun Microsystems - Beijing China } 21155b504601Sjiang wu - Sun Microsystems - Beijing China 21165b504601Sjiang wu - Sun Microsystems - Beijing China cleanup: 21175b504601Sjiang wu - Sun Microsystems - Beijing China if (recv_dmastate & MPTSAS_DMA_HANDLE_BOUND) 21185b504601Sjiang wu - Sun Microsystems - Beijing China (void) ddi_dma_unbind_handle(recv_dma_handle); 21195b504601Sjiang wu - Sun Microsystems - Beijing China if (page_dmastate & MPTSAS_DMA_HANDLE_BOUND) 21205b504601Sjiang wu - Sun Microsystems - Beijing China (void) ddi_dma_unbind_handle(page_dma_handle); 21215b504601Sjiang wu - Sun Microsystems - Beijing China if (recv_dmastate & MPTSAS_DMA_MEMORY_ALLOCD) 21225b504601Sjiang wu - Sun Microsystems - Beijing China (void) ddi_dma_mem_free(&recv_accessp); 21235b504601Sjiang wu - Sun Microsystems - Beijing China if (page_dmastate & MPTSAS_DMA_MEMORY_ALLOCD) 21245b504601Sjiang wu - Sun Microsystems - Beijing China (void) ddi_dma_mem_free(&page_accessp); 21255b504601Sjiang wu - Sun Microsystems - Beijing China if (recv_dmastate & MPTSAS_DMA_HANDLE_ALLOCD) 21265b504601Sjiang wu - Sun Microsystems - Beijing China ddi_dma_free_handle(&recv_dma_handle); 21275b504601Sjiang wu - Sun Microsystems - Beijing China if (page_dmastate & MPTSAS_DMA_HANDLE_ALLOCD) 21285b504601Sjiang wu - Sun Microsystems - Beijing China ddi_dma_free_handle(&page_dma_handle); 21295b504601Sjiang wu - Sun Microsystems - Beijing China 21305b504601Sjiang wu - Sun Microsystems - Beijing China if (rval != DDI_SUCCESS) { 21315b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_fm_ereport(mpt, DDI_FM_DEVICE_NO_RESPONSE); 21325b504601Sjiang wu - Sun Microsystems - Beijing China ddi_fm_service_impact(mpt->m_dip, DDI_SERVICE_LOST); 21335b504601Sjiang wu - Sun Microsystems - Beijing China } 21345b504601Sjiang wu - Sun Microsystems - Beijing China return (rval); 21355b504601Sjiang wu - Sun Microsystems - Beijing China } 21365b504601Sjiang wu - Sun Microsystems - Beijing China 21375b504601Sjiang wu - Sun Microsystems - Beijing China /* 21385b504601Sjiang wu - Sun Microsystems - Beijing China * Check if the PHYs are currently in target mode. If they are not, we don't 21395b504601Sjiang wu - Sun Microsystems - Beijing China * need to change anything. Otherwise, we need to modify the appropriate bits 21405b504601Sjiang wu - Sun Microsystems - Beijing China * and write them to IO unit page 1. Once that is done, an IO unit reset is 21415b504601Sjiang wu - Sun Microsystems - Beijing China * necessary to begin operating in initiator mode. Since this function is only 21425b504601Sjiang wu - Sun Microsystems - Beijing China * called during the initialization process, use handshaking. 21435b504601Sjiang wu - Sun Microsystems - Beijing China */ 21445b504601Sjiang wu - Sun Microsystems - Beijing China int 21455b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_set_initiator_mode(mptsas_t *mpt) 21465b504601Sjiang wu - Sun Microsystems - Beijing China { 21475b504601Sjiang wu - Sun Microsystems - Beijing China ddi_dma_attr_t recv_dma_attrs, page_dma_attrs; 21485b504601Sjiang wu - Sun Microsystems - Beijing China uint_t recv_ncookie, page_ncookie; 21495b504601Sjiang wu - Sun Microsystems - Beijing China ddi_dma_cookie_t recv_cookie, page_cookie; 21505b504601Sjiang wu - Sun Microsystems - Beijing China ddi_dma_handle_t recv_dma_handle, page_dma_handle; 21515b504601Sjiang wu - Sun Microsystems - Beijing China ddi_acc_handle_t recv_accessp, page_accessp; 21525b504601Sjiang wu - Sun Microsystems - Beijing China size_t recv_alloc_len, page_alloc_len; 21535b504601Sjiang wu - Sun Microsystems - Beijing China pMpi2ConfigReply_t configreply; 21545b504601Sjiang wu - Sun Microsystems - Beijing China pMpi2SasIOUnitPage1_t sasioupage1; 21555b504601Sjiang wu - Sun Microsystems - Beijing China int recv_numbytes; 21565b504601Sjiang wu - Sun Microsystems - Beijing China caddr_t recv_memp, page_memp; 21575b504601Sjiang wu - Sun Microsystems - Beijing China int recv_dmastate = 0; 21585b504601Sjiang wu - Sun Microsystems - Beijing China int page_dmastate = 0; 21595b504601Sjiang wu - Sun Microsystems - Beijing China int i; 21605b504601Sjiang wu - Sun Microsystems - Beijing China int page1_size = 21615b504601Sjiang wu - Sun Microsystems - Beijing China sizeof (MPI2_CONFIG_PAGE_SASIOUNIT_1) + 21625b504601Sjiang wu - Sun Microsystems - Beijing China (sizeof (MPI2_SAS_IO_UNIT0_PHY_DATA) * 7); 21635b504601Sjiang wu - Sun Microsystems - Beijing China uint32_t flags_length; 21645b504601Sjiang wu - Sun Microsystems - Beijing China uint32_t cpdi[8], reprogram = 0; 21655b504601Sjiang wu - Sun Microsystems - Beijing China uint16_t iocstatus; 21665b504601Sjiang wu - Sun Microsystems - Beijing China uint8_t port_flags, page_number, action; 21675b504601Sjiang wu - Sun Microsystems - Beijing China uint32_t reply_size = 256; /* Big enough for any page */ 21685b504601Sjiang wu - Sun Microsystems - Beijing China uint_t state; 21695b504601Sjiang wu - Sun Microsystems - Beijing China int rval = DDI_FAILURE; 21705b504601Sjiang wu - Sun Microsystems - Beijing China 21715b504601Sjiang wu - Sun Microsystems - Beijing China ASSERT(mutex_owned(&mpt->m_mutex)); 21725b504601Sjiang wu - Sun Microsystems - Beijing China /* 21735b504601Sjiang wu - Sun Microsystems - Beijing China * get each PHY informations from SAS IO Unit Pages. Use handshakiing 21745b504601Sjiang wu - Sun Microsystems - Beijing China * to get SAS IO Unit Page information since this is during init. 21755b504601Sjiang wu - Sun Microsystems - Beijing China */ 21765b504601Sjiang wu - Sun Microsystems - Beijing China rval = mptsas_get_sas_io_unit_page_hndshk(mpt); 21775b504601Sjiang wu - Sun Microsystems - Beijing China if (rval != DDI_SUCCESS) 21785b504601Sjiang wu - Sun Microsystems - Beijing China return (rval); 21795b504601Sjiang wu - Sun Microsystems - Beijing China 21805b504601Sjiang wu - Sun Microsystems - Beijing China for (i = 0; i < mpt->m_num_phys; i++) { 21815b504601Sjiang wu - Sun Microsystems - Beijing China if (mpt->m_phy_info[i].phy_device_type & 21825b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_SAS_DEVICE_INFO_SSP_TARGET) { 21835b504601Sjiang wu - Sun Microsystems - Beijing China reprogram = 1; 21845b504601Sjiang wu - Sun Microsystems - Beijing China break; 21855b504601Sjiang wu - Sun Microsystems - Beijing China } 21865b504601Sjiang wu - Sun Microsystems - Beijing China } 21875b504601Sjiang wu - Sun Microsystems - Beijing China if (reprogram == 0) 21885b504601Sjiang wu - Sun Microsystems - Beijing China return (DDI_SUCCESS); 21895b504601Sjiang wu - Sun Microsystems - Beijing China 21905b504601Sjiang wu - Sun Microsystems - Beijing China /* 21915b504601Sjiang wu - Sun Microsystems - Beijing China * Initialize our "state machine". This is a bit convoluted, 21925b504601Sjiang wu - Sun Microsystems - Beijing China * but it keeps us from having to do the ddi allocations numerous 21935b504601Sjiang wu - Sun Microsystems - Beijing China * times. 21945b504601Sjiang wu - Sun Microsystems - Beijing China */ 21955b504601Sjiang wu - Sun Microsystems - Beijing China 21965b504601Sjiang wu - Sun Microsystems - Beijing China state = IOUC_READ_PAGE1; 21975b504601Sjiang wu - Sun Microsystems - Beijing China 21985b504601Sjiang wu - Sun Microsystems - Beijing China /* 21995b504601Sjiang wu - Sun Microsystems - Beijing China * dynamically create a customized dma attribute structure 22005b504601Sjiang wu - Sun Microsystems - Beijing China * that describes mpt's config reply page request structure. 22015b504601Sjiang wu - Sun Microsystems - Beijing China */ 22025b504601Sjiang wu - Sun Microsystems - Beijing China recv_dma_attrs = mpt->m_msg_dma_attr; 22035b504601Sjiang wu - Sun Microsystems - Beijing China recv_dma_attrs.dma_attr_sgllen = 1; 22045b504601Sjiang wu - Sun Microsystems - Beijing China recv_dma_attrs.dma_attr_granular = (sizeof (MPI2_CONFIG_REPLY)); 22055b504601Sjiang wu - Sun Microsystems - Beijing China 22065b504601Sjiang wu - Sun Microsystems - Beijing China if (ddi_dma_alloc_handle(mpt->m_dip, &recv_dma_attrs, 22075b504601Sjiang wu - Sun Microsystems - Beijing China DDI_DMA_SLEEP, NULL, &recv_dma_handle) != DDI_SUCCESS) { 22085b504601Sjiang wu - Sun Microsystems - Beijing China goto cleanup; 22095b504601Sjiang wu - Sun Microsystems - Beijing China } 22105b504601Sjiang wu - Sun Microsystems - Beijing China 22115b504601Sjiang wu - Sun Microsystems - Beijing China recv_dmastate |= MPTSAS_DMA_HANDLE_ALLOCD; 22125b504601Sjiang wu - Sun Microsystems - Beijing China 22135b504601Sjiang wu - Sun Microsystems - Beijing China if (ddi_dma_mem_alloc(recv_dma_handle, 22145b504601Sjiang wu - Sun Microsystems - Beijing China (sizeof (MPI2_CONFIG_REPLY)), 22155b504601Sjiang wu - Sun Microsystems - Beijing China &mpt->m_dev_acc_attr, DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, NULL, 22165b504601Sjiang wu - Sun Microsystems - Beijing China &recv_memp, &recv_alloc_len, &recv_accessp) != DDI_SUCCESS) { 22175b504601Sjiang wu - Sun Microsystems - Beijing China goto cleanup; 22185b504601Sjiang wu - Sun Microsystems - Beijing China } 22195b504601Sjiang wu - Sun Microsystems - Beijing China 22205b504601Sjiang wu - Sun Microsystems - Beijing China recv_dmastate |= MPTSAS_DMA_MEMORY_ALLOCD; 22215b504601Sjiang wu - Sun Microsystems - Beijing China 22225b504601Sjiang wu - Sun Microsystems - Beijing China if (ddi_dma_addr_bind_handle(recv_dma_handle, NULL, recv_memp, 22235b504601Sjiang wu - Sun Microsystems - Beijing China recv_alloc_len, DDI_DMA_RDWR | DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, 22245b504601Sjiang wu - Sun Microsystems - Beijing China NULL, &recv_cookie, &recv_ncookie) != DDI_DMA_MAPPED) { 22255b504601Sjiang wu - Sun Microsystems - Beijing China goto cleanup; 22265b504601Sjiang wu - Sun Microsystems - Beijing China } 22275b504601Sjiang wu - Sun Microsystems - Beijing China 22285b504601Sjiang wu - Sun Microsystems - Beijing China recv_dmastate |= MPTSAS_DMA_HANDLE_BOUND; 22295b504601Sjiang wu - Sun Microsystems - Beijing China 22305b504601Sjiang wu - Sun Microsystems - Beijing China page_dma_attrs = mpt->m_msg_dma_attr; 22315b504601Sjiang wu - Sun Microsystems - Beijing China page_dma_attrs.dma_attr_sgllen = 1; 22325b504601Sjiang wu - Sun Microsystems - Beijing China page_dma_attrs.dma_attr_granular = reply_size; 22335b504601Sjiang wu - Sun Microsystems - Beijing China 22345b504601Sjiang wu - Sun Microsystems - Beijing China if (ddi_dma_alloc_handle(mpt->m_dip, &page_dma_attrs, 22355b504601Sjiang wu - Sun Microsystems - Beijing China DDI_DMA_SLEEP, NULL, &page_dma_handle) != DDI_SUCCESS) { 22365b504601Sjiang wu - Sun Microsystems - Beijing China goto cleanup; 22375b504601Sjiang wu - Sun Microsystems - Beijing China } 22385b504601Sjiang wu - Sun Microsystems - Beijing China 22395b504601Sjiang wu - Sun Microsystems - Beijing China page_dmastate |= MPTSAS_DMA_HANDLE_ALLOCD; 22405b504601Sjiang wu - Sun Microsystems - Beijing China 22415b504601Sjiang wu - Sun Microsystems - Beijing China if (ddi_dma_mem_alloc(page_dma_handle, reply_size, 22425b504601Sjiang wu - Sun Microsystems - Beijing China &mpt->m_dev_acc_attr, DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, NULL, 22435b504601Sjiang wu - Sun Microsystems - Beijing China &page_memp, &page_alloc_len, &page_accessp) != DDI_SUCCESS) { 22445b504601Sjiang wu - Sun Microsystems - Beijing China goto cleanup; 22455b504601Sjiang wu - Sun Microsystems - Beijing China } 22465b504601Sjiang wu - Sun Microsystems - Beijing China 22475b504601Sjiang wu - Sun Microsystems - Beijing China page_dmastate |= MPTSAS_DMA_MEMORY_ALLOCD; 22485b504601Sjiang wu - Sun Microsystems - Beijing China 22495b504601Sjiang wu - Sun Microsystems - Beijing China if (ddi_dma_addr_bind_handle(page_dma_handle, NULL, page_memp, 22505b504601Sjiang wu - Sun Microsystems - Beijing China page_alloc_len, DDI_DMA_RDWR | DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, 22515b504601Sjiang wu - Sun Microsystems - Beijing China NULL, &page_cookie, &page_ncookie) != DDI_DMA_MAPPED) { 22525b504601Sjiang wu - Sun Microsystems - Beijing China goto cleanup; 22535b504601Sjiang wu - Sun Microsystems - Beijing China } 22545b504601Sjiang wu - Sun Microsystems - Beijing China 22555b504601Sjiang wu - Sun Microsystems - Beijing China page_dmastate |= MPTSAS_DMA_HANDLE_BOUND; 22565b504601Sjiang wu - Sun Microsystems - Beijing China 22575b504601Sjiang wu - Sun Microsystems - Beijing China /* 22585b504601Sjiang wu - Sun Microsystems - Beijing China * Now we cycle through the state machine. Here's what happens: 22595b504601Sjiang wu - Sun Microsystems - Beijing China * 1. Read IO unit page 1. 22605b504601Sjiang wu - Sun Microsystems - Beijing China * 2. Change the appropriate bits 22615b504601Sjiang wu - Sun Microsystems - Beijing China * 3. Write the updated settings to IO unit page 1. 22625b504601Sjiang wu - Sun Microsystems - Beijing China * 4. Reset the IO unit. 22635b504601Sjiang wu - Sun Microsystems - Beijing China */ 22645b504601Sjiang wu - Sun Microsystems - Beijing China 22655b504601Sjiang wu - Sun Microsystems - Beijing China sasioupage1 = (pMpi2SasIOUnitPage1_t)page_memp; 22665b504601Sjiang wu - Sun Microsystems - Beijing China 22675b504601Sjiang wu - Sun Microsystems - Beijing China while (state != IOUC_DONE) { 22685b504601Sjiang wu - Sun Microsystems - Beijing China switch (state) { 22695b504601Sjiang wu - Sun Microsystems - Beijing China case IOUC_READ_PAGE1: 22705b504601Sjiang wu - Sun Microsystems - Beijing China page_number = 1; 22715b504601Sjiang wu - Sun Microsystems - Beijing China action = MPI2_CONFIG_ACTION_PAGE_READ_CURRENT; 22725b504601Sjiang wu - Sun Microsystems - Beijing China flags_length = (uint32_t)page1_size; 22735b504601Sjiang wu - Sun Microsystems - Beijing China flags_length |= ((uint32_t)( 22745b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_SGE_FLAGS_LAST_ELEMENT | 22755b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_SGE_FLAGS_END_OF_BUFFER | 22765b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_SGE_FLAGS_SIMPLE_ELEMENT | 22775b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_SGE_FLAGS_SYSTEM_ADDRESS | 22785b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_SGE_FLAGS_32_BIT_ADDRESSING | 22795b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_SGE_FLAGS_IOC_TO_HOST | 22805b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_SGE_FLAGS_END_OF_LIST) << 22815b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_SGE_FLAGS_SHIFT); 22825b504601Sjiang wu - Sun Microsystems - Beijing China 22835b504601Sjiang wu - Sun Microsystems - Beijing China break; 22845b504601Sjiang wu - Sun Microsystems - Beijing China 22855b504601Sjiang wu - Sun Microsystems - Beijing China case IOUC_WRITE_PAGE1: 22865b504601Sjiang wu - Sun Microsystems - Beijing China page_number = 1; 22875b504601Sjiang wu - Sun Microsystems - Beijing China action = MPI2_CONFIG_ACTION_PAGE_WRITE_NVRAM; 22885b504601Sjiang wu - Sun Microsystems - Beijing China flags_length = (uint32_t)page1_size; 22895b504601Sjiang wu - Sun Microsystems - Beijing China flags_length |= ((uint32_t)( 22905b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_SGE_FLAGS_LAST_ELEMENT | 22915b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_SGE_FLAGS_END_OF_BUFFER | 22925b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_SGE_FLAGS_SIMPLE_ELEMENT | 22935b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_SGE_FLAGS_SYSTEM_ADDRESS | 22945b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_SGE_FLAGS_32_BIT_ADDRESSING | 22955b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_SGE_FLAGS_HOST_TO_IOC | 22965b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_SGE_FLAGS_END_OF_LIST) << 22975b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_SGE_FLAGS_SHIFT); 22985b504601Sjiang wu - Sun Microsystems - Beijing China 22995b504601Sjiang wu - Sun Microsystems - Beijing China break; 23005b504601Sjiang wu - Sun Microsystems - Beijing China } 23015b504601Sjiang wu - Sun Microsystems - Beijing China 23025b504601Sjiang wu - Sun Microsystems - Beijing China bzero(recv_memp, sizeof (MPI2_CONFIG_REPLY)); 23035b504601Sjiang wu - Sun Microsystems - Beijing China configreply = (pMpi2ConfigReply_t)recv_memp; 23045b504601Sjiang wu - Sun Microsystems - Beijing China recv_numbytes = sizeof (MPI2_CONFIG_REPLY); 23055b504601Sjiang wu - Sun Microsystems - Beijing China 23065b504601Sjiang wu - Sun Microsystems - Beijing China if (mptsas_send_extended_config_request_msg(mpt, 23075b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_CONFIG_ACTION_PAGE_HEADER, 23085b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_CONFIG_EXTPAGETYPE_SAS_IO_UNIT, 23095b504601Sjiang wu - Sun Microsystems - Beijing China 0, page_number, 0, 0, 0, 0)) { 23105b504601Sjiang wu - Sun Microsystems - Beijing China goto cleanup; 23115b504601Sjiang wu - Sun Microsystems - Beijing China } 23125b504601Sjiang wu - Sun Microsystems - Beijing China 23135b504601Sjiang wu - Sun Microsystems - Beijing China if (mptsas_get_handshake_msg(mpt, recv_memp, recv_numbytes, 23145b504601Sjiang wu - Sun Microsystems - Beijing China recv_accessp)) { 23155b504601Sjiang wu - Sun Microsystems - Beijing China goto cleanup; 23165b504601Sjiang wu - Sun Microsystems - Beijing China } 23175b504601Sjiang wu - Sun Microsystems - Beijing China 23185b504601Sjiang wu - Sun Microsystems - Beijing China iocstatus = ddi_get16(recv_accessp, &configreply->IOCStatus); 23195b504601Sjiang wu - Sun Microsystems - Beijing China iocstatus = MPTSAS_IOCSTATUS(iocstatus); 23205b504601Sjiang wu - Sun Microsystems - Beijing China 23215b504601Sjiang wu - Sun Microsystems - Beijing China if (iocstatus != MPI2_IOCSTATUS_SUCCESS) { 23225b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN, 23235b504601Sjiang wu - Sun Microsystems - Beijing China "mptsas_set_initiator_mode: read page hdr iocstatus" 23245b504601Sjiang wu - Sun Microsystems - Beijing China ": 0x%x", iocstatus); 23255b504601Sjiang wu - Sun Microsystems - Beijing China goto cleanup; 23265b504601Sjiang wu - Sun Microsystems - Beijing China } 23275b504601Sjiang wu - Sun Microsystems - Beijing China 23285b504601Sjiang wu - Sun Microsystems - Beijing China if (action != MPI2_CONFIG_ACTION_PAGE_WRITE_NVRAM) { 23295b504601Sjiang wu - Sun Microsystems - Beijing China bzero(page_memp, reply_size); 23305b504601Sjiang wu - Sun Microsystems - Beijing China } 23315b504601Sjiang wu - Sun Microsystems - Beijing China 23325b504601Sjiang wu - Sun Microsystems - Beijing China if (mptsas_send_extended_config_request_msg(mpt, action, 23335b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_CONFIG_EXTPAGETYPE_SAS_IO_UNIT, 0, page_number, 23345b504601Sjiang wu - Sun Microsystems - Beijing China ddi_get8(recv_accessp, &configreply->Header.PageVersion), 23355b504601Sjiang wu - Sun Microsystems - Beijing China ddi_get16(recv_accessp, &configreply->ExtPageLength), 23365b504601Sjiang wu - Sun Microsystems - Beijing China flags_length, page_cookie.dmac_address)) { 23375b504601Sjiang wu - Sun Microsystems - Beijing China goto cleanup; 23385b504601Sjiang wu - Sun Microsystems - Beijing China } 23395b504601Sjiang wu - Sun Microsystems - Beijing China 23405b504601Sjiang wu - Sun Microsystems - Beijing China if (mptsas_get_handshake_msg(mpt, recv_memp, recv_numbytes, 23415b504601Sjiang wu - Sun Microsystems - Beijing China recv_accessp)) { 23425b504601Sjiang wu - Sun Microsystems - Beijing China goto cleanup; 23435b504601Sjiang wu - Sun Microsystems - Beijing China } 23445b504601Sjiang wu - Sun Microsystems - Beijing China 23455b504601Sjiang wu - Sun Microsystems - Beijing China iocstatus = ddi_get16(recv_accessp, &configreply->IOCStatus); 23465b504601Sjiang wu - Sun Microsystems - Beijing China iocstatus = MPTSAS_IOCSTATUS(iocstatus); 23475b504601Sjiang wu - Sun Microsystems - Beijing China 23485b504601Sjiang wu - Sun Microsystems - Beijing China if (iocstatus != MPI2_IOCSTATUS_SUCCESS) { 23495b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN, 23505b504601Sjiang wu - Sun Microsystems - Beijing China "mptsas_set_initiator_mode: IO unit config failed " 23515b504601Sjiang wu - Sun Microsystems - Beijing China "for action %d, iocstatus = 0x%x", action, 23525b504601Sjiang wu - Sun Microsystems - Beijing China iocstatus); 23535b504601Sjiang wu - Sun Microsystems - Beijing China goto cleanup; 23545b504601Sjiang wu - Sun Microsystems - Beijing China } 23555b504601Sjiang wu - Sun Microsystems - Beijing China 23565b504601Sjiang wu - Sun Microsystems - Beijing China switch (state) { 23575b504601Sjiang wu - Sun Microsystems - Beijing China case IOUC_READ_PAGE1: 23585b504601Sjiang wu - Sun Microsystems - Beijing China if ((ddi_dma_sync(page_dma_handle, 0, 0, 23595b504601Sjiang wu - Sun Microsystems - Beijing China DDI_DMA_SYNC_FORCPU)) != DDI_SUCCESS) { 23605b504601Sjiang wu - Sun Microsystems - Beijing China goto cleanup; 23615b504601Sjiang wu - Sun Microsystems - Beijing China } 23625b504601Sjiang wu - Sun Microsystems - Beijing China 23635b504601Sjiang wu - Sun Microsystems - Beijing China /* 23645b504601Sjiang wu - Sun Microsystems - Beijing China * All the PHYs should have the same settings, so we 23655b504601Sjiang wu - Sun Microsystems - Beijing China * really only need to read 1 and use its config for 23665b504601Sjiang wu - Sun Microsystems - Beijing China * every PHY. 23675b504601Sjiang wu - Sun Microsystems - Beijing China */ 23685b504601Sjiang wu - Sun Microsystems - Beijing China 23695b504601Sjiang wu - Sun Microsystems - Beijing China cpdi[0] = ddi_get32(page_accessp, 23705b504601Sjiang wu - Sun Microsystems - Beijing China &sasioupage1->PhyData[0].ControllerPhyDeviceInfo); 23715b504601Sjiang wu - Sun Microsystems - Beijing China port_flags = ddi_get8(page_accessp, 23725b504601Sjiang wu - Sun Microsystems - Beijing China &sasioupage1->PhyData[0].PortFlags); 23735b504601Sjiang wu - Sun Microsystems - Beijing China port_flags |= 23745b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_SASIOUNIT1_PORT_FLAGS_AUTO_PORT_CONFIG; 23755b504601Sjiang wu - Sun Microsystems - Beijing China 23765b504601Sjiang wu - Sun Microsystems - Beijing China /* 23775b504601Sjiang wu - Sun Microsystems - Beijing China * Write the configuration to SAS I/O unit page 1 23785b504601Sjiang wu - Sun Microsystems - Beijing China */ 23795b504601Sjiang wu - Sun Microsystems - Beijing China 23805b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_log(mpt, CE_NOTE, 23815b504601Sjiang wu - Sun Microsystems - Beijing China "?IO unit in target mode, changing to initiator"); 23825b504601Sjiang wu - Sun Microsystems - Beijing China 23835b504601Sjiang wu - Sun Microsystems - Beijing China /* 23845b504601Sjiang wu - Sun Microsystems - Beijing China * Modify the PHY settings for initiator mode 23855b504601Sjiang wu - Sun Microsystems - Beijing China */ 23865b504601Sjiang wu - Sun Microsystems - Beijing China 23875b504601Sjiang wu - Sun Microsystems - Beijing China cpdi[0] &= ~MPI2_SAS_DEVICE_INFO_SSP_TARGET; 23885b504601Sjiang wu - Sun Microsystems - Beijing China cpdi[0] |= (MPI2_SAS_DEVICE_INFO_SSP_INITIATOR | 23895b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_SAS_DEVICE_INFO_STP_INITIATOR | 23905b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_SAS_DEVICE_INFO_SMP_INITIATOR); 23915b504601Sjiang wu - Sun Microsystems - Beijing China 23925b504601Sjiang wu - Sun Microsystems - Beijing China for (i = 0; i < mpt->m_num_phys; i++) { 23935b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put32(page_accessp, 23945b504601Sjiang wu - Sun Microsystems - Beijing China &sasioupage1->PhyData[i]. 23955b504601Sjiang wu - Sun Microsystems - Beijing China ControllerPhyDeviceInfo, cpdi[0]); 23965b504601Sjiang wu - Sun Microsystems - Beijing China ddi_put8(page_accessp, 23975b504601Sjiang wu - Sun Microsystems - Beijing China &sasioupage1->PhyData[i]. 23985b504601Sjiang wu - Sun Microsystems - Beijing China PortFlags, port_flags); 23995b504601Sjiang wu - Sun Microsystems - Beijing China /* 24005b504601Sjiang wu - Sun Microsystems - Beijing China * update phy information 24015b504601Sjiang wu - Sun Microsystems - Beijing China */ 24025b504601Sjiang wu - Sun Microsystems - Beijing China mpt->m_phy_info[i].phy_device_type = cpdi[0]; 24035b504601Sjiang wu - Sun Microsystems - Beijing China mpt->m_phy_info[i].port_flags = port_flags; 24045b504601Sjiang wu - Sun Microsystems - Beijing China } 24055b504601Sjiang wu - Sun Microsystems - Beijing China 24065b504601Sjiang wu - Sun Microsystems - Beijing China if ((ddi_dma_sync(page_dma_handle, 0, 0, 24075b504601Sjiang wu - Sun Microsystems - Beijing China DDI_DMA_SYNC_FORDEV)) != DDI_SUCCESS) { 24085b504601Sjiang wu - Sun Microsystems - Beijing China goto cleanup; 24095b504601Sjiang wu - Sun Microsystems - Beijing China } 24105b504601Sjiang wu - Sun Microsystems - Beijing China 24115b504601Sjiang wu - Sun Microsystems - Beijing China state = IOUC_WRITE_PAGE1; 24125b504601Sjiang wu - Sun Microsystems - Beijing China 24135b504601Sjiang wu - Sun Microsystems - Beijing China break; 24145b504601Sjiang wu - Sun Microsystems - Beijing China 24155b504601Sjiang wu - Sun Microsystems - Beijing China case IOUC_WRITE_PAGE1: 24165b504601Sjiang wu - Sun Microsystems - Beijing China /* 24175b504601Sjiang wu - Sun Microsystems - Beijing China * If we're here, we wrote IO unit page 1 succesfully. 24185b504601Sjiang wu - Sun Microsystems - Beijing China */ 24195b504601Sjiang wu - Sun Microsystems - Beijing China state = IOUC_DONE; 24205b504601Sjiang wu - Sun Microsystems - Beijing China 24215b504601Sjiang wu - Sun Microsystems - Beijing China rval = DDI_SUCCESS; 24225b504601Sjiang wu - Sun Microsystems - Beijing China break; 24235b504601Sjiang wu - Sun Microsystems - Beijing China } 24245b504601Sjiang wu - Sun Microsystems - Beijing China } 24255b504601Sjiang wu - Sun Microsystems - Beijing China 24265b504601Sjiang wu - Sun Microsystems - Beijing China /* 24275b504601Sjiang wu - Sun Microsystems - Beijing China * We need to do a Message Unit Reset in order to activate the changes. 24285b504601Sjiang wu - Sun Microsystems - Beijing China */ 24295b504601Sjiang wu - Sun Microsystems - Beijing China mpt->m_softstate |= MPTSAS_SS_MSG_UNIT_RESET; 24305b504601Sjiang wu - Sun Microsystems - Beijing China rval = mptsas_init_chip(mpt, FALSE); 24315b504601Sjiang wu - Sun Microsystems - Beijing China 24325b504601Sjiang wu - Sun Microsystems - Beijing China cleanup: 24335b504601Sjiang wu - Sun Microsystems - Beijing China if (recv_dmastate & MPTSAS_DMA_HANDLE_BOUND) 24345b504601Sjiang wu - Sun Microsystems - Beijing China (void) ddi_dma_unbind_handle(recv_dma_handle); 24355b504601Sjiang wu - Sun Microsystems - Beijing China if (page_dmastate & MPTSAS_DMA_HANDLE_BOUND) 24365b504601Sjiang wu - Sun Microsystems - Beijing China (void) ddi_dma_unbind_handle(page_dma_handle); 24375b504601Sjiang wu - Sun Microsystems - Beijing China if (recv_dmastate & MPTSAS_DMA_MEMORY_ALLOCD) 24385b504601Sjiang wu - Sun Microsystems - Beijing China (void) ddi_dma_mem_free(&recv_accessp); 24395b504601Sjiang wu - Sun Microsystems - Beijing China if (page_dmastate & MPTSAS_DMA_MEMORY_ALLOCD) 24405b504601Sjiang wu - Sun Microsystems - Beijing China (void) ddi_dma_mem_free(&page_accessp); 24415b504601Sjiang wu - Sun Microsystems - Beijing China if (recv_dmastate & MPTSAS_DMA_HANDLE_ALLOCD) 24425b504601Sjiang wu - Sun Microsystems - Beijing China ddi_dma_free_handle(&recv_dma_handle); 24435b504601Sjiang wu - Sun Microsystems - Beijing China if (page_dmastate & MPTSAS_DMA_HANDLE_ALLOCD) 24445b504601Sjiang wu - Sun Microsystems - Beijing China ddi_dma_free_handle(&page_dma_handle); 24455b504601Sjiang wu - Sun Microsystems - Beijing China 24465b504601Sjiang wu - Sun Microsystems - Beijing China return (rval); 24475b504601Sjiang wu - Sun Microsystems - Beijing China } 24485b504601Sjiang wu - Sun Microsystems - Beijing China 24495b504601Sjiang wu - Sun Microsystems - Beijing China /* 24505b504601Sjiang wu - Sun Microsystems - Beijing China * mptsas_get_manufacture_page5 24515b504601Sjiang wu - Sun Microsystems - Beijing China * 24525b504601Sjiang wu - Sun Microsystems - Beijing China * This function will retrieve the base WWID from the adapter. Since this 24535b504601Sjiang wu - Sun Microsystems - Beijing China * function is only called during the initialization process, use handshaking. 24545b504601Sjiang wu - Sun Microsystems - Beijing China */ 24555b504601Sjiang wu - Sun Microsystems - Beijing China int 24565b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_get_manufacture_page5(mptsas_t *mpt) 24575b504601Sjiang wu - Sun Microsystems - Beijing China { 24585b504601Sjiang wu - Sun Microsystems - Beijing China ddi_dma_attr_t recv_dma_attrs, page_dma_attrs; 24595b504601Sjiang wu - Sun Microsystems - Beijing China ddi_dma_cookie_t recv_cookie, page_cookie; 24605b504601Sjiang wu - Sun Microsystems - Beijing China ddi_dma_handle_t recv_dma_handle, page_dma_handle; 24615b504601Sjiang wu - Sun Microsystems - Beijing China ddi_acc_handle_t recv_accessp, page_accessp; 24625b504601Sjiang wu - Sun Microsystems - Beijing China size_t recv_alloc_len, page_alloc_len; 24635b504601Sjiang wu - Sun Microsystems - Beijing China pMpi2ConfigReply_t configreply; 24645b504601Sjiang wu - Sun Microsystems - Beijing China uint_t recv_ncookie, page_ncookie; 24655b504601Sjiang wu - Sun Microsystems - Beijing China caddr_t recv_memp, page_memp; 24665b504601Sjiang wu - Sun Microsystems - Beijing China int recv_numbytes; 24675b504601Sjiang wu - Sun Microsystems - Beijing China pMpi2ManufacturingPage5_t m5; 24685b504601Sjiang wu - Sun Microsystems - Beijing China int recv_dmastate = 0; 24695b504601Sjiang wu - Sun Microsystems - Beijing China int page_dmastate = 0; 24705b504601Sjiang wu - Sun Microsystems - Beijing China uint32_t flagslength; 24715b504601Sjiang wu - Sun Microsystems - Beijing China int rval = DDI_SUCCESS; 24725b504601Sjiang wu - Sun Microsystems - Beijing China uint_t iocstatus; 24735b504601Sjiang wu - Sun Microsystems - Beijing China 24745b504601Sjiang wu - Sun Microsystems - Beijing China MPTSAS_DISABLE_INTR(mpt); 24755b504601Sjiang wu - Sun Microsystems - Beijing China 24765b504601Sjiang wu - Sun Microsystems - Beijing China if (mptsas_send_config_request_msg(mpt, MPI2_CONFIG_ACTION_PAGE_HEADER, 24775b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_CONFIG_PAGETYPE_MANUFACTURING, 0, 5, 0, 0, 0, 0)) { 24785b504601Sjiang wu - Sun Microsystems - Beijing China rval = DDI_FAILURE; 24795b504601Sjiang wu - Sun Microsystems - Beijing China goto done; 24805b504601Sjiang wu - Sun Microsystems - Beijing China } 24815b504601Sjiang wu - Sun Microsystems - Beijing China 24825b504601Sjiang wu - Sun Microsystems - Beijing China /* 24835b504601Sjiang wu - Sun Microsystems - Beijing China * dynamically create a customized dma attribute structure 24845b504601Sjiang wu - Sun Microsystems - Beijing China * that describes the MPT's config reply page request structure. 24855b504601Sjiang wu - Sun Microsystems - Beijing China */ 24865b504601Sjiang wu - Sun Microsystems - Beijing China recv_dma_attrs = mpt->m_msg_dma_attr; 24875b504601Sjiang wu - Sun Microsystems - Beijing China recv_dma_attrs.dma_attr_sgllen = 1; 24885b504601Sjiang wu - Sun Microsystems - Beijing China recv_dma_attrs.dma_attr_granular = (sizeof (MPI2_CONFIG_REPLY)); 24895b504601Sjiang wu - Sun Microsystems - Beijing China 24905b504601Sjiang wu - Sun Microsystems - Beijing China if (ddi_dma_alloc_handle(mpt->m_dip, &recv_dma_attrs, 24915b504601Sjiang wu - Sun Microsystems - Beijing China DDI_DMA_SLEEP, NULL, &recv_dma_handle) != DDI_SUCCESS) { 24925b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN, 24935b504601Sjiang wu - Sun Microsystems - Beijing China "(unable to allocate dma handle."); 24945b504601Sjiang wu - Sun Microsystems - Beijing China rval = DDI_FAILURE; 24955b504601Sjiang wu - Sun Microsystems - Beijing China goto done; 24965b504601Sjiang wu - Sun Microsystems - Beijing China } 24975b504601Sjiang wu - Sun Microsystems - Beijing China recv_dmastate |= MPTSAS_DMA_HANDLE_ALLOCD; 24985b504601Sjiang wu - Sun Microsystems - Beijing China 24995b504601Sjiang wu - Sun Microsystems - Beijing China if (ddi_dma_mem_alloc(recv_dma_handle, 25005b504601Sjiang wu - Sun Microsystems - Beijing China (sizeof (MPI2_CONFIG_REPLY)), 25015b504601Sjiang wu - Sun Microsystems - Beijing China &mpt->m_dev_acc_attr, DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, NULL, 25025b504601Sjiang wu - Sun Microsystems - Beijing China &recv_memp, &recv_alloc_len, &recv_accessp) != DDI_SUCCESS) { 25035b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN, 25045b504601Sjiang wu - Sun Microsystems - Beijing China "unable to allocate config_reply structure."); 25055b504601Sjiang wu - Sun Microsystems - Beijing China rval = DDI_FAILURE; 25065b504601Sjiang wu - Sun Microsystems - Beijing China goto done; 25075b504601Sjiang wu - Sun Microsystems - Beijing China } 25085b504601Sjiang wu - Sun Microsystems - Beijing China recv_dmastate |= MPTSAS_DMA_MEMORY_ALLOCD; 25095b504601Sjiang wu - Sun Microsystems - Beijing China 25105b504601Sjiang wu - Sun Microsystems - Beijing China if (ddi_dma_addr_bind_handle(recv_dma_handle, NULL, recv_memp, 25115b504601Sjiang wu - Sun Microsystems - Beijing China recv_alloc_len, DDI_DMA_RDWR | DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, 25125b504601Sjiang wu - Sun Microsystems - Beijing China NULL, &recv_cookie, &recv_ncookie) != DDI_DMA_MAPPED) { 25135b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN, "unable to bind DMA resources."); 25145b504601Sjiang wu - Sun Microsystems - Beijing China rval = DDI_FAILURE; 25155b504601Sjiang wu - Sun Microsystems - Beijing China goto done; 25165b504601Sjiang wu - Sun Microsystems - Beijing China } 25175b504601Sjiang wu - Sun Microsystems - Beijing China recv_dmastate |= MPTSAS_DMA_HANDLE_BOUND; 25185b504601Sjiang wu - Sun Microsystems - Beijing China bzero(recv_memp, sizeof (MPI2_CONFIG_REPLY)); 25195b504601Sjiang wu - Sun Microsystems - Beijing China configreply = (pMpi2ConfigReply_t)recv_memp; 25205b504601Sjiang wu - Sun Microsystems - Beijing China recv_numbytes = sizeof (MPI2_CONFIG_REPLY); 25215b504601Sjiang wu - Sun Microsystems - Beijing China 25225b504601Sjiang wu - Sun Microsystems - Beijing China /* 25235b504601Sjiang wu - Sun Microsystems - Beijing China * get config reply message 25245b504601Sjiang wu - Sun Microsystems - Beijing China */ 25255b504601Sjiang wu - Sun Microsystems - Beijing China if (mptsas_get_handshake_msg(mpt, recv_memp, recv_numbytes, 25265b504601Sjiang wu - Sun Microsystems - Beijing China recv_accessp)) { 25275b504601Sjiang wu - Sun Microsystems - Beijing China rval = DDI_FAILURE; 25285b504601Sjiang wu - Sun Microsystems - Beijing China goto done; 25295b504601Sjiang wu - Sun Microsystems - Beijing China } 25305b504601Sjiang wu - Sun Microsystems - Beijing China 25315b504601Sjiang wu - Sun Microsystems - Beijing China if (iocstatus = ddi_get16(recv_accessp, &configreply->IOCStatus)) { 25325b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN, "mptsas_get_manufacture_page5 update: " 25335b504601Sjiang wu - Sun Microsystems - Beijing China "IOCStatus=0x%x, IOCLogInfo=0x%x", iocstatus, 25345b504601Sjiang wu - Sun Microsystems - Beijing China ddi_get32(recv_accessp, &configreply->IOCLogInfo)); 25355b504601Sjiang wu - Sun Microsystems - Beijing China goto done; 25365b504601Sjiang wu - Sun Microsystems - Beijing China } 25375b504601Sjiang wu - Sun Microsystems - Beijing China 25385b504601Sjiang wu - Sun Microsystems - Beijing China /* 25395b504601Sjiang wu - Sun Microsystems - Beijing China * dynamically create a customized dma attribute structure 25405b504601Sjiang wu - Sun Microsystems - Beijing China * that describes the MPT's config page structure. 25415b504601Sjiang wu - Sun Microsystems - Beijing China */ 25425b504601Sjiang wu - Sun Microsystems - Beijing China page_dma_attrs = mpt->m_msg_dma_attr; 25435b504601Sjiang wu - Sun Microsystems - Beijing China page_dma_attrs.dma_attr_sgllen = 1; 25445b504601Sjiang wu - Sun Microsystems - Beijing China page_dma_attrs.dma_attr_granular = (sizeof (MPI2_CONFIG_PAGE_MAN_5)); 25455b504601Sjiang wu - Sun Microsystems - Beijing China 25465b504601Sjiang wu - Sun Microsystems - Beijing China if (ddi_dma_alloc_handle(mpt->m_dip, &page_dma_attrs, 25475b504601Sjiang wu - Sun Microsystems - Beijing China DDI_DMA_SLEEP, NULL, &page_dma_handle) != DDI_SUCCESS) { 25485b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN, 25495b504601Sjiang wu - Sun Microsystems - Beijing China "(unable to allocate dma handle."); 25505b504601Sjiang wu - Sun Microsystems - Beijing China rval = DDI_FAILURE; 25515b504601Sjiang wu - Sun Microsystems - Beijing China goto done; 25525b504601Sjiang wu - Sun Microsystems - Beijing China } 25535b504601Sjiang wu - Sun Microsystems - Beijing China page_dmastate |= MPTSAS_DMA_HANDLE_ALLOCD; 25545b504601Sjiang wu - Sun Microsystems - Beijing China 25555b504601Sjiang wu - Sun Microsystems - Beijing China if (ddi_dma_mem_alloc(page_dma_handle, 25565b504601Sjiang wu - Sun Microsystems - Beijing China (sizeof (MPI2_CONFIG_PAGE_MAN_5)), 25575b504601Sjiang wu - Sun Microsystems - Beijing China &mpt->m_dev_acc_attr, DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, NULL, 25585b504601Sjiang wu - Sun Microsystems - Beijing China &page_memp, &page_alloc_len, &page_accessp) != DDI_SUCCESS) { 25595b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN, 25605b504601Sjiang wu - Sun Microsystems - Beijing China "unable to allocate manufacturing page structure."); 25615b504601Sjiang wu - Sun Microsystems - Beijing China rval = DDI_FAILURE; 25625b504601Sjiang wu - Sun Microsystems - Beijing China goto done; 25635b504601Sjiang wu - Sun Microsystems - Beijing China } 25645b504601Sjiang wu - Sun Microsystems - Beijing China page_dmastate |= MPTSAS_DMA_MEMORY_ALLOCD; 25655b504601Sjiang wu - Sun Microsystems - Beijing China 25665b504601Sjiang wu - Sun Microsystems - Beijing China if (ddi_dma_addr_bind_handle(page_dma_handle, NULL, page_memp, 25675b504601Sjiang wu - Sun Microsystems - Beijing China page_alloc_len, DDI_DMA_RDWR | DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, 25685b504601Sjiang wu - Sun Microsystems - Beijing China NULL, &page_cookie, &page_ncookie) != DDI_DMA_MAPPED) { 25695b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN, "unable to bind DMA resources."); 25705b504601Sjiang wu - Sun Microsystems - Beijing China rval = DDI_FAILURE; 25715b504601Sjiang wu - Sun Microsystems - Beijing China goto done; 25725b504601Sjiang wu - Sun Microsystems - Beijing China } 25735b504601Sjiang wu - Sun Microsystems - Beijing China page_dmastate |= MPTSAS_DMA_HANDLE_BOUND; 25745b504601Sjiang wu - Sun Microsystems - Beijing China bzero(page_memp, sizeof (MPI2_CONFIG_PAGE_MAN_5)); 25755b504601Sjiang wu - Sun Microsystems - Beijing China m5 = (pMpi2ManufacturingPage5_t)page_memp; 25765b504601Sjiang wu - Sun Microsystems - Beijing China 25775b504601Sjiang wu - Sun Microsystems - Beijing China /* 25785b504601Sjiang wu - Sun Microsystems - Beijing China * Give reply address to IOC to store config page in and send 25795b504601Sjiang wu - Sun Microsystems - Beijing China * config request out. 25805b504601Sjiang wu - Sun Microsystems - Beijing China */ 25815b504601Sjiang wu - Sun Microsystems - Beijing China 25825b504601Sjiang wu - Sun Microsystems - Beijing China flagslength = sizeof (MPI2_CONFIG_PAGE_MAN_5); 25835b504601Sjiang wu - Sun Microsystems - Beijing China flagslength |= ((uint32_t)(MPI2_SGE_FLAGS_LAST_ELEMENT | 25845b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_SGE_FLAGS_END_OF_BUFFER | MPI2_SGE_FLAGS_SIMPLE_ELEMENT | 25855b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_SGE_FLAGS_SYSTEM_ADDRESS | MPI2_SGE_FLAGS_32_BIT_ADDRESSING | 25865b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_SGE_FLAGS_IOC_TO_HOST | 25875b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_SGE_FLAGS_END_OF_LIST) << MPI2_SGE_FLAGS_SHIFT); 25885b504601Sjiang wu - Sun Microsystems - Beijing China 25895b504601Sjiang wu - Sun Microsystems - Beijing China if (mptsas_send_config_request_msg(mpt, 25905b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_CONFIG_ACTION_PAGE_READ_CURRENT, 25915b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_CONFIG_PAGETYPE_MANUFACTURING, 0, 5, 25925b504601Sjiang wu - Sun Microsystems - Beijing China ddi_get8(recv_accessp, &configreply->Header.PageVersion), 25935b504601Sjiang wu - Sun Microsystems - Beijing China ddi_get8(recv_accessp, &configreply->Header.PageLength), 25945b504601Sjiang wu - Sun Microsystems - Beijing China flagslength, page_cookie.dmac_address)) { 25955b504601Sjiang wu - Sun Microsystems - Beijing China rval = DDI_FAILURE; 25965b504601Sjiang wu - Sun Microsystems - Beijing China goto done; 25975b504601Sjiang wu - Sun Microsystems - Beijing China } 25985b504601Sjiang wu - Sun Microsystems - Beijing China 25995b504601Sjiang wu - Sun Microsystems - Beijing China /* 26005b504601Sjiang wu - Sun Microsystems - Beijing China * get reply view handshake 26015b504601Sjiang wu - Sun Microsystems - Beijing China */ 26025b504601Sjiang wu - Sun Microsystems - Beijing China if (mptsas_get_handshake_msg(mpt, recv_memp, recv_numbytes, 26035b504601Sjiang wu - Sun Microsystems - Beijing China recv_accessp)) { 26045b504601Sjiang wu - Sun Microsystems - Beijing China rval = DDI_FAILURE; 26055b504601Sjiang wu - Sun Microsystems - Beijing China goto done; 26065b504601Sjiang wu - Sun Microsystems - Beijing China } 26075b504601Sjiang wu - Sun Microsystems - Beijing China 26085b504601Sjiang wu - Sun Microsystems - Beijing China if (iocstatus = ddi_get16(recv_accessp, &configreply->IOCStatus)) { 26095b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN, "mptsas_get_manufacture_page5 config: " 26105b504601Sjiang wu - Sun Microsystems - Beijing China "IOCStatus=0x%x, IOCLogInfo=0x%x", iocstatus, 26115b504601Sjiang wu - Sun Microsystems - Beijing China ddi_get32(recv_accessp, &configreply->IOCLogInfo)); 26125b504601Sjiang wu - Sun Microsystems - Beijing China goto done; 26135b504601Sjiang wu - Sun Microsystems - Beijing China } 26145b504601Sjiang wu - Sun Microsystems - Beijing China 26155b504601Sjiang wu - Sun Microsystems - Beijing China (void) ddi_dma_sync(page_dma_handle, 0, 0, DDI_DMA_SYNC_FORCPU); 26165b504601Sjiang wu - Sun Microsystems - Beijing China 26175b504601Sjiang wu - Sun Microsystems - Beijing China /* 26185b504601Sjiang wu - Sun Microsystems - Beijing China * Fusion-MPT stores fields in little-endian format. This is 26195b504601Sjiang wu - Sun Microsystems - Beijing China * why the low-order 32 bits are stored first. 26205b504601Sjiang wu - Sun Microsystems - Beijing China */ 26215b504601Sjiang wu - Sun Microsystems - Beijing China mpt->un.sasaddr.m_base_wwid_lo = 26225b504601Sjiang wu - Sun Microsystems - Beijing China ddi_get32(page_accessp, (uint32_t *)(void *)&m5->Phy[0].WWID); 26235b504601Sjiang wu - Sun Microsystems - Beijing China mpt->un.sasaddr.m_base_wwid_hi = 26245b504601Sjiang wu - Sun Microsystems - Beijing China ddi_get32(page_accessp, (uint32_t *)(void *)&m5->Phy[0].WWID + 1); 26255b504601Sjiang wu - Sun Microsystems - Beijing China 26265b504601Sjiang wu - Sun Microsystems - Beijing China if (ddi_prop_update_int64(DDI_DEV_T_NONE, mpt->m_dip, 26275b504601Sjiang wu - Sun Microsystems - Beijing China "base-wwid", mpt->un.m_base_wwid) != DDI_PROP_SUCCESS) { 26285b504601Sjiang wu - Sun Microsystems - Beijing China NDBG2(("%s%d: failed to create base-wwid property", 26295b504601Sjiang wu - Sun Microsystems - Beijing China ddi_driver_name(mpt->m_dip), ddi_get_instance(mpt->m_dip))); 26305b504601Sjiang wu - Sun Microsystems - Beijing China } 26315b504601Sjiang wu - Sun Microsystems - Beijing China 26325b504601Sjiang wu - Sun Microsystems - Beijing China /* 26335b504601Sjiang wu - Sun Microsystems - Beijing China * Set the number of PHYs present. 26345b504601Sjiang wu - Sun Microsystems - Beijing China */ 26355b504601Sjiang wu - Sun Microsystems - Beijing China mpt->m_num_phys = ddi_get8(page_accessp, (uint8_t *)&m5->NumPhys); 26365b504601Sjiang wu - Sun Microsystems - Beijing China 26375b504601Sjiang wu - Sun Microsystems - Beijing China if (ddi_prop_update_int(DDI_DEV_T_NONE, mpt->m_dip, 26385b504601Sjiang wu - Sun Microsystems - Beijing China "num-phys", mpt->m_num_phys) != DDI_PROP_SUCCESS) { 26395b504601Sjiang wu - Sun Microsystems - Beijing China NDBG2(("%s%d: failed to create num-phys property", 26405b504601Sjiang wu - Sun Microsystems - Beijing China ddi_driver_name(mpt->m_dip), ddi_get_instance(mpt->m_dip))); 26415b504601Sjiang wu - Sun Microsystems - Beijing China } 26425b504601Sjiang wu - Sun Microsystems - Beijing China 26435b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_log(mpt, CE_NOTE, "!mpt%d: Initiator WWNs: 0x%016llx-0x%016llx", 26445b504601Sjiang wu - Sun Microsystems - Beijing China mpt->m_instance, (unsigned long long)mpt->un.m_base_wwid, 26455b504601Sjiang wu - Sun Microsystems - Beijing China (unsigned long long)mpt->un.m_base_wwid + mpt->m_num_phys - 1); 26465b504601Sjiang wu - Sun Microsystems - Beijing China 26475b504601Sjiang wu - Sun Microsystems - Beijing China if ((mptsas_check_dma_handle(recv_dma_handle) != DDI_SUCCESS) || 26485b504601Sjiang wu - Sun Microsystems - Beijing China (mptsas_check_dma_handle(page_dma_handle) != DDI_SUCCESS)) { 26495b504601Sjiang wu - Sun Microsystems - Beijing China ddi_fm_service_impact(mpt->m_dip, DDI_SERVICE_UNAFFECTED); 26505b504601Sjiang wu - Sun Microsystems - Beijing China rval = DDI_FAILURE; 26515b504601Sjiang wu - Sun Microsystems - Beijing China goto done; 26525b504601Sjiang wu - Sun Microsystems - Beijing China } 26535b504601Sjiang wu - Sun Microsystems - Beijing China if ((mptsas_check_acc_handle(recv_accessp) != DDI_SUCCESS) || 26545b504601Sjiang wu - Sun Microsystems - Beijing China (mptsas_check_acc_handle(page_accessp) != DDI_SUCCESS)) { 26555b504601Sjiang wu - Sun Microsystems - Beijing China ddi_fm_service_impact(mpt->m_dip, DDI_SERVICE_UNAFFECTED); 26565b504601Sjiang wu - Sun Microsystems - Beijing China rval = DDI_FAILURE; 26575b504601Sjiang wu - Sun Microsystems - Beijing China } 26585b504601Sjiang wu - Sun Microsystems - Beijing China done: 26595b504601Sjiang wu - Sun Microsystems - Beijing China /* 26605b504601Sjiang wu - Sun Microsystems - Beijing China * free up memory 26615b504601Sjiang wu - Sun Microsystems - Beijing China */ 26625b504601Sjiang wu - Sun Microsystems - Beijing China if (recv_dmastate & MPTSAS_DMA_HANDLE_BOUND) 26635b504601Sjiang wu - Sun Microsystems - Beijing China (void) ddi_dma_unbind_handle(recv_dma_handle); 26645b504601Sjiang wu - Sun Microsystems - Beijing China if (page_dmastate & MPTSAS_DMA_HANDLE_BOUND) 26655b504601Sjiang wu - Sun Microsystems - Beijing China (void) ddi_dma_unbind_handle(page_dma_handle); 26665b504601Sjiang wu - Sun Microsystems - Beijing China if (recv_dmastate & MPTSAS_DMA_MEMORY_ALLOCD) 26675b504601Sjiang wu - Sun Microsystems - Beijing China (void) ddi_dma_mem_free(&recv_accessp); 26685b504601Sjiang wu - Sun Microsystems - Beijing China if (page_dmastate & MPTSAS_DMA_MEMORY_ALLOCD) 26695b504601Sjiang wu - Sun Microsystems - Beijing China (void) ddi_dma_mem_free(&page_accessp); 26705b504601Sjiang wu - Sun Microsystems - Beijing China if (recv_dmastate & MPTSAS_DMA_HANDLE_ALLOCD) 26715b504601Sjiang wu - Sun Microsystems - Beijing China ddi_dma_free_handle(&recv_dma_handle); 26725b504601Sjiang wu - Sun Microsystems - Beijing China if (page_dmastate & MPTSAS_DMA_HANDLE_ALLOCD) 26735b504601Sjiang wu - Sun Microsystems - Beijing China ddi_dma_free_handle(&page_dma_handle); 26745b504601Sjiang wu - Sun Microsystems - Beijing China 26755b504601Sjiang wu - Sun Microsystems - Beijing China MPTSAS_ENABLE_INTR(mpt); 26765b504601Sjiang wu - Sun Microsystems - Beijing China 26775b504601Sjiang wu - Sun Microsystems - Beijing China return (rval); 26785b504601Sjiang wu - Sun Microsystems - Beijing China } 2679