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