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 /*
23da4badc0SKeith M Wesolowski * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
24da4badc0SKeith M Wesolowski * Use is subject to license terms.
25940efceeSAndy Giles * Copyright (c) 2014, Tegile Systems Inc. All rights reserved.
2639fd84a8SHans Rosenfeld * Copyright 2015 Nexenta Systems, Inc. All rights reserved.
27*72a2c484SHans Rosenfeld * Copyright 2023 Racktop Systems, Inc.
285b504601Sjiang wu - Sun Microsystems - Beijing China */
295b504601Sjiang wu - Sun Microsystems - Beijing China
305b504601Sjiang wu - Sun Microsystems - Beijing China /*
31c8f74a56SAda * Copyright (c) 2000 to 2010, LSI Corporation.
325b504601Sjiang wu - Sun Microsystems - Beijing China * All rights reserved.
335b504601Sjiang wu - Sun Microsystems - Beijing China *
345b504601Sjiang wu - Sun Microsystems - Beijing China * Redistribution and use in source and binary forms of all code within
355b504601Sjiang wu - Sun Microsystems - Beijing China * this file that is exclusively owned by LSI, with or without
365b504601Sjiang wu - Sun Microsystems - Beijing China * modification, is permitted provided that, in addition to the CDDL 1.0
375b504601Sjiang wu - Sun Microsystems - Beijing China * License requirements, the following conditions are met:
385b504601Sjiang wu - Sun Microsystems - Beijing China *
395b504601Sjiang wu - Sun Microsystems - Beijing China * Neither the name of the author nor the names of its contributors may be
405b504601Sjiang wu - Sun Microsystems - Beijing China * used to endorse or promote products derived from this software without
415b504601Sjiang wu - Sun Microsystems - Beijing China * specific prior written permission.
425b504601Sjiang wu - Sun Microsystems - Beijing China *
435b504601Sjiang wu - Sun Microsystems - Beijing China * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
445b504601Sjiang wu - Sun Microsystems - Beijing China * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
455b504601Sjiang wu - Sun Microsystems - Beijing China * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
465b504601Sjiang wu - Sun Microsystems - Beijing China * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
475b504601Sjiang wu - Sun Microsystems - Beijing China * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
485b504601Sjiang wu - Sun Microsystems - Beijing China * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
495b504601Sjiang wu - Sun Microsystems - Beijing China * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
505b504601Sjiang wu - Sun Microsystems - Beijing China * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
515b504601Sjiang wu - Sun Microsystems - Beijing China * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
525b504601Sjiang wu - Sun Microsystems - Beijing China * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
535b504601Sjiang wu - Sun Microsystems - Beijing China * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
545b504601Sjiang wu - Sun Microsystems - Beijing China * DAMAGE.
555b504601Sjiang wu - Sun Microsystems - Beijing China */
565b504601Sjiang wu - Sun Microsystems - Beijing China
575b504601Sjiang wu - Sun Microsystems - Beijing China /*
585b504601Sjiang wu - Sun Microsystems - Beijing China * mptsas_raid - This file contains all the RAID related functions for the
595b504601Sjiang wu - Sun Microsystems - Beijing China * MPT interface.
605b504601Sjiang wu - Sun Microsystems - Beijing China */
615b504601Sjiang wu - Sun Microsystems - Beijing China
625b504601Sjiang wu - Sun Microsystems - Beijing China #if defined(lint) || defined(DEBUG)
635b504601Sjiang wu - Sun Microsystems - Beijing China #define MPTSAS_DEBUG
645b504601Sjiang wu - Sun Microsystems - Beijing China #endif
655b504601Sjiang wu - Sun Microsystems - Beijing China
665b504601Sjiang wu - Sun Microsystems - Beijing China #define MPI_RAID_VOL_PAGE_0_PHYSDISK_MAX 2
675b504601Sjiang wu - Sun Microsystems - Beijing China
685b504601Sjiang wu - Sun Microsystems - Beijing China /*
695b504601Sjiang wu - Sun Microsystems - Beijing China * standard header files
705b504601Sjiang wu - Sun Microsystems - Beijing China */
715b504601Sjiang wu - Sun Microsystems - Beijing China #include <sys/note.h>
725b504601Sjiang wu - Sun Microsystems - Beijing China #include <sys/scsi/scsi.h>
735b504601Sjiang wu - Sun Microsystems - Beijing China #include <sys/byteorder.h>
745b504601Sjiang wu - Sun Microsystems - Beijing China #include <sys/raidioctl.h>
755b504601Sjiang wu - Sun Microsystems - Beijing China
765b504601Sjiang wu - Sun Microsystems - Beijing China #pragma pack(1)
775b504601Sjiang wu - Sun Microsystems - Beijing China
78*72a2c484SHans Rosenfeld #include <sys/scsi/adapters/mpi/mpi2_type.h>
79*72a2c484SHans Rosenfeld #include <sys/scsi/adapters/mpi/mpi2.h>
80*72a2c484SHans Rosenfeld #include <sys/scsi/adapters/mpi/mpi2_cnfg.h>
81*72a2c484SHans Rosenfeld #include <sys/scsi/adapters/mpi/mpi2_init.h>
82*72a2c484SHans Rosenfeld #include <sys/scsi/adapters/mpi/mpi2_ioc.h>
83*72a2c484SHans Rosenfeld #include <sys/scsi/adapters/mpi/mpi2_raid.h>
84*72a2c484SHans Rosenfeld #include <sys/scsi/adapters/mpi/mpi2_tool.h>
855b504601Sjiang wu - Sun Microsystems - Beijing China
865b504601Sjiang wu - Sun Microsystems - Beijing China #pragma pack()
875b504601Sjiang wu - Sun Microsystems - Beijing China
885b504601Sjiang wu - Sun Microsystems - Beijing China /*
895b504601Sjiang wu - Sun Microsystems - Beijing China * private header files.
905b504601Sjiang wu - Sun Microsystems - Beijing China */
915b504601Sjiang wu - Sun Microsystems - Beijing China #include <sys/scsi/adapters/mpt_sas/mptsas_var.h>
925b504601Sjiang wu - Sun Microsystems - Beijing China
935b504601Sjiang wu - Sun Microsystems - Beijing China static int mptsas_get_raid_wwid(mptsas_t *mpt, mptsas_raidvol_t *raidvol);
945b504601Sjiang wu - Sun Microsystems - Beijing China
955b504601Sjiang wu - Sun Microsystems - Beijing China extern int mptsas_check_dma_handle(ddi_dma_handle_t handle);
965b504601Sjiang wu - Sun Microsystems - Beijing China extern int mptsas_check_acc_handle(ddi_acc_handle_t handle);
9739fd84a8SHans Rosenfeld extern mptsas_target_t *mptsas_tgt_alloc(refhash_t *, uint16_t,
98da4badc0SKeith M Wesolowski uint64_t, uint32_t, mptsas_phymask_t, uint8_t);
995b504601Sjiang wu - Sun Microsystems - Beijing China
1005b504601Sjiang wu - Sun Microsystems - Beijing China static int
mptsas_raidconf_page_0_cb(mptsas_t * mpt,caddr_t page_memp,ddi_acc_handle_t accessp,uint16_t iocstatus,uint32_t iocloginfo,va_list ap)1015b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_raidconf_page_0_cb(mptsas_t *mpt, caddr_t page_memp,
1025b504601Sjiang wu - Sun Microsystems - Beijing China ddi_acc_handle_t accessp, uint16_t iocstatus, uint32_t iocloginfo,
1035b504601Sjiang wu - Sun Microsystems - Beijing China va_list ap)
1045b504601Sjiang wu - Sun Microsystems - Beijing China {
1055b504601Sjiang wu - Sun Microsystems - Beijing China #ifndef __lock_lint
1065b504601Sjiang wu - Sun Microsystems - Beijing China _NOTE(ARGUNUSED(ap))
1075b504601Sjiang wu - Sun Microsystems - Beijing China #endif
1085b504601Sjiang wu - Sun Microsystems - Beijing China pMpi2RaidConfigurationPage0_t raidconfig_page0;
1095b504601Sjiang wu - Sun Microsystems - Beijing China pMpi2RaidConfig0ConfigElement_t element;
1105b504601Sjiang wu - Sun Microsystems - Beijing China uint32_t *confignum;
1115b504601Sjiang wu - Sun Microsystems - Beijing China int rval = DDI_SUCCESS, i;
1125b504601Sjiang wu - Sun Microsystems - Beijing China uint8_t numelements, vol, disk;
1135b504601Sjiang wu - Sun Microsystems - Beijing China uint16_t elementtype, voldevhandle;
1145b504601Sjiang wu - Sun Microsystems - Beijing China uint16_t etype_vol, etype_pd, etype_hs;
1155b504601Sjiang wu - Sun Microsystems - Beijing China uint16_t etype_oce;
1165b504601Sjiang wu - Sun Microsystems - Beijing China m_raidconfig_t *raidconfig;
1175b504601Sjiang wu - Sun Microsystems - Beijing China uint64_t raidwwn;
1185b504601Sjiang wu - Sun Microsystems - Beijing China uint32_t native;
1195b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_target_t *ptgt;
1205b504601Sjiang wu - Sun Microsystems - Beijing China uint32_t configindex;
1215b504601Sjiang wu - Sun Microsystems - Beijing China
1225b504601Sjiang wu - Sun Microsystems - Beijing China if (iocstatus == MPI2_IOCSTATUS_CONFIG_INVALID_PAGE) {
1235b504601Sjiang wu - Sun Microsystems - Beijing China return (DDI_FAILURE);
1245b504601Sjiang wu - Sun Microsystems - Beijing China }
1255b504601Sjiang wu - Sun Microsystems - Beijing China
1265b504601Sjiang wu - Sun Microsystems - Beijing China if (iocstatus != MPI2_IOCSTATUS_SUCCESS) {
1275b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN, "mptsas_get_raid_conf_page0 "
1285b504601Sjiang wu - Sun Microsystems - Beijing China "config: IOCStatus=0x%x, IOCLogInfo=0x%x",
1295b504601Sjiang wu - Sun Microsystems - Beijing China iocstatus, iocloginfo);
1305b504601Sjiang wu - Sun Microsystems - Beijing China rval = DDI_FAILURE;
1315b504601Sjiang wu - Sun Microsystems - Beijing China return (rval);
1325b504601Sjiang wu - Sun Microsystems - Beijing China }
1335b504601Sjiang wu - Sun Microsystems - Beijing China confignum = va_arg(ap, uint32_t *);
1345b504601Sjiang wu - Sun Microsystems - Beijing China configindex = va_arg(ap, uint32_t);
1355b504601Sjiang wu - Sun Microsystems - Beijing China raidconfig_page0 = (pMpi2RaidConfigurationPage0_t)page_memp;
1365b504601Sjiang wu - Sun Microsystems - Beijing China /*
1375b504601Sjiang wu - Sun Microsystems - Beijing China * Get all RAID configurations.
1385b504601Sjiang wu - Sun Microsystems - Beijing China */
1395b504601Sjiang wu - Sun Microsystems - Beijing China etype_vol = MPI2_RAIDCONFIG0_EFLAGS_VOLUME_ELEMENT;
1405b504601Sjiang wu - Sun Microsystems - Beijing China etype_pd = MPI2_RAIDCONFIG0_EFLAGS_VOL_PHYS_DISK_ELEMENT;
1415b504601Sjiang wu - Sun Microsystems - Beijing China etype_hs = MPI2_RAIDCONFIG0_EFLAGS_HOT_SPARE_ELEMENT;
1425b504601Sjiang wu - Sun Microsystems - Beijing China etype_oce = MPI2_RAIDCONFIG0_EFLAGS_OCE_ELEMENT;
1435b504601Sjiang wu - Sun Microsystems - Beijing China /*
1445b504601Sjiang wu - Sun Microsystems - Beijing China * Set up page address for next time through.
1455b504601Sjiang wu - Sun Microsystems - Beijing China */
1465b504601Sjiang wu - Sun Microsystems - Beijing China *confignum = ddi_get8(accessp,
1475b504601Sjiang wu - Sun Microsystems - Beijing China &raidconfig_page0->ConfigNum);
1485b504601Sjiang wu - Sun Microsystems - Beijing China
1495b504601Sjiang wu - Sun Microsystems - Beijing China /*
1505b504601Sjiang wu - Sun Microsystems - Beijing China * Point to the right config in the structure.
1515b504601Sjiang wu - Sun Microsystems - Beijing China * Increment the number of valid RAID configs.
1525b504601Sjiang wu - Sun Microsystems - Beijing China */
153da5ab83fSKeith M Wesolowski raidconfig = &mpt->m_raidconfig[configindex];
154da5ab83fSKeith M Wesolowski mpt->m_num_raid_configs++;
1555b504601Sjiang wu - Sun Microsystems - Beijing China
1565b504601Sjiang wu - Sun Microsystems - Beijing China /*
1575b504601Sjiang wu - Sun Microsystems - Beijing China * Set the native flag if this is not a foreign
1585b504601Sjiang wu - Sun Microsystems - Beijing China * configuration.
1595b504601Sjiang wu - Sun Microsystems - Beijing China */
1605b504601Sjiang wu - Sun Microsystems - Beijing China native = ddi_get32(accessp, &raidconfig_page0->Flags);
1615b504601Sjiang wu - Sun Microsystems - Beijing China if (native & MPI2_RAIDCONFIG0_FLAG_FOREIGN_CONFIG) {
1625b504601Sjiang wu - Sun Microsystems - Beijing China native = FALSE;
1635b504601Sjiang wu - Sun Microsystems - Beijing China } else {
1645b504601Sjiang wu - Sun Microsystems - Beijing China native = TRUE;
1655b504601Sjiang wu - Sun Microsystems - Beijing China }
1665b504601Sjiang wu - Sun Microsystems - Beijing China raidconfig->m_native = (uint8_t)native;
1675b504601Sjiang wu - Sun Microsystems - Beijing China
1685b504601Sjiang wu - Sun Microsystems - Beijing China /*
1695b504601Sjiang wu - Sun Microsystems - Beijing China * Get volume information for the volumes in the
1705b504601Sjiang wu - Sun Microsystems - Beijing China * config.
1715b504601Sjiang wu - Sun Microsystems - Beijing China */
1725b504601Sjiang wu - Sun Microsystems - Beijing China numelements = ddi_get8(accessp, &raidconfig_page0->NumElements);
1735b504601Sjiang wu - Sun Microsystems - Beijing China vol = 0;
1745b504601Sjiang wu - Sun Microsystems - Beijing China disk = 0;
1755b504601Sjiang wu - Sun Microsystems - Beijing China element = (pMpi2RaidConfig0ConfigElement_t)
1765b504601Sjiang wu - Sun Microsystems - Beijing China &raidconfig_page0->ConfigElement;
1775b504601Sjiang wu - Sun Microsystems - Beijing China
178c8f74a56SAda for (i = 0; ((i < numelements) && native); i++, element++) {
1795b504601Sjiang wu - Sun Microsystems - Beijing China /*
1805b504601Sjiang wu - Sun Microsystems - Beijing China * Get the element type. Could be Volume,
1815b504601Sjiang wu - Sun Microsystems - Beijing China * PhysDisk, Hot Spare, or Online Capacity
1825b504601Sjiang wu - Sun Microsystems - Beijing China * Expansion PhysDisk.
1835b504601Sjiang wu - Sun Microsystems - Beijing China */
1845b504601Sjiang wu - Sun Microsystems - Beijing China elementtype = ddi_get16(accessp, &element->ElementFlags);
1855b504601Sjiang wu - Sun Microsystems - Beijing China elementtype &= MPI2_RAIDCONFIG0_EFLAGS_MASK_ELEMENT_TYPE;
1865b504601Sjiang wu - Sun Microsystems - Beijing China
1875b504601Sjiang wu - Sun Microsystems - Beijing China /*
1885b504601Sjiang wu - Sun Microsystems - Beijing China * For volumes, get the RAID settings and the
1895b504601Sjiang wu - Sun Microsystems - Beijing China * WWID.
1905b504601Sjiang wu - Sun Microsystems - Beijing China */
1915b504601Sjiang wu - Sun Microsystems - Beijing China if (elementtype == etype_vol) {
1925b504601Sjiang wu - Sun Microsystems - Beijing China voldevhandle = ddi_get16(accessp,
1935b504601Sjiang wu - Sun Microsystems - Beijing China &element->VolDevHandle);
1945b504601Sjiang wu - Sun Microsystems - Beijing China raidconfig->m_raidvol[vol].m_israid = 1;
1955b504601Sjiang wu - Sun Microsystems - Beijing China raidconfig->m_raidvol[vol].
1965b504601Sjiang wu - Sun Microsystems - Beijing China m_raidhandle = voldevhandle;
1975b504601Sjiang wu - Sun Microsystems - Beijing China /*
1985b504601Sjiang wu - Sun Microsystems - Beijing China * Get the settings for the raid
1995b504601Sjiang wu - Sun Microsystems - Beijing China * volume. This includes the
2005b504601Sjiang wu - Sun Microsystems - Beijing China * DevHandles for the disks making up
2015b504601Sjiang wu - Sun Microsystems - Beijing China * the raid volume.
2025b504601Sjiang wu - Sun Microsystems - Beijing China */
2035b504601Sjiang wu - Sun Microsystems - Beijing China if (mptsas_get_raid_settings(mpt,
2045b504601Sjiang wu - Sun Microsystems - Beijing China &raidconfig->m_raidvol[vol]))
2055b504601Sjiang wu - Sun Microsystems - Beijing China continue;
2065b504601Sjiang wu - Sun Microsystems - Beijing China
2075b504601Sjiang wu - Sun Microsystems - Beijing China /*
2085b504601Sjiang wu - Sun Microsystems - Beijing China * Get the WWID of the RAID volume for
2095b504601Sjiang wu - Sun Microsystems - Beijing China * SAS HBA
2105b504601Sjiang wu - Sun Microsystems - Beijing China */
2115b504601Sjiang wu - Sun Microsystems - Beijing China if (mptsas_get_raid_wwid(mpt,
2125b504601Sjiang wu - Sun Microsystems - Beijing China &raidconfig->m_raidvol[vol]))
2135b504601Sjiang wu - Sun Microsystems - Beijing China continue;
2145b504601Sjiang wu - Sun Microsystems - Beijing China
2155b504601Sjiang wu - Sun Microsystems - Beijing China raidwwn = raidconfig->m_raidvol[vol].
2165b504601Sjiang wu - Sun Microsystems - Beijing China m_raidwwid;
2175b504601Sjiang wu - Sun Microsystems - Beijing China
2185b504601Sjiang wu - Sun Microsystems - Beijing China /*
2195b504601Sjiang wu - Sun Microsystems - Beijing China * RAID uses phymask of 0.
2205b504601Sjiang wu - Sun Microsystems - Beijing China */
22139fd84a8SHans Rosenfeld ptgt = mptsas_tgt_alloc(mpt->m_targets,
222da4badc0SKeith M Wesolowski voldevhandle, raidwwn, 0, 0, 0);
2235b504601Sjiang wu - Sun Microsystems - Beijing China
2245b504601Sjiang wu - Sun Microsystems - Beijing China raidconfig->m_raidvol[vol].m_raidtgt =
2255b504601Sjiang wu - Sun Microsystems - Beijing China ptgt;
2265b504601Sjiang wu - Sun Microsystems - Beijing China
2275b504601Sjiang wu - Sun Microsystems - Beijing China /*
2285b504601Sjiang wu - Sun Microsystems - Beijing China * Increment volume index within this
2295b504601Sjiang wu - Sun Microsystems - Beijing China * raid config.
2305b504601Sjiang wu - Sun Microsystems - Beijing China */
2315b504601Sjiang wu - Sun Microsystems - Beijing China vol++;
2325b504601Sjiang wu - Sun Microsystems - Beijing China } else if ((elementtype == etype_pd) ||
2335b504601Sjiang wu - Sun Microsystems - Beijing China (elementtype == etype_hs) ||
2345b504601Sjiang wu - Sun Microsystems - Beijing China (elementtype == etype_oce)) {
2355b504601Sjiang wu - Sun Microsystems - Beijing China /*
2365b504601Sjiang wu - Sun Microsystems - Beijing China * For all other element types, put
2375b504601Sjiang wu - Sun Microsystems - Beijing China * their DevHandles in the phys disk
2385b504601Sjiang wu - Sun Microsystems - Beijing China * list of the config. These are all
2395b504601Sjiang wu - Sun Microsystems - Beijing China * some variation of a Phys Disk and
2405b504601Sjiang wu - Sun Microsystems - Beijing China * this list is used to keep these
2415b504601Sjiang wu - Sun Microsystems - Beijing China * disks from going online.
2425b504601Sjiang wu - Sun Microsystems - Beijing China */
2435b504601Sjiang wu - Sun Microsystems - Beijing China raidconfig->m_physdisk_devhdl[disk] = ddi_get16(accessp,
2445b504601Sjiang wu - Sun Microsystems - Beijing China &element->PhysDiskDevHandle);
2455b504601Sjiang wu - Sun Microsystems - Beijing China
2465b504601Sjiang wu - Sun Microsystems - Beijing China /*
2475b504601Sjiang wu - Sun Microsystems - Beijing China * Increment disk index within this
2485b504601Sjiang wu - Sun Microsystems - Beijing China * raid config.
2495b504601Sjiang wu - Sun Microsystems - Beijing China */
2505b504601Sjiang wu - Sun Microsystems - Beijing China disk++;
2515b504601Sjiang wu - Sun Microsystems - Beijing China }
2525b504601Sjiang wu - Sun Microsystems - Beijing China }
2535b504601Sjiang wu - Sun Microsystems - Beijing China
2545b504601Sjiang wu - Sun Microsystems - Beijing China return (rval);
2555b504601Sjiang wu - Sun Microsystems - Beijing China }
2565b504601Sjiang wu - Sun Microsystems - Beijing China
2575b504601Sjiang wu - Sun Microsystems - Beijing China int
mptsas_get_raid_info(mptsas_t * mpt)2585b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_get_raid_info(mptsas_t *mpt)
2595b504601Sjiang wu - Sun Microsystems - Beijing China {
2605b504601Sjiang wu - Sun Microsystems - Beijing China int rval = DDI_SUCCESS;
2615b504601Sjiang wu - Sun Microsystems - Beijing China uint32_t confignum, pageaddress;
2625b504601Sjiang wu - Sun Microsystems - Beijing China uint8_t configindex;
2635b504601Sjiang wu - Sun Microsystems - Beijing China
2645b504601Sjiang wu - Sun Microsystems - Beijing China ASSERT(mutex_owned(&mpt->m_mutex));
2655b504601Sjiang wu - Sun Microsystems - Beijing China
2665b504601Sjiang wu - Sun Microsystems - Beijing China /*
2675b504601Sjiang wu - Sun Microsystems - Beijing China * Clear all RAID info before starting.
2685b504601Sjiang wu - Sun Microsystems - Beijing China */
269da5ab83fSKeith M Wesolowski bzero(mpt->m_raidconfig, sizeof (mpt->m_raidconfig));
270da5ab83fSKeith M Wesolowski mpt->m_num_raid_configs = 0;
2715b504601Sjiang wu - Sun Microsystems - Beijing China
2725b504601Sjiang wu - Sun Microsystems - Beijing China configindex = 0;
2735b504601Sjiang wu - Sun Microsystems - Beijing China confignum = 0xff;
2745b504601Sjiang wu - Sun Microsystems - Beijing China pageaddress = MPI2_RAID_PGAD_FORM_GET_NEXT_CONFIGNUM | confignum;
2755b504601Sjiang wu - Sun Microsystems - Beijing China while (rval == DDI_SUCCESS) {
2765b504601Sjiang wu - Sun Microsystems - Beijing China /*
2775b504601Sjiang wu - Sun Microsystems - Beijing China * Get the header and config page. reply contains the reply
2785b504601Sjiang wu - Sun Microsystems - Beijing China * frame, which holds status info for the request.
2795b504601Sjiang wu - Sun Microsystems - Beijing China */
2805b504601Sjiang wu - Sun Microsystems - Beijing China rval = mptsas_access_config_page(mpt,
2815b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_CONFIG_ACTION_PAGE_READ_CURRENT,
2825b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_CONFIG_EXTPAGETYPE_RAID_CONFIG, 0, pageaddress,
2835b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_raidconf_page_0_cb, &confignum, configindex);
2845b504601Sjiang wu - Sun Microsystems - Beijing China configindex++;
2855b504601Sjiang wu - Sun Microsystems - Beijing China pageaddress = MPI2_RAID_PGAD_FORM_GET_NEXT_CONFIGNUM |
2865b504601Sjiang wu - Sun Microsystems - Beijing China confignum;
2875b504601Sjiang wu - Sun Microsystems - Beijing China }
2885b504601Sjiang wu - Sun Microsystems - Beijing China
2895b504601Sjiang wu - Sun Microsystems - Beijing China return (rval);
2905b504601Sjiang wu - Sun Microsystems - Beijing China }
2915b504601Sjiang wu - Sun Microsystems - Beijing China
2925b504601Sjiang wu - Sun Microsystems - Beijing China static int
mptsas_raidvol_page_0_cb(mptsas_t * mpt,caddr_t page_memp,ddi_acc_handle_t accessp,uint16_t iocstatus,uint32_t iocloginfo,va_list ap)2935b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_raidvol_page_0_cb(mptsas_t *mpt, caddr_t page_memp,
2945b504601Sjiang wu - Sun Microsystems - Beijing China ddi_acc_handle_t accessp, uint16_t iocstatus, uint32_t iocloginfo,
2955b504601Sjiang wu - Sun Microsystems - Beijing China va_list ap)
2965b504601Sjiang wu - Sun Microsystems - Beijing China {
2975b504601Sjiang wu - Sun Microsystems - Beijing China #ifndef __lock_lint
2985b504601Sjiang wu - Sun Microsystems - Beijing China _NOTE(ARGUNUSED(ap))
2995b504601Sjiang wu - Sun Microsystems - Beijing China #endif
3005b504601Sjiang wu - Sun Microsystems - Beijing China pMpi2RaidVolPage0_t raidpage;
3015b504601Sjiang wu - Sun Microsystems - Beijing China int rval = DDI_SUCCESS, i;
3025b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_raidvol_t *raidvol;
3035b504601Sjiang wu - Sun Microsystems - Beijing China uint8_t numdisks, volstate, voltype, physdisknum;
3045b504601Sjiang wu - Sun Microsystems - Beijing China uint32_t volsetting;
3055b504601Sjiang wu - Sun Microsystems - Beijing China uint32_t statusflags, resync_flag;
3065b504601Sjiang wu - Sun Microsystems - Beijing China
3075b504601Sjiang wu - Sun Microsystems - Beijing China if (iocstatus == MPI2_IOCSTATUS_CONFIG_INVALID_PAGE)
3085b504601Sjiang wu - Sun Microsystems - Beijing China return (DDI_FAILURE);
3095b504601Sjiang wu - Sun Microsystems - Beijing China
3105b504601Sjiang wu - Sun Microsystems - Beijing China if (iocstatus != MPI2_IOCSTATUS_SUCCESS) {
3115b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN, "mptsas_raidvol_page0_cb "
3125b504601Sjiang wu - Sun Microsystems - Beijing China "config: IOCStatus=0x%x, IOCLogInfo=0x%x",
3135b504601Sjiang wu - Sun Microsystems - Beijing China iocstatus, iocloginfo);
3145b504601Sjiang wu - Sun Microsystems - Beijing China rval = DDI_FAILURE;
3155b504601Sjiang wu - Sun Microsystems - Beijing China return (rval);
3165b504601Sjiang wu - Sun Microsystems - Beijing China }
3175b504601Sjiang wu - Sun Microsystems - Beijing China
3185b504601Sjiang wu - Sun Microsystems - Beijing China raidvol = va_arg(ap, mptsas_raidvol_t *);
3195b504601Sjiang wu - Sun Microsystems - Beijing China
3205b504601Sjiang wu - Sun Microsystems - Beijing China raidpage = (pMpi2RaidVolPage0_t)page_memp;
3215b504601Sjiang wu - Sun Microsystems - Beijing China volstate = ddi_get8(accessp, &raidpage->VolumeState);
3225b504601Sjiang wu - Sun Microsystems - Beijing China volsetting = ddi_get32(accessp,
3235b504601Sjiang wu - Sun Microsystems - Beijing China (uint32_t *)(void *)&raidpage->VolumeSettings);
3245b504601Sjiang wu - Sun Microsystems - Beijing China statusflags = ddi_get32(accessp, &raidpage->VolumeStatusFlags);
3255b504601Sjiang wu - Sun Microsystems - Beijing China voltype = ddi_get8(accessp, &raidpage->VolumeType);
3265b504601Sjiang wu - Sun Microsystems - Beijing China
3275b504601Sjiang wu - Sun Microsystems - Beijing China raidvol->m_state = volstate;
3285b504601Sjiang wu - Sun Microsystems - Beijing China raidvol->m_statusflags = statusflags;
3295b504601Sjiang wu - Sun Microsystems - Beijing China /*
3305b504601Sjiang wu - Sun Microsystems - Beijing China * Volume size is not used right now. Set to 0.
3315b504601Sjiang wu - Sun Microsystems - Beijing China */
3325b504601Sjiang wu - Sun Microsystems - Beijing China raidvol->m_raidsize = 0;
3335b504601Sjiang wu - Sun Microsystems - Beijing China raidvol->m_settings = volsetting;
3345b504601Sjiang wu - Sun Microsystems - Beijing China raidvol->m_raidlevel = voltype;
3355b504601Sjiang wu - Sun Microsystems - Beijing China
3365b504601Sjiang wu - Sun Microsystems - Beijing China if (statusflags & MPI2_RAIDVOL0_STATUS_FLAG_QUIESCED) {
3375b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_log(mpt, CE_NOTE, "?Volume %d is quiesced\n",
3385b504601Sjiang wu - Sun Microsystems - Beijing China raidvol->m_raidhandle);
3395b504601Sjiang wu - Sun Microsystems - Beijing China }
3405b504601Sjiang wu - Sun Microsystems - Beijing China
3415b504601Sjiang wu - Sun Microsystems - Beijing China if (statusflags &
3425b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_RAIDVOL0_STATUS_FLAG_RESYNC_IN_PROGRESS) {
3435b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_log(mpt, CE_NOTE, "?Volume %d is resyncing\n",
3445b504601Sjiang wu - Sun Microsystems - Beijing China raidvol->m_raidhandle);
3455b504601Sjiang wu - Sun Microsystems - Beijing China }
3465b504601Sjiang wu - Sun Microsystems - Beijing China
3475b504601Sjiang wu - Sun Microsystems - Beijing China resync_flag = MPI2_RAIDVOL0_STATUS_FLAG_RESYNC_IN_PROGRESS;
3485b504601Sjiang wu - Sun Microsystems - Beijing China switch (volstate) {
3495b504601Sjiang wu - Sun Microsystems - Beijing China case MPI2_RAID_VOL_STATE_OPTIMAL:
3505b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_log(mpt, CE_NOTE, "?Volume %d is "
3515b504601Sjiang wu - Sun Microsystems - Beijing China "optimal\n", raidvol->m_raidhandle);
3525b504601Sjiang wu - Sun Microsystems - Beijing China break;
3535b504601Sjiang wu - Sun Microsystems - Beijing China case MPI2_RAID_VOL_STATE_DEGRADED:
3545b504601Sjiang wu - Sun Microsystems - Beijing China if ((statusflags & resync_flag) == 0) {
3555b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN, "Volume %d "
3565b504601Sjiang wu - Sun Microsystems - Beijing China "is degraded\n",
3575b504601Sjiang wu - Sun Microsystems - Beijing China raidvol->m_raidhandle);
3585b504601Sjiang wu - Sun Microsystems - Beijing China }
3595b504601Sjiang wu - Sun Microsystems - Beijing China break;
3605b504601Sjiang wu - Sun Microsystems - Beijing China case MPI2_RAID_VOL_STATE_FAILED:
3615b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN, "Volume %d is "
3625b504601Sjiang wu - Sun Microsystems - Beijing China "failed\n", raidvol->m_raidhandle);
3635b504601Sjiang wu - Sun Microsystems - Beijing China break;
3645b504601Sjiang wu - Sun Microsystems - Beijing China case MPI2_RAID_VOL_STATE_MISSING:
3655b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN, "Volume %d is "
3665b504601Sjiang wu - Sun Microsystems - Beijing China "missing\n", raidvol->m_raidhandle);
3675b504601Sjiang wu - Sun Microsystems - Beijing China break;
3685b504601Sjiang wu - Sun Microsystems - Beijing China default:
3695b504601Sjiang wu - Sun Microsystems - Beijing China break;
3705b504601Sjiang wu - Sun Microsystems - Beijing China }
3715b504601Sjiang wu - Sun Microsystems - Beijing China numdisks = raidpage->NumPhysDisks;
3725b504601Sjiang wu - Sun Microsystems - Beijing China raidvol->m_ndisks = numdisks;
3735b504601Sjiang wu - Sun Microsystems - Beijing China for (i = 0; i < numdisks; i++) {
3745b504601Sjiang wu - Sun Microsystems - Beijing China physdisknum = raidpage->PhysDisk[i].PhysDiskNum;
3755b504601Sjiang wu - Sun Microsystems - Beijing China raidvol->m_disknum[i] = physdisknum;
3765b504601Sjiang wu - Sun Microsystems - Beijing China if (mptsas_get_physdisk_settings(mpt, raidvol,
3775b504601Sjiang wu - Sun Microsystems - Beijing China physdisknum))
3785b504601Sjiang wu - Sun Microsystems - Beijing China break;
3795b504601Sjiang wu - Sun Microsystems - Beijing China }
3805b504601Sjiang wu - Sun Microsystems - Beijing China return (rval);
3815b504601Sjiang wu - Sun Microsystems - Beijing China }
3825b504601Sjiang wu - Sun Microsystems - Beijing China
3835b504601Sjiang wu - Sun Microsystems - Beijing China int
mptsas_get_raid_settings(mptsas_t * mpt,mptsas_raidvol_t * raidvol)3845b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_get_raid_settings(mptsas_t *mpt, mptsas_raidvol_t *raidvol)
3855b504601Sjiang wu - Sun Microsystems - Beijing China {
3865b504601Sjiang wu - Sun Microsystems - Beijing China int rval = DDI_SUCCESS;
3875b504601Sjiang wu - Sun Microsystems - Beijing China uint32_t page_address;
3885b504601Sjiang wu - Sun Microsystems - Beijing China
3895b504601Sjiang wu - Sun Microsystems - Beijing China ASSERT(mutex_owned(&mpt->m_mutex));
3905b504601Sjiang wu - Sun Microsystems - Beijing China
3915b504601Sjiang wu - Sun Microsystems - Beijing China /*
3925b504601Sjiang wu - Sun Microsystems - Beijing China * Get the header and config page. reply contains the reply frame,
3935b504601Sjiang wu - Sun Microsystems - Beijing China * which holds status info for the request.
3945b504601Sjiang wu - Sun Microsystems - Beijing China */
3955b504601Sjiang wu - Sun Microsystems - Beijing China page_address = (MPI2_RAID_VOLUME_PGAD_FORM_MASK &
3965b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_RAID_VOLUME_PGAD_FORM_HANDLE) | raidvol->m_raidhandle;
3975b504601Sjiang wu - Sun Microsystems - Beijing China rval = mptsas_access_config_page(mpt,
3985b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_CONFIG_ACTION_PAGE_READ_CURRENT,
3995b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_CONFIG_PAGETYPE_RAID_VOLUME, 0, page_address,
4005b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_raidvol_page_0_cb, raidvol);
4015b504601Sjiang wu - Sun Microsystems - Beijing China
4025b504601Sjiang wu - Sun Microsystems - Beijing China return (rval);
4035b504601Sjiang wu - Sun Microsystems - Beijing China }
4045b504601Sjiang wu - Sun Microsystems - Beijing China
4055b504601Sjiang wu - Sun Microsystems - Beijing China static int
mptsas_raidvol_page_1_cb(mptsas_t * mpt,caddr_t page_memp,ddi_acc_handle_t accessp,uint16_t iocstatus,uint32_t iocloginfo,va_list ap)4065b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_raidvol_page_1_cb(mptsas_t *mpt, caddr_t page_memp,
4075b504601Sjiang wu - Sun Microsystems - Beijing China ddi_acc_handle_t accessp, uint16_t iocstatus, uint32_t iocloginfo,
4085b504601Sjiang wu - Sun Microsystems - Beijing China va_list ap)
4095b504601Sjiang wu - Sun Microsystems - Beijing China {
4105b504601Sjiang wu - Sun Microsystems - Beijing China #ifndef __lock_lint
4115b504601Sjiang wu - Sun Microsystems - Beijing China _NOTE(ARGUNUSED(ap))
4125b504601Sjiang wu - Sun Microsystems - Beijing China #endif
4135b504601Sjiang wu - Sun Microsystems - Beijing China pMpi2RaidVolPage1_t raidpage;
4145b504601Sjiang wu - Sun Microsystems - Beijing China int rval = DDI_SUCCESS, i;
4155b504601Sjiang wu - Sun Microsystems - Beijing China uint8_t *sas_addr = NULL;
4165b504601Sjiang wu - Sun Microsystems - Beijing China uint8_t tmp_sas_wwn[SAS_WWN_BYTE_SIZE];
4175b504601Sjiang wu - Sun Microsystems - Beijing China uint64_t *sas_wwn;
4185b504601Sjiang wu - Sun Microsystems - Beijing China
4195b504601Sjiang wu - Sun Microsystems - Beijing China if (iocstatus != MPI2_IOCSTATUS_SUCCESS) {
4205b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN, "mptsas_raidvol_page_1_cb "
4215b504601Sjiang wu - Sun Microsystems - Beijing China "config: IOCStatus=0x%x, IOCLogInfo=0x%x",
4225b504601Sjiang wu - Sun Microsystems - Beijing China iocstatus, iocloginfo);
4235b504601Sjiang wu - Sun Microsystems - Beijing China rval = DDI_FAILURE;
4245b504601Sjiang wu - Sun Microsystems - Beijing China return (rval);
4255b504601Sjiang wu - Sun Microsystems - Beijing China }
4265b504601Sjiang wu - Sun Microsystems - Beijing China sas_wwn = va_arg(ap, uint64_t *);
4275b504601Sjiang wu - Sun Microsystems - Beijing China
4285b504601Sjiang wu - Sun Microsystems - Beijing China raidpage = (pMpi2RaidVolPage1_t)page_memp;
4295b504601Sjiang wu - Sun Microsystems - Beijing China sas_addr = (uint8_t *)(&raidpage->WWID);
4305b504601Sjiang wu - Sun Microsystems - Beijing China for (i = 0; i < SAS_WWN_BYTE_SIZE; i++) {
4315b504601Sjiang wu - Sun Microsystems - Beijing China tmp_sas_wwn[i] = ddi_get8(accessp, sas_addr + i);
4325b504601Sjiang wu - Sun Microsystems - Beijing China }
4335b504601Sjiang wu - Sun Microsystems - Beijing China bcopy(tmp_sas_wwn, sas_wwn, SAS_WWN_BYTE_SIZE);
4345b504601Sjiang wu - Sun Microsystems - Beijing China *sas_wwn = LE_64(*sas_wwn);
4355b504601Sjiang wu - Sun Microsystems - Beijing China return (rval);
4365b504601Sjiang wu - Sun Microsystems - Beijing China }
4375b504601Sjiang wu - Sun Microsystems - Beijing China
4385b504601Sjiang wu - Sun Microsystems - Beijing China static int
mptsas_get_raid_wwid(mptsas_t * mpt,mptsas_raidvol_t * raidvol)4395b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_get_raid_wwid(mptsas_t *mpt, mptsas_raidvol_t *raidvol)
4405b504601Sjiang wu - Sun Microsystems - Beijing China {
4415b504601Sjiang wu - Sun Microsystems - Beijing China int rval = DDI_SUCCESS;
4425b504601Sjiang wu - Sun Microsystems - Beijing China uint32_t page_address;
4435b504601Sjiang wu - Sun Microsystems - Beijing China uint64_t sas_wwn;
4445b504601Sjiang wu - Sun Microsystems - Beijing China
4455b504601Sjiang wu - Sun Microsystems - Beijing China ASSERT(mutex_owned(&mpt->m_mutex));
4465b504601Sjiang wu - Sun Microsystems - Beijing China
4475b504601Sjiang wu - Sun Microsystems - Beijing China /*
4485b504601Sjiang wu - Sun Microsystems - Beijing China * Get the header and config page. reply contains the reply frame,
4495b504601Sjiang wu - Sun Microsystems - Beijing China * which holds status info for the request.
4505b504601Sjiang wu - Sun Microsystems - Beijing China */
4515b504601Sjiang wu - Sun Microsystems - Beijing China page_address = (MPI2_RAID_VOLUME_PGAD_FORM_MASK &
4525b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_RAID_VOLUME_PGAD_FORM_HANDLE) | raidvol->m_raidhandle;
4535b504601Sjiang wu - Sun Microsystems - Beijing China rval = mptsas_access_config_page(mpt,
4545b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_CONFIG_ACTION_PAGE_READ_CURRENT,
4555b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_CONFIG_PAGETYPE_RAID_VOLUME, 1, page_address,
4565b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_raidvol_page_1_cb, &sas_wwn);
4575b504601Sjiang wu - Sun Microsystems - Beijing China
4585b504601Sjiang wu - Sun Microsystems - Beijing China /*
4595b504601Sjiang wu - Sun Microsystems - Beijing China * Get the required information from the page.
4605b504601Sjiang wu - Sun Microsystems - Beijing China */
4615b504601Sjiang wu - Sun Microsystems - Beijing China if (rval == DDI_SUCCESS) {
4625b504601Sjiang wu - Sun Microsystems - Beijing China
4635b504601Sjiang wu - Sun Microsystems - Beijing China /*
4645b504601Sjiang wu - Sun Microsystems - Beijing China * replace top nibble of WWID of RAID to '3' for OBP
4655b504601Sjiang wu - Sun Microsystems - Beijing China */
4665b504601Sjiang wu - Sun Microsystems - Beijing China sas_wwn = MPTSAS_RAID_WWID(sas_wwn);
4675b504601Sjiang wu - Sun Microsystems - Beijing China raidvol->m_raidwwid = sas_wwn;
4685b504601Sjiang wu - Sun Microsystems - Beijing China }
4695b504601Sjiang wu - Sun Microsystems - Beijing China
4705b504601Sjiang wu - Sun Microsystems - Beijing China return (rval);
4715b504601Sjiang wu - Sun Microsystems - Beijing China }
4725b504601Sjiang wu - Sun Microsystems - Beijing China
4735b504601Sjiang wu - Sun Microsystems - Beijing China static int
mptsas_raidphydsk_page_0_cb(mptsas_t * mpt,caddr_t page_memp,ddi_acc_handle_t accessp,uint16_t iocstatus,uint32_t iocloginfo,va_list ap)4745b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_raidphydsk_page_0_cb(mptsas_t *mpt, caddr_t page_memp,
4755b504601Sjiang wu - Sun Microsystems - Beijing China ddi_acc_handle_t accessp, uint16_t iocstatus, uint32_t iocloginfo,
4765b504601Sjiang wu - Sun Microsystems - Beijing China va_list ap)
4775b504601Sjiang wu - Sun Microsystems - Beijing China {
4785b504601Sjiang wu - Sun Microsystems - Beijing China #ifndef __lock_lint
4795b504601Sjiang wu - Sun Microsystems - Beijing China _NOTE(ARGUNUSED(ap))
4805b504601Sjiang wu - Sun Microsystems - Beijing China #endif
4815b504601Sjiang wu - Sun Microsystems - Beijing China pMpi2RaidPhysDiskPage0_t diskpage;
4825b504601Sjiang wu - Sun Microsystems - Beijing China int rval = DDI_SUCCESS;
4835b504601Sjiang wu - Sun Microsystems - Beijing China uint16_t *devhdl;
4845b504601Sjiang wu - Sun Microsystems - Beijing China uint8_t *state;
4855b504601Sjiang wu - Sun Microsystems - Beijing China
4865b504601Sjiang wu - Sun Microsystems - Beijing China if (iocstatus == MPI2_IOCSTATUS_CONFIG_INVALID_PAGE)
4875b504601Sjiang wu - Sun Microsystems - Beijing China return (DDI_FAILURE);
4885b504601Sjiang wu - Sun Microsystems - Beijing China
4895b504601Sjiang wu - Sun Microsystems - Beijing China if (iocstatus != MPI2_IOCSTATUS_SUCCESS) {
4905b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN, "mptsas_raidphydsk_page0_cb "
4915b504601Sjiang wu - Sun Microsystems - Beijing China "config: IOCStatus=0x%x, IOCLogInfo=0x%x",
4925b504601Sjiang wu - Sun Microsystems - Beijing China iocstatus, iocloginfo);
4935b504601Sjiang wu - Sun Microsystems - Beijing China rval = DDI_FAILURE;
4945b504601Sjiang wu - Sun Microsystems - Beijing China return (rval);
4955b504601Sjiang wu - Sun Microsystems - Beijing China }
4965b504601Sjiang wu - Sun Microsystems - Beijing China devhdl = va_arg(ap, uint16_t *);
4975b504601Sjiang wu - Sun Microsystems - Beijing China state = va_arg(ap, uint8_t *);
4985b504601Sjiang wu - Sun Microsystems - Beijing China diskpage = (pMpi2RaidPhysDiskPage0_t)page_memp;
4995b504601Sjiang wu - Sun Microsystems - Beijing China *devhdl = ddi_get16(accessp, &diskpage->DevHandle);
5005b504601Sjiang wu - Sun Microsystems - Beijing China *state = ddi_get8(accessp, &diskpage->PhysDiskState);
5015b504601Sjiang wu - Sun Microsystems - Beijing China return (rval);
5025b504601Sjiang wu - Sun Microsystems - Beijing China }
5035b504601Sjiang wu - Sun Microsystems - Beijing China
5045b504601Sjiang wu - Sun Microsystems - Beijing China int
mptsas_get_physdisk_settings(mptsas_t * mpt,mptsas_raidvol_t * raidvol,uint8_t physdisknum)5055b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_get_physdisk_settings(mptsas_t *mpt, mptsas_raidvol_t *raidvol,
5065b504601Sjiang wu - Sun Microsystems - Beijing China uint8_t physdisknum)
5075b504601Sjiang wu - Sun Microsystems - Beijing China {
5085b504601Sjiang wu - Sun Microsystems - Beijing China int rval = DDI_SUCCESS, i;
5095b504601Sjiang wu - Sun Microsystems - Beijing China uint8_t state;
5105b504601Sjiang wu - Sun Microsystems - Beijing China uint16_t devhdl;
5115b504601Sjiang wu - Sun Microsystems - Beijing China uint32_t page_address;
5125b504601Sjiang wu - Sun Microsystems - Beijing China
5135b504601Sjiang wu - Sun Microsystems - Beijing China ASSERT(mutex_owned(&mpt->m_mutex));
5145b504601Sjiang wu - Sun Microsystems - Beijing China
5155b504601Sjiang wu - Sun Microsystems - Beijing China /*
5165b504601Sjiang wu - Sun Microsystems - Beijing China * Get the header and config page. reply contains the reply frame,
5175b504601Sjiang wu - Sun Microsystems - Beijing China * which holds status info for the request.
5185b504601Sjiang wu - Sun Microsystems - Beijing China */
5195b504601Sjiang wu - Sun Microsystems - Beijing China page_address = (MPI2_PHYSDISK_PGAD_FORM_MASK &
5205b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_PHYSDISK_PGAD_FORM_PHYSDISKNUM) | physdisknum;
5215b504601Sjiang wu - Sun Microsystems - Beijing China rval = mptsas_access_config_page(mpt,
5225b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_CONFIG_ACTION_PAGE_READ_CURRENT,
5235b504601Sjiang wu - Sun Microsystems - Beijing China MPI2_CONFIG_PAGETYPE_RAID_PHYSDISK, 0, page_address,
5245b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_raidphydsk_page_0_cb, &devhdl, &state);
5255b504601Sjiang wu - Sun Microsystems - Beijing China
5265b504601Sjiang wu - Sun Microsystems - Beijing China /*
5275b504601Sjiang wu - Sun Microsystems - Beijing China * Get the required information from the page.
5285b504601Sjiang wu - Sun Microsystems - Beijing China */
5295b504601Sjiang wu - Sun Microsystems - Beijing China if (rval == DDI_SUCCESS) {
5305b504601Sjiang wu - Sun Microsystems - Beijing China for (i = 0; i < MPTSAS_MAX_DISKS_IN_VOL; i++) {
5315b504601Sjiang wu - Sun Microsystems - Beijing China /* find the correct position in the arrays */
5325b504601Sjiang wu - Sun Microsystems - Beijing China if (raidvol->m_disknum[i] == physdisknum)
5335b504601Sjiang wu - Sun Microsystems - Beijing China break;
5345b504601Sjiang wu - Sun Microsystems - Beijing China }
5355b504601Sjiang wu - Sun Microsystems - Beijing China raidvol->m_devhdl[i] = devhdl;
5365b504601Sjiang wu - Sun Microsystems - Beijing China
5375b504601Sjiang wu - Sun Microsystems - Beijing China switch (state) {
5385b504601Sjiang wu - Sun Microsystems - Beijing China case MPI2_RAID_PD_STATE_OFFLINE:
5395b504601Sjiang wu - Sun Microsystems - Beijing China raidvol->m_diskstatus[i] =
5405b504601Sjiang wu - Sun Microsystems - Beijing China RAID_DISKSTATUS_FAILED;
5415b504601Sjiang wu - Sun Microsystems - Beijing China break;
5425b504601Sjiang wu - Sun Microsystems - Beijing China
5435b504601Sjiang wu - Sun Microsystems - Beijing China case MPI2_RAID_PD_STATE_HOT_SPARE:
5445b504601Sjiang wu - Sun Microsystems - Beijing China case MPI2_RAID_PD_STATE_NOT_CONFIGURED:
5455b504601Sjiang wu - Sun Microsystems - Beijing China case MPI2_RAID_PD_STATE_NOT_COMPATIBLE:
5465b504601Sjiang wu - Sun Microsystems - Beijing China break;
5475b504601Sjiang wu - Sun Microsystems - Beijing China
5485b504601Sjiang wu - Sun Microsystems - Beijing China case MPI2_RAID_PD_STATE_DEGRADED:
5495b504601Sjiang wu - Sun Microsystems - Beijing China case MPI2_RAID_PD_STATE_OPTIMAL:
5505b504601Sjiang wu - Sun Microsystems - Beijing China case MPI2_RAID_PD_STATE_REBUILDING:
5515b504601Sjiang wu - Sun Microsystems - Beijing China case MPI2_RAID_PD_STATE_ONLINE:
5525b504601Sjiang wu - Sun Microsystems - Beijing China default:
5535b504601Sjiang wu - Sun Microsystems - Beijing China raidvol->m_diskstatus[i] =
5545b504601Sjiang wu - Sun Microsystems - Beijing China RAID_DISKSTATUS_GOOD;
5555b504601Sjiang wu - Sun Microsystems - Beijing China break;
5565b504601Sjiang wu - Sun Microsystems - Beijing China }
5575b504601Sjiang wu - Sun Microsystems - Beijing China }
5585b504601Sjiang wu - Sun Microsystems - Beijing China
5595b504601Sjiang wu - Sun Microsystems - Beijing China return (rval);
5605b504601Sjiang wu - Sun Microsystems - Beijing China }
5615b504601Sjiang wu - Sun Microsystems - Beijing China
56276a4caf6SAda /*
563c8f74a56SAda * RAID Action for System Shutdown. This request uses the dedicated TM slot to
564c8f74a56SAda * avoid a call to mptsas_save_cmd. Since Solaris requires that the mutex is
565c8f74a56SAda * not held during the mptsas_quiesce function, this RAID action must not use
566c8f74a56SAda * the normal code path of requests and replies.
56776a4caf6SAda */
56876a4caf6SAda void
mptsas_raid_action_system_shutdown(mptsas_t * mpt)56976a4caf6SAda mptsas_raid_action_system_shutdown(mptsas_t *mpt)
57076a4caf6SAda {
57176a4caf6SAda pMpi2RaidActionRequest_t action;
572c8f74a56SAda uint8_t ir_active = FALSE, reply_type;
573c8f74a56SAda uint8_t function, found_reply = FALSE;
574c8f74a56SAda uint16_t SMID, action_type;
57576a4caf6SAda mptsas_slots_t *slots = mpt->m_active;
576c8f74a56SAda int config, vol;
57776a4caf6SAda mptsas_cmd_t *cmd;
578940efceeSAndy Giles uint32_t reply_addr;
579940efceeSAndy Giles uint64_t request_desc;
580c8f74a56SAda int cnt;
581c8f74a56SAda pMpi2ReplyDescriptorsUnion_t reply_desc_union;
582c8f74a56SAda pMPI2DefaultReply_t reply;
583c8f74a56SAda pMpi2AddressReplyDescriptor_t address_reply;
58476a4caf6SAda
58576a4caf6SAda /*
58676a4caf6SAda * Before doing the system shutdown RAID Action, make sure that the IOC
58776a4caf6SAda * supports IR and make sure there is a valid volume for the request.
58876a4caf6SAda */
58976a4caf6SAda if (mpt->m_ir_capable) {
590da5ab83fSKeith M Wesolowski for (config = 0; (config < mpt->m_num_raid_configs) &&
591c8f74a56SAda (!ir_active); config++) {
59276a4caf6SAda for (vol = 0; vol < MPTSAS_MAX_RAIDVOLS; vol++) {
593da5ab83fSKeith M Wesolowski if (mpt->m_raidconfig[config].m_raidvol[vol].
59476a4caf6SAda m_israid) {
59576a4caf6SAda ir_active = TRUE;
59676a4caf6SAda break;
59776a4caf6SAda }
59876a4caf6SAda }
59976a4caf6SAda }
60076a4caf6SAda }
60176a4caf6SAda if (!ir_active) {
60276a4caf6SAda return;
60376a4caf6SAda }
60476a4caf6SAda
60576a4caf6SAda /*
606c8f74a56SAda * If TM slot is already being used (highly unlikely), show message and
607c8f74a56SAda * don't issue the RAID action.
60876a4caf6SAda */
609c8f74a56SAda if (slots->m_slot[MPTSAS_TM_SLOT(mpt)] != NULL) {
610c8f74a56SAda mptsas_log(mpt, CE_WARN, "RAID Action slot in use. Cancelling"
611c8f74a56SAda " System Shutdown RAID Action.\n");
61276a4caf6SAda return;
61376a4caf6SAda }
61476a4caf6SAda
615c8f74a56SAda /*
616c8f74a56SAda * Create the cmd and put it in the dedicated TM slot.
617c8f74a56SAda */
618c8f74a56SAda cmd = &(mpt->m_event_task_mgmt.m_event_cmd);
61976a4caf6SAda bzero((caddr_t)cmd, sizeof (*cmd));
620c8f74a56SAda cmd->cmd_pkt = NULL;
621c8f74a56SAda cmd->cmd_slot = MPTSAS_TM_SLOT(mpt);
622c8f74a56SAda slots->m_slot[MPTSAS_TM_SLOT(mpt)] = cmd;
62376a4caf6SAda
624c8f74a56SAda /*
625c8f74a56SAda * Form message for raid action.
626c8f74a56SAda */
627c8f74a56SAda action = (pMpi2RaidActionRequest_t)(mpt->m_req_frame +
628c8f74a56SAda (mpt->m_req_frame_size * cmd->cmd_slot));
629c8f74a56SAda bzero(action, mpt->m_req_frame_size);
630c8f74a56SAda action->Function = MPI2_FUNCTION_RAID_ACTION;
631c8f74a56SAda action->Action = MPI2_RAID_ACTION_SYSTEM_SHUTDOWN_INITIATED;
632c8f74a56SAda
633c8f74a56SAda /*
634c8f74a56SAda * Send RAID Action.
635c8f74a56SAda */
636c8f74a56SAda (void) ddi_dma_sync(mpt->m_dma_req_frame_hdl, 0, 0,
637c8f74a56SAda DDI_DMA_SYNC_FORDEV);
638940efceeSAndy Giles request_desc = (cmd->cmd_slot << 16) +
639c8f74a56SAda MPI2_REQ_DESCRIPT_FLAGS_DEFAULT_TYPE;
640940efceeSAndy Giles MPTSAS_START_CMD(mpt, request_desc);
64176a4caf6SAda
64276a4caf6SAda /*
643c8f74a56SAda * Even though reply does not matter because the system is shutting
644c8f74a56SAda * down, wait no more than 5 seconds here to get the reply just because
645c8f74a56SAda * we don't want to leave it hanging if it's coming. Poll because
646c8f74a56SAda * interrupts are disabled when this function is called.
64776a4caf6SAda */
648c8f74a56SAda for (cnt = 0; cnt < 5000; cnt++) {
649c8f74a56SAda /*
650c8f74a56SAda * Check for a reply.
651c8f74a56SAda */
652c8f74a56SAda (void) ddi_dma_sync(mpt->m_dma_post_queue_hdl, 0, 0,
653c8f74a56SAda DDI_DMA_SYNC_FORCPU);
654c8f74a56SAda
655c8f74a56SAda reply_desc_union = (pMpi2ReplyDescriptorsUnion_t)
656c8f74a56SAda MPTSAS_GET_NEXT_REPLY(mpt, mpt->m_post_index);
657c8f74a56SAda
658c8f74a56SAda if (ddi_get32(mpt->m_acc_post_queue_hdl,
659c8f74a56SAda &reply_desc_union->Words.Low) == 0xFFFFFFFF ||
660c8f74a56SAda ddi_get32(mpt->m_acc_post_queue_hdl,
661c8f74a56SAda &reply_desc_union->Words.High) == 0xFFFFFFFF) {
662c8f74a56SAda drv_usecwait(1000);
663c8f74a56SAda continue;
664c8f74a56SAda }
665c8f74a56SAda
666c8f74a56SAda /*
667c8f74a56SAda * There is a reply. If it's not an address reply, ignore it.
668c8f74a56SAda */
669c8f74a56SAda reply_type = ddi_get8(mpt->m_acc_post_queue_hdl,
670c8f74a56SAda &reply_desc_union->Default.ReplyFlags);
671c8f74a56SAda reply_type &= MPI2_RPY_DESCRIPT_FLAGS_TYPE_MASK;
672c8f74a56SAda if (reply_type != MPI2_RPY_DESCRIPT_FLAGS_ADDRESS_REPLY) {
673c8f74a56SAda goto clear_and_continue;
674c8f74a56SAda }
675c8f74a56SAda
676c8f74a56SAda /*
677c8f74a56SAda * SMID must be the TM slot since that's what we're using for
678c8f74a56SAda * this RAID action. If not, ignore this reply.
679c8f74a56SAda */
680c8f74a56SAda address_reply =
681c8f74a56SAda (pMpi2AddressReplyDescriptor_t)reply_desc_union;
682c8f74a56SAda SMID = ddi_get16(mpt->m_acc_post_queue_hdl,
683c8f74a56SAda &address_reply->SMID);
684c8f74a56SAda if (SMID != MPTSAS_TM_SLOT(mpt)) {
685c8f74a56SAda goto clear_and_continue;
686c8f74a56SAda }
687c8f74a56SAda
688c8f74a56SAda /*
689c8f74a56SAda * If reply frame is not in the proper range ignore it.
690c8f74a56SAda */
691c8f74a56SAda reply_addr = ddi_get32(mpt->m_acc_post_queue_hdl,
692c8f74a56SAda &address_reply->ReplyFrameAddress);
693c8f74a56SAda if ((reply_addr < mpt->m_reply_frame_dma_addr) ||
694c8f74a56SAda (reply_addr >= (mpt->m_reply_frame_dma_addr +
695c8f74a56SAda (mpt->m_reply_frame_size * mpt->m_free_queue_depth))) ||
696c8f74a56SAda ((reply_addr - mpt->m_reply_frame_dma_addr) %
697c8f74a56SAda mpt->m_reply_frame_size != 0)) {
698c8f74a56SAda goto clear_and_continue;
699c8f74a56SAda }
700c8f74a56SAda
701c8f74a56SAda /*
702c8f74a56SAda * If not a RAID action reply ignore it.
703c8f74a56SAda */
704c8f74a56SAda (void) ddi_dma_sync(mpt->m_dma_reply_frame_hdl, 0, 0,
705c8f74a56SAda DDI_DMA_SYNC_FORCPU);
706c8f74a56SAda reply = (pMPI2DefaultReply_t)(mpt->m_reply_frame +
707c8f74a56SAda (reply_addr - mpt->m_reply_frame_dma_addr));
708c8f74a56SAda function = ddi_get8(mpt->m_acc_reply_frame_hdl,
709c8f74a56SAda &reply->Function);
710c8f74a56SAda if (function != MPI2_FUNCTION_RAID_ACTION) {
711c8f74a56SAda goto clear_and_continue;
712c8f74a56SAda }
713c8f74a56SAda
71476a4caf6SAda /*
715c8f74a56SAda * Finally, make sure this is the System Shutdown RAID action.
716c8f74a56SAda * If not, ignore reply.
71776a4caf6SAda */
718c8f74a56SAda action_type = ddi_get16(mpt->m_acc_reply_frame_hdl,
719c8f74a56SAda &reply->FunctionDependent1);
720c8f74a56SAda if (action_type !=
721c8f74a56SAda MPI2_RAID_ACTION_SYSTEM_SHUTDOWN_INITIATED) {
722c8f74a56SAda goto clear_and_continue;
723c8f74a56SAda }
724c8f74a56SAda found_reply = TRUE;
72576a4caf6SAda
726c8f74a56SAda clear_and_continue:
72776a4caf6SAda /*
728c8f74a56SAda * Clear the reply descriptor for re-use and increment index.
72976a4caf6SAda */
730c8f74a56SAda ddi_put64(mpt->m_acc_post_queue_hdl,
731c8f74a56SAda &((uint64_t *)(void *)mpt->m_post_queue)[mpt->m_post_index],
732c8f74a56SAda 0xFFFFFFFFFFFFFFFF);
733c8f74a56SAda (void) ddi_dma_sync(mpt->m_dma_post_queue_hdl, 0, 0,
73476a4caf6SAda DDI_DMA_SYNC_FORDEV);
73576a4caf6SAda
73676a4caf6SAda /*
737c8f74a56SAda * Update the global reply index and keep looking for the
738c8f74a56SAda * reply if not found yet.
73976a4caf6SAda */
740c8f74a56SAda if (++mpt->m_post_index == mpt->m_post_queue_depth) {
741c8f74a56SAda mpt->m_post_index = 0;
742c8f74a56SAda }
743c8f74a56SAda ddi_put32(mpt->m_datap, &mpt->m_reg->ReplyPostHostIndex,
744c8f74a56SAda mpt->m_post_index);
745c8f74a56SAda if (!found_reply) {
746c8f74a56SAda continue;
747c8f74a56SAda }
748c8f74a56SAda
749c8f74a56SAda break;
75076a4caf6SAda }
75176a4caf6SAda
75276a4caf6SAda /*
753c8f74a56SAda * clear the used slot as the last step.
75476a4caf6SAda */
755c8f74a56SAda slots->m_slot[MPTSAS_TM_SLOT(mpt)] = NULL;
75676a4caf6SAda }
75776a4caf6SAda
7585b504601Sjiang wu - Sun Microsystems - Beijing China int
mptsas_delete_volume(mptsas_t * mpt,uint16_t volid)7595b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_delete_volume(mptsas_t *mpt, uint16_t volid)
7605b504601Sjiang wu - Sun Microsystems - Beijing China {
761c8f74a56SAda int config, i = 0, vol = (-1);
7625b504601Sjiang wu - Sun Microsystems - Beijing China
763da5ab83fSKeith M Wesolowski for (config = 0; (config < mpt->m_num_raid_configs) && (vol != i);
764c8f74a56SAda config++) {
7655b504601Sjiang wu - Sun Microsystems - Beijing China for (i = 0; i < MPTSAS_MAX_RAIDVOLS; i++) {
766da5ab83fSKeith M Wesolowski if (mpt->m_raidconfig[config].m_raidvol[i].
7675b504601Sjiang wu - Sun Microsystems - Beijing China m_raidhandle == volid) {
7685b504601Sjiang wu - Sun Microsystems - Beijing China vol = i;
7695b504601Sjiang wu - Sun Microsystems - Beijing China break;
7705b504601Sjiang wu - Sun Microsystems - Beijing China }
7715b504601Sjiang wu - Sun Microsystems - Beijing China }
7725b504601Sjiang wu - Sun Microsystems - Beijing China }
7735b504601Sjiang wu - Sun Microsystems - Beijing China
7745b504601Sjiang wu - Sun Microsystems - Beijing China if (vol < 0) {
7755b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN, "raid doesn't exist at specified "
7765b504601Sjiang wu - Sun Microsystems - Beijing China "target.");
7775b504601Sjiang wu - Sun Microsystems - Beijing China return (-1);
7785b504601Sjiang wu - Sun Microsystems - Beijing China }
7795b504601Sjiang wu - Sun Microsystems - Beijing China
780da5ab83fSKeith M Wesolowski mpt->m_raidconfig[config].m_raidvol[vol].m_israid = 0;
781da5ab83fSKeith M Wesolowski mpt->m_raidconfig[config].m_raidvol[vol].m_ndisks = 0;
7825b504601Sjiang wu - Sun Microsystems - Beijing China for (i = 0; i < MPTSAS_MAX_DISKS_IN_VOL; i++) {
783da5ab83fSKeith M Wesolowski mpt->m_raidconfig[config].m_raidvol[vol].m_disknum[i] = 0;
784da5ab83fSKeith M Wesolowski mpt->m_raidconfig[config].m_raidvol[vol].m_devhdl[i] = 0;
7855b504601Sjiang wu - Sun Microsystems - Beijing China }
7865b504601Sjiang wu - Sun Microsystems - Beijing China
7875b504601Sjiang wu - Sun Microsystems - Beijing China return (0);
7885b504601Sjiang wu - Sun Microsystems - Beijing China }
789