15b504601Sjiang wu - Sun Microsystems - Beijing China /*
25b504601Sjiang wu - Sun Microsystems - Beijing China  * CDDL HEADER START
35b504601Sjiang wu - Sun Microsystems - Beijing China  *
45b504601Sjiang wu - Sun Microsystems - Beijing China  * The contents of this file are subject to the terms of the
55b504601Sjiang wu - Sun Microsystems - Beijing China  * Common Development and Distribution License (the "License").
65b504601Sjiang wu - Sun Microsystems - Beijing China  * You may not use this file except in compliance with the License.
75b504601Sjiang wu - Sun Microsystems - Beijing China  *
85b504601Sjiang wu - Sun Microsystems - Beijing China  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
95b504601Sjiang wu - Sun Microsystems - Beijing China  * or http://www.opensolaris.org/os/licensing.
105b504601Sjiang wu - Sun Microsystems - Beijing China  * See the License for the specific language governing permissions
115b504601Sjiang wu - Sun Microsystems - Beijing China  * and limitations under the License.
125b504601Sjiang wu - Sun Microsystems - Beijing China  *
135b504601Sjiang wu - Sun Microsystems - Beijing China  * When distributing Covered Code, include this CDDL HEADER in each
145b504601Sjiang wu - Sun Microsystems - Beijing China  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
155b504601Sjiang wu - Sun Microsystems - Beijing China  * If applicable, add the following below this CDDL HEADER, with the
165b504601Sjiang wu - Sun Microsystems - Beijing China  * fields enclosed by brackets "[]" replaced with your own identifying
175b504601Sjiang wu - Sun Microsystems - Beijing China  * information: Portions Copyright [yyyy] [name of copyright owner]
185b504601Sjiang wu - Sun Microsystems - Beijing China  *
195b504601Sjiang wu - Sun Microsystems - Beijing China  * CDDL HEADER END
205b504601Sjiang wu - Sun Microsystems - Beijing China  */
215b504601Sjiang wu - Sun Microsystems - Beijing China 
225b504601Sjiang wu - Sun Microsystems - Beijing China /*
235b504601Sjiang wu - Sun Microsystems - Beijing China  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
245b504601Sjiang wu - Sun Microsystems - Beijing China  * Use is subject to license terms.
25ed7418aeSAndy Giles  * Copyright (c) 2014, Tegile Systems Inc. All rights reserved.
265ee44debSRobert Mustacchi  * Copyright (c) 2017, Joyent, Inc.
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 /*
315b504601Sjiang wu - Sun Microsystems - Beijing China  * Copyright (c) 2000 to 2009, 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_init - This file contains all the functions used to initialize
595b504601Sjiang wu - Sun Microsystems - Beijing China  * MPT2.0 based hardware.
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 /*
675b504601Sjiang wu - Sun Microsystems - Beijing China  * standard header files
685b504601Sjiang wu - Sun Microsystems - Beijing China  */
695b504601Sjiang wu - Sun Microsystems - Beijing China #include <sys/note.h>
705b504601Sjiang wu - Sun Microsystems - Beijing China #include <sys/scsi/scsi.h>
715b504601Sjiang wu - Sun Microsystems - Beijing China 
725b504601Sjiang wu - Sun Microsystems - Beijing China #pragma pack(1)
73*72a2c484SHans Rosenfeld #include <sys/scsi/adapters/mpi/mpi2_type.h>
74*72a2c484SHans Rosenfeld #include <sys/scsi/adapters/mpi/mpi2.h>
75*72a2c484SHans Rosenfeld #include <sys/scsi/adapters/mpi/mpi2_cnfg.h>
76*72a2c484SHans Rosenfeld #include <sys/scsi/adapters/mpi/mpi2_init.h>
77*72a2c484SHans Rosenfeld #include <sys/scsi/adapters/mpi/mpi2_ioc.h>
78*72a2c484SHans Rosenfeld #include <sys/scsi/adapters/mpi/mpi2_tool.h>
795b504601Sjiang wu - Sun Microsystems - Beijing China #pragma pack()
805b504601Sjiang wu - Sun Microsystems - Beijing China /*
815b504601Sjiang wu - Sun Microsystems - Beijing China  * private header files.
825b504601Sjiang wu - Sun Microsystems - Beijing China  */
835b504601Sjiang wu - Sun Microsystems - Beijing China #include <sys/scsi/adapters/mpt_sas/mptsas_var.h>
845b504601Sjiang wu - Sun Microsystems - Beijing China 
855b504601Sjiang wu - Sun Microsystems - Beijing China static int mptsas_ioc_do_get_facts(mptsas_t *mpt, caddr_t memp, int var,
865b504601Sjiang wu - Sun Microsystems - Beijing China 	ddi_acc_handle_t accessp);
875b504601Sjiang wu - Sun Microsystems - Beijing China static int mptsas_ioc_do_get_facts_reply(mptsas_t *mpt, caddr_t memp, int var,
885b504601Sjiang wu - Sun Microsystems - Beijing China 	ddi_acc_handle_t accessp);
895b504601Sjiang wu - Sun Microsystems - Beijing China static int mptsas_ioc_do_get_port_facts(mptsas_t *mpt, caddr_t memp, int var,
905b504601Sjiang wu - Sun Microsystems - Beijing China 	ddi_acc_handle_t accessp);
915b504601Sjiang wu - Sun Microsystems - Beijing China static int mptsas_ioc_do_get_port_facts_reply(mptsas_t *mpt, caddr_t memp,
925b504601Sjiang wu - Sun Microsystems - Beijing China     int var, ddi_acc_handle_t accessp);
935b504601Sjiang wu - Sun Microsystems - Beijing China static int mptsas_ioc_do_enable_port(mptsas_t *mpt, caddr_t memp, int var,
945b504601Sjiang wu - Sun Microsystems - Beijing China 	ddi_acc_handle_t accessp);
955b504601Sjiang wu - Sun Microsystems - Beijing China static int mptsas_ioc_do_enable_port_reply(mptsas_t *mpt, caddr_t memp, int var,
965b504601Sjiang wu - Sun Microsystems - Beijing China 	ddi_acc_handle_t accessp);
975b504601Sjiang wu - Sun Microsystems - Beijing China static int mptsas_ioc_do_enable_event_notification(mptsas_t *mpt, caddr_t memp,
985b504601Sjiang wu - Sun Microsystems - Beijing China 	int var, ddi_acc_handle_t accessp);
995b504601Sjiang wu - Sun Microsystems - Beijing China static int mptsas_ioc_do_enable_event_notification_reply(mptsas_t *mpt,
1005b504601Sjiang wu - Sun Microsystems - Beijing China     caddr_t memp, int var, ddi_acc_handle_t accessp);
1015b504601Sjiang wu - Sun Microsystems - Beijing China static int mptsas_do_ioc_init(mptsas_t *mpt, caddr_t memp, int var,
1025b504601Sjiang wu - Sun Microsystems - Beijing China 	ddi_acc_handle_t accessp);
1035b504601Sjiang wu - Sun Microsystems - Beijing China static int mptsas_do_ioc_init_reply(mptsas_t *mpt, caddr_t memp, int var,
1045b504601Sjiang wu - Sun Microsystems - Beijing China 	ddi_acc_handle_t accessp);
1055b504601Sjiang wu - Sun Microsystems - Beijing China 
1065b504601Sjiang wu - Sun Microsystems - Beijing China static const char *
mptsas_devid_type_string(mptsas_t * mpt)107ed7418aeSAndy Giles mptsas_devid_type_string(mptsas_t *mpt)
1085b504601Sjiang wu - Sun Microsystems - Beijing China {
109ed7418aeSAndy Giles 	switch (mpt->m_devid) {
110ed7418aeSAndy Giles 	case MPI2_MFGPAGE_DEVID_SAS2008:
111ed7418aeSAndy Giles 		return ("SAS2008");
112ed7418aeSAndy Giles 	case MPI2_MFGPAGE_DEVID_SAS2004:
113ed7418aeSAndy Giles 		return ("SAS2004");
114ed7418aeSAndy Giles 	case MPI2_MFGPAGE_DEVID_SAS2108_1:
115ed7418aeSAndy Giles 	case MPI2_MFGPAGE_DEVID_SAS2108_2:
116ed7418aeSAndy Giles 	case MPI2_MFGPAGE_DEVID_SAS2108_3:
117ed7418aeSAndy Giles 		return ("SAS2108");
118ed7418aeSAndy Giles 	case MPI2_MFGPAGE_DEVID_SAS2116_1:
119ed7418aeSAndy Giles 	case MPI2_MFGPAGE_DEVID_SAS2116_2:
120ed7418aeSAndy Giles 		return ("SAS2116");
121ed7418aeSAndy Giles 	case MPI2_MFGPAGE_DEVID_SAS2208_1:
122ed7418aeSAndy Giles 	case MPI2_MFGPAGE_DEVID_SAS2208_2:
123ed7418aeSAndy Giles 	case MPI2_MFGPAGE_DEVID_SAS2208_3:
124ed7418aeSAndy Giles 	case MPI2_MFGPAGE_DEVID_SAS2208_4:
125ed7418aeSAndy Giles 	case MPI2_MFGPAGE_DEVID_SAS2208_5:
126ed7418aeSAndy Giles 	case MPI2_MFGPAGE_DEVID_SAS2208_6:
127ed7418aeSAndy Giles 		return ("SAS2208");
128ed7418aeSAndy Giles 	case MPI2_MFGPAGE_DEVID_SAS2308_1:
129ed7418aeSAndy Giles 	case MPI2_MFGPAGE_DEVID_SAS2308_2:
130ed7418aeSAndy Giles 	case MPI2_MFGPAGE_DEVID_SAS2308_3:
131ed7418aeSAndy Giles 		return ("SAS2308");
132ed7418aeSAndy Giles 	case MPI25_MFGPAGE_DEVID_SAS3004:
133ed7418aeSAndy Giles 		return ("SAS3004");
134ed7418aeSAndy Giles 	case MPI25_MFGPAGE_DEVID_SAS3008:
135ed7418aeSAndy Giles 		return ("SAS3008");
136ed7418aeSAndy Giles 	case MPI25_MFGPAGE_DEVID_SAS3108_1:
137ed7418aeSAndy Giles 	case MPI25_MFGPAGE_DEVID_SAS3108_2:
138ed7418aeSAndy Giles 	case MPI25_MFGPAGE_DEVID_SAS3108_5:
139ed7418aeSAndy Giles 	case MPI25_MFGPAGE_DEVID_SAS3108_6:
140ed7418aeSAndy Giles 		return ("SAS3108");
141e89016e7SRobert Mustacchi 	case MPI26_MFGPAGE_DEVID_SAS3216:
142e89016e7SRobert Mustacchi 	case MPI26_MFGPAGE_DEVID_SAS3316_1:
143e89016e7SRobert Mustacchi 	case MPI26_MFGPAGE_DEVID_SAS3316_2:
144e89016e7SRobert Mustacchi 	case MPI26_MFGPAGE_DEVID_SAS3316_3:
145e89016e7SRobert Mustacchi 	case MPI26_MFGPAGE_DEVID_SAS3316_4:
146e89016e7SRobert Mustacchi 		return ("SAS3216");
147e89016e7SRobert Mustacchi 	case MPI26_MFGPAGE_DEVID_SAS3224:
148e89016e7SRobert Mustacchi 	case MPI26_MFGPAGE_DEVID_SAS3324_1:
149e89016e7SRobert Mustacchi 	case MPI26_MFGPAGE_DEVID_SAS3324_2:
150e89016e7SRobert Mustacchi 	case MPI26_MFGPAGE_DEVID_SAS3324_3:
151e89016e7SRobert Mustacchi 	case MPI26_MFGPAGE_DEVID_SAS3324_4:
152e89016e7SRobert Mustacchi 		return ("SAS3224");
153e89016e7SRobert Mustacchi 	case MPI26_MFGPAGE_DEVID_SAS3408:
154e89016e7SRobert Mustacchi 		return ("SAS3408");
155e89016e7SRobert Mustacchi 	case MPI26_MFGPAGE_DEVID_SAS3416:
156e89016e7SRobert Mustacchi 		return ("SAS3416");
157e89016e7SRobert Mustacchi 	case MPI26_MFGPAGE_DEVID_SAS3508:
158e89016e7SRobert Mustacchi 	case MPI26_MFGPAGE_DEVID_SAS3508_1:
159e89016e7SRobert Mustacchi 		return ("SAS3508");
160e89016e7SRobert Mustacchi 	case MPI26_MFGPAGE_DEVID_SAS3516:
161e89016e7SRobert Mustacchi 	case MPI26_MFGPAGE_DEVID_SAS3516_1:
162e89016e7SRobert Mustacchi 		return ("SAS3516");
163e89016e7SRobert Mustacchi 	case MPI26_MFGPAGE_DEVID_SAS3616:
164e89016e7SRobert Mustacchi 		return ("SAS3616");
165e89016e7SRobert Mustacchi 	case MPI26_MFGPAGE_DEVID_SAS3708:
166e89016e7SRobert Mustacchi 		return ("SAS3708");
167e89016e7SRobert Mustacchi 	case MPI26_MFGPAGE_DEVID_SAS3716:
168e89016e7SRobert Mustacchi 		return ("SAS3716");
169e89016e7SRobert Mustacchi 	case MPI26_MFGPAGE_DEVID_SAS4008:
170e89016e7SRobert Mustacchi 		return ("SAS4008");
1715b504601Sjiang wu - Sun Microsystems - Beijing China 	default:
1725b504601Sjiang wu - Sun Microsystems - Beijing China 		return ("?");
1735b504601Sjiang wu - Sun Microsystems - Beijing China 	}
1745b504601Sjiang wu - Sun Microsystems - Beijing China }
1755b504601Sjiang wu - Sun Microsystems - Beijing China 
1765b504601Sjiang wu - Sun Microsystems - Beijing China int
mptsas_ioc_get_facts(mptsas_t * mpt)1775b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_ioc_get_facts(mptsas_t *mpt)
1785b504601Sjiang wu - Sun Microsystems - Beijing China {
1795b504601Sjiang wu - Sun Microsystems - Beijing China 	/*
1805b504601Sjiang wu - Sun Microsystems - Beijing China 	 * Send get facts messages
1815b504601Sjiang wu - Sun Microsystems - Beijing China 	 */
182a0ac5a9eSToomas Soome 	if (mptsas_do_dma(mpt, sizeof (MPI2_IOC_FACTS_REQUEST), 0,
1835b504601Sjiang wu - Sun Microsystems - Beijing China 	    mptsas_ioc_do_get_facts)) {
1845b504601Sjiang wu - Sun Microsystems - Beijing China 		return (DDI_FAILURE);
1855b504601Sjiang wu - Sun Microsystems - Beijing China 	}
1865b504601Sjiang wu - Sun Microsystems - Beijing China 
1875b504601Sjiang wu - Sun Microsystems - Beijing China 	/*
1885b504601Sjiang wu - Sun Microsystems - Beijing China 	 * Get facts reply messages
1895b504601Sjiang wu - Sun Microsystems - Beijing China 	 */
190a0ac5a9eSToomas Soome 	if (mptsas_do_dma(mpt, sizeof (MPI2_IOC_FACTS_REPLY), 0,
1915b504601Sjiang wu - Sun Microsystems - Beijing China 	    mptsas_ioc_do_get_facts_reply)) {
1925b504601Sjiang wu - Sun Microsystems - Beijing China 		return (DDI_FAILURE);
1935b504601Sjiang wu - Sun Microsystems - Beijing China 	}
1945b504601Sjiang wu - Sun Microsystems - Beijing China 
1955b504601Sjiang wu - Sun Microsystems - Beijing China 	return (DDI_SUCCESS);
1965b504601Sjiang wu - Sun Microsystems - Beijing China }
1975b504601Sjiang wu - Sun Microsystems - Beijing China 
1985b504601Sjiang wu - Sun Microsystems - Beijing China static int
mptsas_ioc_do_get_facts(mptsas_t * mpt,caddr_t memp,int var,ddi_acc_handle_t accessp)1995b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_ioc_do_get_facts(mptsas_t *mpt, caddr_t memp, int var,
2005ee44debSRobert Mustacchi     ddi_acc_handle_t accessp)
2015b504601Sjiang wu - Sun Microsystems - Beijing China {
2025b504601Sjiang wu - Sun Microsystems - Beijing China #ifndef __lock_lint
2035b504601Sjiang wu - Sun Microsystems - Beijing China 	_NOTE(ARGUNUSED(var))
2045b504601Sjiang wu - Sun Microsystems - Beijing China #endif
2055b504601Sjiang wu - Sun Microsystems - Beijing China 	pMpi2IOCFactsRequest_t	facts;
2065b504601Sjiang wu - Sun Microsystems - Beijing China 	int			numbytes;
2075b504601Sjiang wu - Sun Microsystems - Beijing China 
2085b504601Sjiang wu - Sun Microsystems - Beijing China 	bzero(memp, sizeof (*facts));
2095b504601Sjiang wu - Sun Microsystems - Beijing China 	facts = (void *)memp;
2105b504601Sjiang wu - Sun Microsystems - Beijing China 	ddi_put8(accessp, &facts->Function, MPI2_FUNCTION_IOC_FACTS);
2115b504601Sjiang wu - Sun Microsystems - Beijing China 	numbytes = sizeof (*facts);
2125b504601Sjiang wu - Sun Microsystems - Beijing China 
2135b504601Sjiang wu - Sun Microsystems - Beijing China 	/*
2145b504601Sjiang wu - Sun Microsystems - Beijing China 	 * Post message via handshake
2155b504601Sjiang wu - Sun Microsystems - Beijing China 	 */
2165b504601Sjiang wu - Sun Microsystems - Beijing China 	if (mptsas_send_handshake_msg(mpt, memp, numbytes, accessp)) {
2175b504601Sjiang wu - Sun Microsystems - Beijing China 		return (DDI_FAILURE);
2185b504601Sjiang wu - Sun Microsystems - Beijing China 	}
2195b504601Sjiang wu - Sun Microsystems - Beijing China 
2205b504601Sjiang wu - Sun Microsystems - Beijing China 	return (DDI_SUCCESS);
2215b504601Sjiang wu - Sun Microsystems - Beijing China }
2225b504601Sjiang wu - Sun Microsystems - Beijing China 
2235b504601Sjiang wu - Sun Microsystems - Beijing China static int
mptsas_ioc_do_get_facts_reply(mptsas_t * mpt,caddr_t memp,int var,ddi_acc_handle_t accessp)2245b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_ioc_do_get_facts_reply(mptsas_t *mpt, caddr_t memp, int var,
2255ee44debSRobert Mustacchi     ddi_acc_handle_t accessp)
2265b504601Sjiang wu - Sun Microsystems - Beijing China {
2275b504601Sjiang wu - Sun Microsystems - Beijing China #ifndef __lock_lint
2285b504601Sjiang wu - Sun Microsystems - Beijing China 	_NOTE(ARGUNUSED(var))
2295b504601Sjiang wu - Sun Microsystems - Beijing China #endif
2305b504601Sjiang wu - Sun Microsystems - Beijing China 
2315b504601Sjiang wu - Sun Microsystems - Beijing China 	pMpi2IOCFactsReply_t	factsreply;
2325b504601Sjiang wu - Sun Microsystems - Beijing China 	int			numbytes;
2335b504601Sjiang wu - Sun Microsystems - Beijing China 	uint_t			iocstatus;
2345b504601Sjiang wu - Sun Microsystems - Beijing China 	char			buf[32];
2355b504601Sjiang wu - Sun Microsystems - Beijing China 	uint16_t		numReplyFrames;
2365b504601Sjiang wu - Sun Microsystems - Beijing China 	uint16_t		queueSize, queueDiff;
2375b504601Sjiang wu - Sun Microsystems - Beijing China 	int			simple_sge_main;
2385b504601Sjiang wu - Sun Microsystems - Beijing China 	int			simple_sge_next;
23976a4caf6SAda 	uint32_t		capabilities;
240ed7418aeSAndy Giles 	uint16_t		msgversion;
2415b504601Sjiang wu - Sun Microsystems - Beijing China 
2425b504601Sjiang wu - Sun Microsystems - Beijing China 	bzero(memp, sizeof (*factsreply));
2435b504601Sjiang wu - Sun Microsystems - Beijing China 	factsreply = (void *)memp;
2445b504601Sjiang wu - Sun Microsystems - Beijing China 	numbytes = sizeof (*factsreply);
2455b504601Sjiang wu - Sun Microsystems - Beijing China 
2465b504601Sjiang wu - Sun Microsystems - Beijing China 	/*
2475b504601Sjiang wu - Sun Microsystems - Beijing China 	 * get ioc facts reply message
2485b504601Sjiang wu - Sun Microsystems - Beijing China 	 */
2495b504601Sjiang wu - Sun Microsystems - Beijing China 	if (mptsas_get_handshake_msg(mpt, memp, numbytes, accessp)) {
2505b504601Sjiang wu - Sun Microsystems - Beijing China 		return (DDI_FAILURE);
2515b504601Sjiang wu - Sun Microsystems - Beijing China 	}
2525b504601Sjiang wu - Sun Microsystems - Beijing China 
253e89016e7SRobert Mustacchi 	if ((iocstatus = ddi_get16(accessp, &factsreply->IOCStatus)) != 0) {
2545b504601Sjiang wu - Sun Microsystems - Beijing China 		mptsas_log(mpt, CE_WARN, "mptsas_ioc_do_get_facts_reply: "
2555b504601Sjiang wu - Sun Microsystems - Beijing China 		    "IOCStatus=0x%x, IOCLogInfo=0x%x", iocstatus,
2565b504601Sjiang wu - Sun Microsystems - Beijing China 		    ddi_get32(accessp, &factsreply->IOCLogInfo));
2575b504601Sjiang wu - Sun Microsystems - Beijing China 		return (DDI_FAILURE);
2585b504601Sjiang wu - Sun Microsystems - Beijing China 	}
2595b504601Sjiang wu - Sun Microsystems - Beijing China 
2605b504601Sjiang wu - Sun Microsystems - Beijing China 	/*
2615b504601Sjiang wu - Sun Microsystems - Beijing China 	 * store key values from reply to mpt structure
2625b504601Sjiang wu - Sun Microsystems - Beijing China 	 */
2635b504601Sjiang wu - Sun Microsystems - Beijing China 	mpt->m_fwversion = ddi_get32(accessp, &factsreply->FWVersion.Word);
2645b504601Sjiang wu - Sun Microsystems - Beijing China 	mpt->m_productid = ddi_get16(accessp, &factsreply->ProductID);
2655b504601Sjiang wu - Sun Microsystems - Beijing China 
2665b504601Sjiang wu - Sun Microsystems - Beijing China 
2675b504601Sjiang wu - Sun Microsystems - Beijing China 	(void) sprintf(buf, "%u.%u.%u.%u",
2685b504601Sjiang wu - Sun Microsystems - Beijing China 	    ddi_get8(accessp, &factsreply->FWVersion.Struct.Major),
2695b504601Sjiang wu - Sun Microsystems - Beijing China 	    ddi_get8(accessp, &factsreply->FWVersion.Struct.Minor),
2705b504601Sjiang wu - Sun Microsystems - Beijing China 	    ddi_get8(accessp, &factsreply->FWVersion.Struct.Unit),
2715b504601Sjiang wu - Sun Microsystems - Beijing China 	    ddi_get8(accessp, &factsreply->FWVersion.Struct.Dev));
272ed7418aeSAndy Giles 	mptsas_log(mpt, CE_NOTE, "?MPT Firmware version v%s (%s)\n",
273ed7418aeSAndy Giles 	    buf, mptsas_devid_type_string(mpt));
2745b504601Sjiang wu - Sun Microsystems - Beijing China 	(void) ddi_prop_update_string(DDI_DEV_T_NONE, mpt->m_dip,
2755b504601Sjiang wu - Sun Microsystems - Beijing China 	    "firmware-version", buf);
2765b504601Sjiang wu - Sun Microsystems - Beijing China 
2775b504601Sjiang wu - Sun Microsystems - Beijing China 	/*
2785b504601Sjiang wu - Sun Microsystems - Beijing China 	 * Set up request info.
2795b504601Sjiang wu - Sun Microsystems - Beijing China 	 */
2805b504601Sjiang wu - Sun Microsystems - Beijing China 	mpt->m_max_requests = ddi_get16(accessp,
2815b504601Sjiang wu - Sun Microsystems - Beijing China 	    &factsreply->RequestCredit) - 1;
2825b504601Sjiang wu - Sun Microsystems - Beijing China 	mpt->m_req_frame_size = ddi_get16(accessp,
2835b504601Sjiang wu - Sun Microsystems - Beijing China 	    &factsreply->IOCRequestFrameSize) * 4;
2845b504601Sjiang wu - Sun Microsystems - Beijing China 
2855b504601Sjiang wu - Sun Microsystems - Beijing China 	/*
2865b504601Sjiang wu - Sun Microsystems - Beijing China 	 * Size of reply free queue should be the number of requests
2875b504601Sjiang wu - Sun Microsystems - Beijing China 	 * plus some additional for events (32).  Make sure number of
2885b504601Sjiang wu - Sun Microsystems - Beijing China 	 * reply frames is not a multiple of 16 so that the queue sizes
2895b504601Sjiang wu - Sun Microsystems - Beijing China 	 * are calculated correctly later to be a multiple of 16.
2905b504601Sjiang wu - Sun Microsystems - Beijing China 	 */
2915b504601Sjiang wu - Sun Microsystems - Beijing China 	mpt->m_reply_frame_size = ddi_get8(accessp,
2925b504601Sjiang wu - Sun Microsystems - Beijing China 	    &factsreply->ReplyFrameSize) * 4;
2935b504601Sjiang wu - Sun Microsystems - Beijing China 	numReplyFrames = mpt->m_max_requests + 32;
2945b504601Sjiang wu - Sun Microsystems - Beijing China 	if (!(numReplyFrames % 16)) {
2955b504601Sjiang wu - Sun Microsystems - Beijing China 		numReplyFrames--;
2965b504601Sjiang wu - Sun Microsystems - Beijing China 	}
2975b504601Sjiang wu - Sun Microsystems - Beijing China 	mpt->m_max_replies = numReplyFrames;
2985b504601Sjiang wu - Sun Microsystems - Beijing China 	queueSize = numReplyFrames;
2995b504601Sjiang wu - Sun Microsystems - Beijing China 	queueSize += 16 - (queueSize % 16);
3005b504601Sjiang wu - Sun Microsystems - Beijing China 	mpt->m_free_queue_depth = queueSize;
3015b504601Sjiang wu - Sun Microsystems - Beijing China 
3025b504601Sjiang wu - Sun Microsystems - Beijing China 	/*
3035b504601Sjiang wu - Sun Microsystems - Beijing China 	 * Size of reply descriptor post queue should be the number of
3045b504601Sjiang wu - Sun Microsystems - Beijing China 	 * request frames + the number of reply frames + 1 and needs to
3055b504601Sjiang wu - Sun Microsystems - Beijing China 	 * be a multiple of 16.  This size can be no larger than
3065b504601Sjiang wu - Sun Microsystems - Beijing China 	 * MaxReplyDescriptorPostQueueDepth from IOCFacts.  If the
3075b504601Sjiang wu - Sun Microsystems - Beijing China 	 * calculated queue size is larger than allowed, subtract a
3085b504601Sjiang wu - Sun Microsystems - Beijing China 	 * multiple of 16 from m_max_requests, m_max_replies, and
3095b504601Sjiang wu - Sun Microsystems - Beijing China 	 * m_reply_free_depth.
3105b504601Sjiang wu - Sun Microsystems - Beijing China 	 */
3115b504601Sjiang wu - Sun Microsystems - Beijing China 	queueSize = mpt->m_max_requests + numReplyFrames + 1;
3125b504601Sjiang wu - Sun Microsystems - Beijing China 	if (queueSize % 16) {
3135b504601Sjiang wu - Sun Microsystems - Beijing China 		queueSize += 16 - (queueSize % 16);
3145b504601Sjiang wu - Sun Microsystems - Beijing China 	}
3155b504601Sjiang wu - Sun Microsystems - Beijing China 	mpt->m_post_queue_depth = ddi_get16(accessp,
3165b504601Sjiang wu - Sun Microsystems - Beijing China 	    &factsreply->MaxReplyDescriptorPostQueueDepth);
3175b504601Sjiang wu - Sun Microsystems - Beijing China 	if (queueSize > mpt->m_post_queue_depth) {
3185b504601Sjiang wu - Sun Microsystems - Beijing China 		queueDiff = queueSize - mpt->m_post_queue_depth;
3195b504601Sjiang wu - Sun Microsystems - Beijing China 		if (queueDiff % 16) {
3205b504601Sjiang wu - Sun Microsystems - Beijing China 			queueDiff += 16 - (queueDiff % 16);
3215b504601Sjiang wu - Sun Microsystems - Beijing China 		}
3225b504601Sjiang wu - Sun Microsystems - Beijing China 		mpt->m_max_requests -= queueDiff;
3235b504601Sjiang wu - Sun Microsystems - Beijing China 		mpt->m_max_replies -= queueDiff;
3245b504601Sjiang wu - Sun Microsystems - Beijing China 		mpt->m_free_queue_depth -= queueDiff;
3255b504601Sjiang wu - Sun Microsystems - Beijing China 		queueSize -= queueDiff;
3265b504601Sjiang wu - Sun Microsystems - Beijing China 	}
3275b504601Sjiang wu - Sun Microsystems - Beijing China 	mpt->m_post_queue_depth = queueSize;
3285b504601Sjiang wu - Sun Microsystems - Beijing China 
3295b504601Sjiang wu - Sun Microsystems - Beijing China 	/*
33076a4caf6SAda 	 * Set up max chain depth.
3315b504601Sjiang wu - Sun Microsystems - Beijing China 	 */
3325b504601Sjiang wu - Sun Microsystems - Beijing China 	mpt->m_max_chain_depth = ddi_get8(accessp,
3335b504601Sjiang wu - Sun Microsystems - Beijing China 	    &factsreply->MaxChainDepth);
334af483cc8Sjianfei wang - Sun Microsystems - Beijing China 	mpt->m_ioc_capabilities = ddi_get32(accessp,
335af483cc8Sjianfei wang - Sun Microsystems - Beijing China 	    &factsreply->IOCCapabilities);
3365b504601Sjiang wu - Sun Microsystems - Beijing China 
337ed7418aeSAndy Giles 	/*
338ed7418aeSAndy Giles 	 * Set flag to check for SAS3 support.
339ed7418aeSAndy Giles 	 */
340ed7418aeSAndy Giles 	msgversion = ddi_get16(accessp, &factsreply->MsgVersion);
3415ee44debSRobert Mustacchi 	if (msgversion >= MPI2_VERSION_02_05) {
342ed7418aeSAndy Giles 		mptsas_log(mpt, CE_NOTE, "?mpt_sas%d SAS 3 Supported\n",
343ed7418aeSAndy Giles 		    mpt->m_instance);
344ed7418aeSAndy Giles 		mpt->m_MPI25 = TRUE;
345ed7418aeSAndy Giles 	} else {
34650c45111SAndy Giles 		mptsas_log(mpt, CE_NOTE, "?mpt_sas%d MPI Version 0x%x\n",
347ed7418aeSAndy Giles 		    mpt->m_instance, msgversion);
348ed7418aeSAndy Giles 	}
349ed7418aeSAndy Giles 
3505b504601Sjiang wu - Sun Microsystems - Beijing China 	/*
3515b504601Sjiang wu - Sun Microsystems - Beijing China 	 * Calculate max frames per request based on DMA S/G length.
3525b504601Sjiang wu - Sun Microsystems - Beijing China 	 */
3535b504601Sjiang wu - Sun Microsystems - Beijing China 	simple_sge_main = MPTSAS_MAX_FRAME_SGES64(mpt) - 1;
354ed7418aeSAndy Giles 	simple_sge_next = mpt->m_req_frame_size / MPTSAS_SGE_SIZE(mpt) - 1;
3555b504601Sjiang wu - Sun Microsystems - Beijing China 
3565b504601Sjiang wu - Sun Microsystems - Beijing China 	mpt->m_max_request_frames = (MPTSAS_MAX_DMA_SEGS -
3575b504601Sjiang wu - Sun Microsystems - Beijing China 	    simple_sge_main) / simple_sge_next + 1;
3585b504601Sjiang wu - Sun Microsystems - Beijing China 	if (((MPTSAS_MAX_DMA_SEGS - simple_sge_main) %
3595b504601Sjiang wu - Sun Microsystems - Beijing China 	    simple_sge_next) > 1) {
3605b504601Sjiang wu - Sun Microsystems - Beijing China 		mpt->m_max_request_frames++;
3615b504601Sjiang wu - Sun Microsystems - Beijing China 	}
3625b504601Sjiang wu - Sun Microsystems - Beijing China 
36376a4caf6SAda 	/*
36476a4caf6SAda 	 * Check if controller supports FW diag buffers and set flag to enable
36576a4caf6SAda 	 * each type.
36676a4caf6SAda 	 */
36776a4caf6SAda 	capabilities = ddi_get32(accessp, &factsreply->IOCCapabilities);
36876a4caf6SAda 	if (capabilities & MPI2_IOCFACTS_CAPABILITY_DIAG_TRACE_BUFFER) {
36976a4caf6SAda 		mpt->m_fw_diag_buffer_list[MPI2_DIAG_BUF_TYPE_TRACE].enabled =
37076a4caf6SAda 		    TRUE;
37176a4caf6SAda 	}
37276a4caf6SAda 	if (capabilities & MPI2_IOCFACTS_CAPABILITY_SNAPSHOT_BUFFER) {
37376a4caf6SAda 		mpt->m_fw_diag_buffer_list[MPI2_DIAG_BUF_TYPE_SNAPSHOT].
37476a4caf6SAda 		    enabled = TRUE;
37576a4caf6SAda 	}
37676a4caf6SAda 	if (capabilities & MPI2_IOCFACTS_CAPABILITY_EXTENDED_BUFFER) {
37776a4caf6SAda 		mpt->m_fw_diag_buffer_list[MPI2_DIAG_BUF_TYPE_EXTENDED].
37876a4caf6SAda 		    enabled = TRUE;
37976a4caf6SAda 	}
38076a4caf6SAda 
38176a4caf6SAda 	/*
38276a4caf6SAda 	 * Check if controller supports replaying events when issuing Message
38376a4caf6SAda 	 * Unit Reset and set flag to enable MUR.
38476a4caf6SAda 	 */
38576a4caf6SAda 	if (capabilities & MPI2_IOCFACTS_CAPABILITY_EVENT_REPLAY) {
38676a4caf6SAda 		mpt->m_event_replay = TRUE;
38776a4caf6SAda 	}
38876a4caf6SAda 
38976a4caf6SAda 	/*
39076a4caf6SAda 	 * Check if controller supports IR.
39176a4caf6SAda 	 */
39276a4caf6SAda 	if (capabilities & MPI2_IOCFACTS_CAPABILITY_INTEGRATED_RAID) {
39376a4caf6SAda 		mpt->m_ir_capable = TRUE;
39476a4caf6SAda 	}
39576a4caf6SAda 
3965b504601Sjiang wu - Sun Microsystems - Beijing China 	return (DDI_SUCCESS);
3975b504601Sjiang wu - Sun Microsystems - Beijing China }
3985b504601Sjiang wu - Sun Microsystems - Beijing China 
3995b504601Sjiang wu - Sun Microsystems - Beijing China int
mptsas_ioc_get_port_facts(mptsas_t * mpt,int port)4005b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_ioc_get_port_facts(mptsas_t *mpt, int port)
4015b504601Sjiang wu - Sun Microsystems - Beijing China {
4025b504601Sjiang wu - Sun Microsystems - Beijing China 	/*
4035b504601Sjiang wu - Sun Microsystems - Beijing China 	 * Send get port facts message
4045b504601Sjiang wu - Sun Microsystems - Beijing China 	 */
4055b504601Sjiang wu - Sun Microsystems - Beijing China 	if (mptsas_do_dma(mpt, sizeof (MPI2_PORT_FACTS_REQUEST), port,
4065b504601Sjiang wu - Sun Microsystems - Beijing China 	    mptsas_ioc_do_get_port_facts)) {
4075b504601Sjiang wu - Sun Microsystems - Beijing China 		return (DDI_FAILURE);
4085b504601Sjiang wu - Sun Microsystems - Beijing China 	}
4095b504601Sjiang wu - Sun Microsystems - Beijing China 
4105b504601Sjiang wu - Sun Microsystems - Beijing China 	/*
4115b504601Sjiang wu - Sun Microsystems - Beijing China 	 * Get port facts reply message
4125b504601Sjiang wu - Sun Microsystems - Beijing China 	 */
4135b504601Sjiang wu - Sun Microsystems - Beijing China 	if (mptsas_do_dma(mpt, sizeof (MPI2_PORT_FACTS_REPLY), port,
4145b504601Sjiang wu - Sun Microsystems - Beijing China 	    mptsas_ioc_do_get_port_facts_reply)) {
4155b504601Sjiang wu - Sun Microsystems - Beijing China 		return (DDI_FAILURE);
4165b504601Sjiang wu - Sun Microsystems - Beijing China 	}
4175b504601Sjiang wu - Sun Microsystems - Beijing China 
4185b504601Sjiang wu - Sun Microsystems - Beijing China 	return (DDI_SUCCESS);
4195b504601Sjiang wu - Sun Microsystems - Beijing China }
4205b504601Sjiang wu - Sun Microsystems - Beijing China 
4215b504601Sjiang wu - Sun Microsystems - Beijing China static int
mptsas_ioc_do_get_port_facts(mptsas_t * mpt,caddr_t memp,int var,ddi_acc_handle_t accessp)4225b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_ioc_do_get_port_facts(mptsas_t *mpt, caddr_t memp, int var,
4235ee44debSRobert Mustacchi     ddi_acc_handle_t accessp)
4245b504601Sjiang wu - Sun Microsystems - Beijing China {
4255b504601Sjiang wu - Sun Microsystems - Beijing China 	pMpi2PortFactsRequest_t	facts;
4265b504601Sjiang wu - Sun Microsystems - Beijing China 	int			numbytes;
4275b504601Sjiang wu - Sun Microsystems - Beijing China 
4285b504601Sjiang wu - Sun Microsystems - Beijing China 	bzero(memp, sizeof (*facts));
4295b504601Sjiang wu - Sun Microsystems - Beijing China 	facts = (void *)memp;
4305b504601Sjiang wu - Sun Microsystems - Beijing China 	ddi_put8(accessp, &facts->Function, MPI2_FUNCTION_PORT_FACTS);
4315b504601Sjiang wu - Sun Microsystems - Beijing China 	ddi_put8(accessp, &facts->PortNumber, var);
4325b504601Sjiang wu - Sun Microsystems - Beijing China 	numbytes = sizeof (*facts);
4335b504601Sjiang wu - Sun Microsystems - Beijing China 
4345b504601Sjiang wu - Sun Microsystems - Beijing China 	/*
4355b504601Sjiang wu - Sun Microsystems - Beijing China 	 * Send port facts message via handshake
4365b504601Sjiang wu - Sun Microsystems - Beijing China 	 */
4375b504601Sjiang wu - Sun Microsystems - Beijing China 	if (mptsas_send_handshake_msg(mpt, memp, numbytes, accessp)) {
4385b504601Sjiang wu - Sun Microsystems - Beijing China 		return (DDI_FAILURE);
4395b504601Sjiang wu - Sun Microsystems - Beijing China 	}
4405b504601Sjiang wu - Sun Microsystems - Beijing China 
4415b504601Sjiang wu - Sun Microsystems - Beijing China 	return (DDI_SUCCESS);
4425b504601Sjiang wu - Sun Microsystems - Beijing China }
4435b504601Sjiang wu - Sun Microsystems - Beijing China 
4445b504601Sjiang wu - Sun Microsystems - Beijing China static int
mptsas_ioc_do_get_port_facts_reply(mptsas_t * mpt,caddr_t memp,int var,ddi_acc_handle_t accessp)4455b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_ioc_do_get_port_facts_reply(mptsas_t *mpt, caddr_t memp, int var,
4465ee44debSRobert Mustacchi     ddi_acc_handle_t accessp)
4475b504601Sjiang wu - Sun Microsystems - Beijing China {
4485b504601Sjiang wu - Sun Microsystems - Beijing China #ifndef __lock_lint
4495b504601Sjiang wu - Sun Microsystems - Beijing China 	_NOTE(ARGUNUSED(var))
4505b504601Sjiang wu - Sun Microsystems - Beijing China #endif
4515b504601Sjiang wu - Sun Microsystems - Beijing China 	pMpi2PortFactsReply_t	factsreply;
4525b504601Sjiang wu - Sun Microsystems - Beijing China 	int			numbytes;
4535b504601Sjiang wu - Sun Microsystems - Beijing China 	uint_t			iocstatus;
4545b504601Sjiang wu - Sun Microsystems - Beijing China 
4555b504601Sjiang wu - Sun Microsystems - Beijing China 	bzero(memp, sizeof (*factsreply));
4565b504601Sjiang wu - Sun Microsystems - Beijing China 	factsreply = (void *)memp;
4575b504601Sjiang wu - Sun Microsystems - Beijing China 	numbytes = sizeof (*factsreply);
4585b504601Sjiang wu - Sun Microsystems - Beijing China 
4595b504601Sjiang wu - Sun Microsystems - Beijing China 	/*
4605b504601Sjiang wu - Sun Microsystems - Beijing China 	 * Get port facts reply message via handshake
4615b504601Sjiang wu - Sun Microsystems - Beijing China 	 */
4625b504601Sjiang wu - Sun Microsystems - Beijing China 	if (mptsas_get_handshake_msg(mpt, memp, numbytes, accessp)) {
4635b504601Sjiang wu - Sun Microsystems - Beijing China 		return (DDI_FAILURE);
4645b504601Sjiang wu - Sun Microsystems - Beijing China 	}
4655b504601Sjiang wu - Sun Microsystems - Beijing China 
466e89016e7SRobert Mustacchi 	if ((iocstatus = ddi_get16(accessp, &factsreply->IOCStatus)) != 0) {
4675b504601Sjiang wu - Sun Microsystems - Beijing China 		mptsas_log(mpt, CE_WARN, "mptsas_ioc_do_get_port_facts_reply: "
4685b504601Sjiang wu - Sun Microsystems - Beijing China 		    "IOCStatus=0x%x, IOCLogInfo=0x%x", iocstatus,
4695b504601Sjiang wu - Sun Microsystems - Beijing China 		    ddi_get32(accessp, &factsreply->IOCLogInfo));
4705b504601Sjiang wu - Sun Microsystems - Beijing China 		return (DDI_FAILURE);
4715b504601Sjiang wu - Sun Microsystems - Beijing China 	}
4725b504601Sjiang wu - Sun Microsystems - Beijing China 
4735b504601Sjiang wu - Sun Microsystems - Beijing China 	return (DDI_SUCCESS);
4745b504601Sjiang wu - Sun Microsystems - Beijing China }
4755b504601Sjiang wu - Sun Microsystems - Beijing China 
4765b504601Sjiang wu - Sun Microsystems - Beijing China int
mptsas_ioc_enable_port(mptsas_t * mpt)4775b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_ioc_enable_port(mptsas_t *mpt)
4785b504601Sjiang wu - Sun Microsystems - Beijing China {
4795b504601Sjiang wu - Sun Microsystems - Beijing China 	/*
4805b504601Sjiang wu - Sun Microsystems - Beijing China 	 * Send enable port message
4815b504601Sjiang wu - Sun Microsystems - Beijing China 	 */
4825b504601Sjiang wu - Sun Microsystems - Beijing China 	if (mptsas_do_dma(mpt, sizeof (MPI2_PORT_ENABLE_REQUEST), 0,
4835b504601Sjiang wu - Sun Microsystems - Beijing China 	    mptsas_ioc_do_enable_port)) {
4845b504601Sjiang wu - Sun Microsystems - Beijing China 		return (DDI_FAILURE);
4855b504601Sjiang wu - Sun Microsystems - Beijing China 	}
4865b504601Sjiang wu - Sun Microsystems - Beijing China 
4875b504601Sjiang wu - Sun Microsystems - Beijing China 	/*
4885b504601Sjiang wu - Sun Microsystems - Beijing China 	 * Get enable port reply message
4895b504601Sjiang wu - Sun Microsystems - Beijing China 	 */
4905b504601Sjiang wu - Sun Microsystems - Beijing China 	if (mptsas_do_dma(mpt, sizeof (MPI2_PORT_ENABLE_REPLY), 0,
4915b504601Sjiang wu - Sun Microsystems - Beijing China 	    mptsas_ioc_do_enable_port_reply)) {
4925b504601Sjiang wu - Sun Microsystems - Beijing China 		return (DDI_FAILURE);
4935b504601Sjiang wu - Sun Microsystems - Beijing China 	}
4945b504601Sjiang wu - Sun Microsystems - Beijing China 
4955b504601Sjiang wu - Sun Microsystems - Beijing China 	return (DDI_SUCCESS);
4965b504601Sjiang wu - Sun Microsystems - Beijing China }
4975b504601Sjiang wu - Sun Microsystems - Beijing China 
4985b504601Sjiang wu - Sun Microsystems - Beijing China static int
mptsas_ioc_do_enable_port(mptsas_t * mpt,caddr_t memp,int var,ddi_acc_handle_t accessp)4995b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_ioc_do_enable_port(mptsas_t *mpt, caddr_t memp, int var,
5005ee44debSRobert Mustacchi     ddi_acc_handle_t accessp)
5015b504601Sjiang wu - Sun Microsystems - Beijing China {
5025b504601Sjiang wu - Sun Microsystems - Beijing China #ifndef __lock_lint
5035b504601Sjiang wu - Sun Microsystems - Beijing China 	_NOTE(ARGUNUSED(var))
5045b504601Sjiang wu - Sun Microsystems - Beijing China #endif
5055b504601Sjiang wu - Sun Microsystems - Beijing China 	pMpi2PortEnableRequest_t	enable;
5065b504601Sjiang wu - Sun Microsystems - Beijing China 	int				numbytes;
5075b504601Sjiang wu - Sun Microsystems - Beijing China 
5085b504601Sjiang wu - Sun Microsystems - Beijing China 	bzero(memp, sizeof (*enable));
5095b504601Sjiang wu - Sun Microsystems - Beijing China 	enable = (void *)memp;
5105b504601Sjiang wu - Sun Microsystems - Beijing China 	ddi_put8(accessp, &enable->Function, MPI2_FUNCTION_PORT_ENABLE);
5115b504601Sjiang wu - Sun Microsystems - Beijing China 	numbytes = sizeof (*enable);
5125b504601Sjiang wu - Sun Microsystems - Beijing China 
5135b504601Sjiang wu - Sun Microsystems - Beijing China 	/*
5145b504601Sjiang wu - Sun Microsystems - Beijing China 	 * Send message via handshake
5155b504601Sjiang wu - Sun Microsystems - Beijing China 	 */
5165b504601Sjiang wu - Sun Microsystems - Beijing China 	if (mptsas_send_handshake_msg(mpt, memp, numbytes, accessp)) {
5175b504601Sjiang wu - Sun Microsystems - Beijing China 		return (DDI_FAILURE);
5185b504601Sjiang wu - Sun Microsystems - Beijing China 	}
5195b504601Sjiang wu - Sun Microsystems - Beijing China 
5205b504601Sjiang wu - Sun Microsystems - Beijing China 	return (DDI_SUCCESS);
5215b504601Sjiang wu - Sun Microsystems - Beijing China }
5225b504601Sjiang wu - Sun Microsystems - Beijing China 
5235b504601Sjiang wu - Sun Microsystems - Beijing China static int
mptsas_ioc_do_enable_port_reply(mptsas_t * mpt,caddr_t memp,int var,ddi_acc_handle_t accessp)5245b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_ioc_do_enable_port_reply(mptsas_t *mpt, caddr_t memp, int var,
5255ee44debSRobert Mustacchi     ddi_acc_handle_t accessp)
5265b504601Sjiang wu - Sun Microsystems - Beijing China {
5275b504601Sjiang wu - Sun Microsystems - Beijing China #ifndef __lock_lint
5285b504601Sjiang wu - Sun Microsystems - Beijing China 	_NOTE(ARGUNUSED(var))
5295b504601Sjiang wu - Sun Microsystems - Beijing China #endif
5305b504601Sjiang wu - Sun Microsystems - Beijing China 
5315b504601Sjiang wu - Sun Microsystems - Beijing China 	int			numbytes;
5325b504601Sjiang wu - Sun Microsystems - Beijing China 	uint_t			iocstatus;
5335b504601Sjiang wu - Sun Microsystems - Beijing China 	pMpi2PortEnableReply_t	portreply;
5345b504601Sjiang wu - Sun Microsystems - Beijing China 
5355b504601Sjiang wu - Sun Microsystems - Beijing China 	numbytes = sizeof (MPI2_PORT_ENABLE_REPLY);
5365b504601Sjiang wu - Sun Microsystems - Beijing China 	bzero(memp, numbytes);
5375b504601Sjiang wu - Sun Microsystems - Beijing China 	portreply = (void *)memp;
5385b504601Sjiang wu - Sun Microsystems - Beijing China 
5395b504601Sjiang wu - Sun Microsystems - Beijing China 	/*
5405b504601Sjiang wu - Sun Microsystems - Beijing China 	 * Get message via handshake
5415b504601Sjiang wu - Sun Microsystems - Beijing China 	 */
5425b504601Sjiang wu - Sun Microsystems - Beijing China 	if (mptsas_get_handshake_msg(mpt, memp, numbytes, accessp)) {
5435b504601Sjiang wu - Sun Microsystems - Beijing China 		return (DDI_FAILURE);
5445b504601Sjiang wu - Sun Microsystems - Beijing China 	}
5455b504601Sjiang wu - Sun Microsystems - Beijing China 
546e89016e7SRobert Mustacchi 	if ((iocstatus = ddi_get16(accessp, &portreply->IOCStatus)) != 0) {
5475b504601Sjiang wu - Sun Microsystems - Beijing China 		mptsas_log(mpt, CE_WARN, "mptsas_ioc_do_enable_port_reply: "
5485b504601Sjiang wu - Sun Microsystems - Beijing China 		    "IOCStatus=0x%x, IOCLogInfo=0x%x", iocstatus,
5495b504601Sjiang wu - Sun Microsystems - Beijing China 		    ddi_get32(accessp, &portreply->IOCLogInfo));
5505b504601Sjiang wu - Sun Microsystems - Beijing China 		return (DDI_FAILURE);
5515b504601Sjiang wu - Sun Microsystems - Beijing China 	}
5525b504601Sjiang wu - Sun Microsystems - Beijing China 
5535b504601Sjiang wu - Sun Microsystems - Beijing China 	return (DDI_SUCCESS);
5545b504601Sjiang wu - Sun Microsystems - Beijing China }
5555b504601Sjiang wu - Sun Microsystems - Beijing China 
5565b504601Sjiang wu - Sun Microsystems - Beijing China int
mptsas_ioc_enable_event_notification(mptsas_t * mpt)5575b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_ioc_enable_event_notification(mptsas_t *mpt)
5585b504601Sjiang wu - Sun Microsystems - Beijing China {
5595b504601Sjiang wu - Sun Microsystems - Beijing China 	ASSERT(mutex_owned(&mpt->m_mutex));
5605b504601Sjiang wu - Sun Microsystems - Beijing China 
5615b504601Sjiang wu - Sun Microsystems - Beijing China 	/*
5625b504601Sjiang wu - Sun Microsystems - Beijing China 	 * Send enable event notification message
5635b504601Sjiang wu - Sun Microsystems - Beijing China 	 */
564a0ac5a9eSToomas Soome 	if (mptsas_do_dma(mpt, sizeof (MPI2_EVENT_NOTIFICATION_REQUEST), 0,
5655b504601Sjiang wu - Sun Microsystems - Beijing China 	    mptsas_ioc_do_enable_event_notification)) {
5665b504601Sjiang wu - Sun Microsystems - Beijing China 		return (DDI_FAILURE);
5675b504601Sjiang wu - Sun Microsystems - Beijing China 	}
5685b504601Sjiang wu - Sun Microsystems - Beijing China 
5695b504601Sjiang wu - Sun Microsystems - Beijing China 	/*
5705b504601Sjiang wu - Sun Microsystems - Beijing China 	 * Get enable event reply message
5715b504601Sjiang wu - Sun Microsystems - Beijing China 	 */
572a0ac5a9eSToomas Soome 	if (mptsas_do_dma(mpt, sizeof (MPI2_EVENT_NOTIFICATION_REPLY), 0,
5735b504601Sjiang wu - Sun Microsystems - Beijing China 	    mptsas_ioc_do_enable_event_notification_reply)) {
5745b504601Sjiang wu - Sun Microsystems - Beijing China 		return (DDI_FAILURE);
5755b504601Sjiang wu - Sun Microsystems - Beijing China 	}
5765b504601Sjiang wu - Sun Microsystems - Beijing China 
5775b504601Sjiang wu - Sun Microsystems - Beijing China 	return (DDI_SUCCESS);
5785b504601Sjiang wu - Sun Microsystems - Beijing China }
5795b504601Sjiang wu - Sun Microsystems - Beijing China 
5805b504601Sjiang wu - Sun Microsystems - Beijing China static int
mptsas_ioc_do_enable_event_notification(mptsas_t * mpt,caddr_t memp,int var,ddi_acc_handle_t accessp)5815b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_ioc_do_enable_event_notification(mptsas_t *mpt, caddr_t memp, int var,
5825ee44debSRobert Mustacchi     ddi_acc_handle_t accessp)
5835b504601Sjiang wu - Sun Microsystems - Beijing China {
5845b504601Sjiang wu - Sun Microsystems - Beijing China #ifndef __lock_lint
5855b504601Sjiang wu - Sun Microsystems - Beijing China 	_NOTE(ARGUNUSED(var))
5865b504601Sjiang wu - Sun Microsystems - Beijing China #endif
5875b504601Sjiang wu - Sun Microsystems - Beijing China 
5885b504601Sjiang wu - Sun Microsystems - Beijing China 	pMpi2EventNotificationRequest_t	event;
5895b504601Sjiang wu - Sun Microsystems - Beijing China 	int				numbytes;
5905b504601Sjiang wu - Sun Microsystems - Beijing China 
5915b504601Sjiang wu - Sun Microsystems - Beijing China 	bzero(memp, sizeof (*event));
5925b504601Sjiang wu - Sun Microsystems - Beijing China 	event = (void *)memp;
5935b504601Sjiang wu - Sun Microsystems - Beijing China 	ddi_put8(accessp, &event->Function, MPI2_FUNCTION_EVENT_NOTIFICATION);
5945b504601Sjiang wu - Sun Microsystems - Beijing China 	numbytes = sizeof (*event);
5955b504601Sjiang wu - Sun Microsystems - Beijing China 
5965b504601Sjiang wu - Sun Microsystems - Beijing China 	/*
5975b504601Sjiang wu - Sun Microsystems - Beijing China 	 * Send message via handshake
5985b504601Sjiang wu - Sun Microsystems - Beijing China 	 */
5995b504601Sjiang wu - Sun Microsystems - Beijing China 	if (mptsas_send_handshake_msg(mpt, memp, numbytes, accessp)) {
6005b504601Sjiang wu - Sun Microsystems - Beijing China 		return (DDI_FAILURE);
6015b504601Sjiang wu - Sun Microsystems - Beijing China 	}
6025b504601Sjiang wu - Sun Microsystems - Beijing China 
6035b504601Sjiang wu - Sun Microsystems - Beijing China 	return (DDI_SUCCESS);
6045b504601Sjiang wu - Sun Microsystems - Beijing China }
6055b504601Sjiang wu - Sun Microsystems - Beijing China 
6065b504601Sjiang wu - Sun Microsystems - Beijing China static int
mptsas_ioc_do_enable_event_notification_reply(mptsas_t * mpt,caddr_t memp,int var,ddi_acc_handle_t accessp)6075b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_ioc_do_enable_event_notification_reply(mptsas_t *mpt, caddr_t memp,
6085b504601Sjiang wu - Sun Microsystems - Beijing China     int var, ddi_acc_handle_t accessp)
6095b504601Sjiang wu - Sun Microsystems - Beijing China {
6105b504601Sjiang wu - Sun Microsystems - Beijing China #ifndef __lock_lint
6115b504601Sjiang wu - Sun Microsystems - Beijing China 	_NOTE(ARGUNUSED(var))
6125b504601Sjiang wu - Sun Microsystems - Beijing China #endif
6135b504601Sjiang wu - Sun Microsystems - Beijing China 	int				numbytes;
6145b504601Sjiang wu - Sun Microsystems - Beijing China 	uint_t				iocstatus;
6155b504601Sjiang wu - Sun Microsystems - Beijing China 	pMpi2EventNotificationReply_t	eventsreply;
6165b504601Sjiang wu - Sun Microsystems - Beijing China 
6175b504601Sjiang wu - Sun Microsystems - Beijing China 	numbytes = sizeof (MPI2_EVENT_NOTIFICATION_REPLY);
6185b504601Sjiang wu - Sun Microsystems - Beijing China 	bzero(memp, numbytes);
6195b504601Sjiang wu - Sun Microsystems - Beijing China 	eventsreply = (void *)memp;
6205b504601Sjiang wu - Sun Microsystems - Beijing China 
6215b504601Sjiang wu - Sun Microsystems - Beijing China 	/*
6225b504601Sjiang wu - Sun Microsystems - Beijing China 	 * Get message via handshake
6235b504601Sjiang wu - Sun Microsystems - Beijing China 	 */
6245b504601Sjiang wu - Sun Microsystems - Beijing China 	if (mptsas_get_handshake_msg(mpt, memp, numbytes, accessp)) {
6255b504601Sjiang wu - Sun Microsystems - Beijing China 		return (DDI_FAILURE);
6265b504601Sjiang wu - Sun Microsystems - Beijing China 	}
6275b504601Sjiang wu - Sun Microsystems - Beijing China 
628e89016e7SRobert Mustacchi 	if ((iocstatus = ddi_get16(accessp, &eventsreply->IOCStatus)) != 0) {
6295b504601Sjiang wu - Sun Microsystems - Beijing China 		mptsas_log(mpt, CE_WARN,
6305b504601Sjiang wu - Sun Microsystems - Beijing China 		    "mptsas_ioc_do_enable_event_notification_reply: "
6315b504601Sjiang wu - Sun Microsystems - Beijing China 		    "IOCStatus=0x%x, IOCLogInfo=0x%x", iocstatus,
6325b504601Sjiang wu - Sun Microsystems - Beijing China 		    ddi_get32(accessp, &eventsreply->IOCLogInfo));
6335b504601Sjiang wu - Sun Microsystems - Beijing China 		return (DDI_FAILURE);
6345b504601Sjiang wu - Sun Microsystems - Beijing China 	}
6355b504601Sjiang wu - Sun Microsystems - Beijing China 
6365b504601Sjiang wu - Sun Microsystems - Beijing China 	return (DDI_SUCCESS);
6375b504601Sjiang wu - Sun Microsystems - Beijing China }
6385b504601Sjiang wu - Sun Microsystems - Beijing China 
6395b504601Sjiang wu - Sun Microsystems - Beijing China int
mptsas_ioc_init(mptsas_t * mpt)6405b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_ioc_init(mptsas_t *mpt)
6415b504601Sjiang wu - Sun Microsystems - Beijing China {
6425b504601Sjiang wu - Sun Microsystems - Beijing China 	/*
6435b504601Sjiang wu - Sun Microsystems - Beijing China 	 * Send ioc init message
6445b504601Sjiang wu - Sun Microsystems - Beijing China 	 */
645a0ac5a9eSToomas Soome 	if (mptsas_do_dma(mpt, sizeof (MPI2_IOC_INIT_REQUEST), 0,
6465b504601Sjiang wu - Sun Microsystems - Beijing China 	    mptsas_do_ioc_init)) {
6475b504601Sjiang wu - Sun Microsystems - Beijing China 		return (DDI_FAILURE);
6485b504601Sjiang wu - Sun Microsystems - Beijing China 	}
6495b504601Sjiang wu - Sun Microsystems - Beijing China 
6505b504601Sjiang wu - Sun Microsystems - Beijing China 	/*
6515b504601Sjiang wu - Sun Microsystems - Beijing China 	 * Get ioc init reply message
6525b504601Sjiang wu - Sun Microsystems - Beijing China 	 */
653a0ac5a9eSToomas Soome 	if (mptsas_do_dma(mpt, sizeof (MPI2_IOC_INIT_REPLY), 0,
6545b504601Sjiang wu - Sun Microsystems - Beijing China 	    mptsas_do_ioc_init_reply)) {
6555b504601Sjiang wu - Sun Microsystems - Beijing China 		return (DDI_FAILURE);
6565b504601Sjiang wu - Sun Microsystems - Beijing China 	}
6575b504601Sjiang wu - Sun Microsystems - Beijing China 
6585b504601Sjiang wu - Sun Microsystems - Beijing China 	return (DDI_SUCCESS);
6595b504601Sjiang wu - Sun Microsystems - Beijing China }
6605b504601Sjiang wu - Sun Microsystems - Beijing China 
6615b504601Sjiang wu - Sun Microsystems - Beijing China static int
mptsas_do_ioc_init(mptsas_t * mpt,caddr_t memp,int var,ddi_acc_handle_t accessp)6625b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_do_ioc_init(mptsas_t *mpt, caddr_t memp, int var,
6635b504601Sjiang wu - Sun Microsystems - Beijing China     ddi_acc_handle_t accessp)
6645b504601Sjiang wu - Sun Microsystems - Beijing China {
6655b504601Sjiang wu - Sun Microsystems - Beijing China #ifndef __lock_lint
6665b504601Sjiang wu - Sun Microsystems - Beijing China 	_NOTE(ARGUNUSED(var))
6675b504601Sjiang wu - Sun Microsystems - Beijing China #endif
6685b504601Sjiang wu - Sun Microsystems - Beijing China 
6695b504601Sjiang wu - Sun Microsystems - Beijing China 	pMpi2IOCInitRequest_t	init;
6705b504601Sjiang wu - Sun Microsystems - Beijing China 	int			numbytes;
67176a4caf6SAda 	timespec_t		time;
67276a4caf6SAda 	uint64_t		mSec;
6735b504601Sjiang wu - Sun Microsystems - Beijing China 
6745b504601Sjiang wu - Sun Microsystems - Beijing China 	bzero(memp, sizeof (*init));
6755b504601Sjiang wu - Sun Microsystems - Beijing China 	init = (void *)memp;
6765b504601Sjiang wu - Sun Microsystems - Beijing China 	ddi_put8(accessp, &init->Function, MPI2_FUNCTION_IOC_INIT);
6775b504601Sjiang wu - Sun Microsystems - Beijing China 	ddi_put8(accessp, &init->WhoInit, MPI2_WHOINIT_HOST_DRIVER);
6785b504601Sjiang wu - Sun Microsystems - Beijing China 	ddi_put16(accessp, &init->MsgVersion, MPI2_VERSION);
6795b504601Sjiang wu - Sun Microsystems - Beijing China 	ddi_put16(accessp, &init->HeaderVersion, MPI2_HEADER_VERSION);
6805b504601Sjiang wu - Sun Microsystems - Beijing China 	ddi_put16(accessp, &init->SystemRequestFrameSize,
6815b504601Sjiang wu - Sun Microsystems - Beijing China 	    mpt->m_req_frame_size / 4);
6825b504601Sjiang wu - Sun Microsystems - Beijing China 	ddi_put16(accessp, &init->ReplyDescriptorPostQueueDepth,
6835b504601Sjiang wu - Sun Microsystems - Beijing China 	    mpt->m_post_queue_depth);
6845b504601Sjiang wu - Sun Microsystems - Beijing China 	ddi_put16(accessp, &init->ReplyFreeQueueDepth,
6855b504601Sjiang wu - Sun Microsystems - Beijing China 	    mpt->m_free_queue_depth);
6865b504601Sjiang wu - Sun Microsystems - Beijing China 
6875b504601Sjiang wu - Sun Microsystems - Beijing China 	/*
6885b504601Sjiang wu - Sun Microsystems - Beijing China 	 * These addresses are set using the DMA cookie addresses from when the
6895b504601Sjiang wu - Sun Microsystems - Beijing China 	 * memory was allocated.  Sense buffer hi address should be 0.
6905b504601Sjiang wu - Sun Microsystems - Beijing China 	 */
691940efceeSAndy Giles 	ddi_put32(accessp, &init->SenseBufferAddressHigh,
692940efceeSAndy Giles 	    (uint32_t)(mpt->m_req_sense_dma_addr >> 32));
6935b504601Sjiang wu - Sun Microsystems - Beijing China 	ddi_put32(accessp, &init->SystemReplyAddressHigh,
6945b504601Sjiang wu - Sun Microsystems - Beijing China 	    (uint32_t)(mpt->m_reply_frame_dma_addr >> 32));
6955b504601Sjiang wu - Sun Microsystems - Beijing China 	ddi_put32(accessp, &init->SystemRequestFrameBaseAddress.High,
6965b504601Sjiang wu - Sun Microsystems - Beijing China 	    (uint32_t)(mpt->m_req_frame_dma_addr >> 32));
6975b504601Sjiang wu - Sun Microsystems - Beijing China 	ddi_put32(accessp, &init->SystemRequestFrameBaseAddress.Low,
6985b504601Sjiang wu - Sun Microsystems - Beijing China 	    (uint32_t)mpt->m_req_frame_dma_addr);
6995b504601Sjiang wu - Sun Microsystems - Beijing China 	ddi_put32(accessp, &init->ReplyDescriptorPostQueueAddress.High,
7005b504601Sjiang wu - Sun Microsystems - Beijing China 	    (uint32_t)(mpt->m_post_queue_dma_addr >> 32));
7015b504601Sjiang wu - Sun Microsystems - Beijing China 	ddi_put32(accessp, &init->ReplyDescriptorPostQueueAddress.Low,
7025b504601Sjiang wu - Sun Microsystems - Beijing China 	    (uint32_t)mpt->m_post_queue_dma_addr);
7035b504601Sjiang wu - Sun Microsystems - Beijing China 	ddi_put32(accessp, &init->ReplyFreeQueueAddress.High,
7045b504601Sjiang wu - Sun Microsystems - Beijing China 	    (uint32_t)(mpt->m_free_queue_dma_addr >> 32));
7055b504601Sjiang wu - Sun Microsystems - Beijing China 	ddi_put32(accessp, &init->ReplyFreeQueueAddress.Low,
7065b504601Sjiang wu - Sun Microsystems - Beijing China 	    (uint32_t)mpt->m_free_queue_dma_addr);
7075b504601Sjiang wu - Sun Microsystems - Beijing China 
70876a4caf6SAda 	/*
70976a4caf6SAda 	 * Fill in the timestamp with the number of milliseconds since midnight
71076a4caf6SAda 	 * of January 1, 1970 UT (Greenwich Mean Time).  Time is returned in
71176a4caf6SAda 	 * seconds and nanoseconds.  Translate both to milliseconds and add
71276a4caf6SAda 	 * them together to get total milliseconds.
71376a4caf6SAda 	 */
71476a4caf6SAda 	gethrestime(&time);
71576a4caf6SAda 	mSec = time.tv_sec * MILLISEC;
71676a4caf6SAda 	mSec += (time.tv_nsec / MICROSEC);
71776a4caf6SAda 	ddi_put32(accessp, &init->TimeStamp.High, (uint32_t)(mSec >> 32));
71876a4caf6SAda 	ddi_put32(accessp, &init->TimeStamp.Low, (uint32_t)mSec);
71976a4caf6SAda 
7205b504601Sjiang wu - Sun Microsystems - Beijing China 	numbytes = sizeof (*init);
7215b504601Sjiang wu - Sun Microsystems - Beijing China 
7225b504601Sjiang wu - Sun Microsystems - Beijing China 	/*
7235b504601Sjiang wu - Sun Microsystems - Beijing China 	 * Post message via handshake
7245b504601Sjiang wu - Sun Microsystems - Beijing China 	 */
7255b504601Sjiang wu - Sun Microsystems - Beijing China 	if (mptsas_send_handshake_msg(mpt, memp, numbytes, accessp)) {
7265b504601Sjiang wu - Sun Microsystems - Beijing China 		return (DDI_FAILURE);
7275b504601Sjiang wu - Sun Microsystems - Beijing China 	}
7285b504601Sjiang wu - Sun Microsystems - Beijing China 
7295b504601Sjiang wu - Sun Microsystems - Beijing China 	return (DDI_SUCCESS);
7305b504601Sjiang wu - Sun Microsystems - Beijing China }
7315b504601Sjiang wu - Sun Microsystems - Beijing China 
7325b504601Sjiang wu - Sun Microsystems - Beijing China static int
mptsas_do_ioc_init_reply(mptsas_t * mpt,caddr_t memp,int var,ddi_acc_handle_t accessp)7335b504601Sjiang wu - Sun Microsystems - Beijing China mptsas_do_ioc_init_reply(mptsas_t *mpt, caddr_t memp, int var,
7345ee44debSRobert Mustacchi     ddi_acc_handle_t accessp)
7355b504601Sjiang wu - Sun Microsystems - Beijing China {
7365b504601Sjiang wu - Sun Microsystems - Beijing China #ifndef __lock_lint
7375b504601Sjiang wu - Sun Microsystems - Beijing China 	_NOTE(ARGUNUSED(var))
7385b504601Sjiang wu - Sun Microsystems - Beijing China #endif
7395b504601Sjiang wu - Sun Microsystems - Beijing China 
7405b504601Sjiang wu - Sun Microsystems - Beijing China 	pMpi2IOCInitReply_t	initreply;
7415b504601Sjiang wu - Sun Microsystems - Beijing China 	int			numbytes;
7425b504601Sjiang wu - Sun Microsystems - Beijing China 	uint_t			iocstatus;
7435b504601Sjiang wu - Sun Microsystems - Beijing China 
7445b504601Sjiang wu - Sun Microsystems - Beijing China 	numbytes = sizeof (MPI2_IOC_INIT_REPLY);
7455b504601Sjiang wu - Sun Microsystems - Beijing China 	bzero(memp, numbytes);
7465b504601Sjiang wu - Sun Microsystems - Beijing China 	initreply = (void *)memp;
7475b504601Sjiang wu - Sun Microsystems - Beijing China 
7485b504601Sjiang wu - Sun Microsystems - Beijing China 	/*
7495b504601Sjiang wu - Sun Microsystems - Beijing China 	 * Get reply message via handshake
7505b504601Sjiang wu - Sun Microsystems - Beijing China 	 */
7515b504601Sjiang wu - Sun Microsystems - Beijing China 	if (mptsas_get_handshake_msg(mpt, memp, numbytes, accessp)) {
7525b504601Sjiang wu - Sun Microsystems - Beijing China 		return (DDI_FAILURE);
7535b504601Sjiang wu - Sun Microsystems - Beijing China 	}
7545b504601Sjiang wu - Sun Microsystems - Beijing China 
755e89016e7SRobert Mustacchi 	if ((iocstatus = ddi_get16(accessp, &initreply->IOCStatus)) != 0) {
7565b504601Sjiang wu - Sun Microsystems - Beijing China 		mptsas_log(mpt, CE_WARN, "mptsas_do_ioc_init_reply: "
7575b504601Sjiang wu - Sun Microsystems - Beijing China 		    "IOCStatus=0x%x, IOCLogInfo=0x%x", iocstatus,
7585b504601Sjiang wu - Sun Microsystems - Beijing China 		    ddi_get32(accessp, &initreply->IOCLogInfo));
7595b504601Sjiang wu - Sun Microsystems - Beijing China 		return (DDI_FAILURE);
7605b504601Sjiang wu - Sun Microsystems - Beijing China 	}
7615b504601Sjiang wu - Sun Microsystems - Beijing China 
7625b504601Sjiang wu - Sun Microsystems - Beijing China 	if ((ddi_get32(mpt->m_datap, &mpt->m_reg->Doorbell)) &
7635b504601Sjiang wu - Sun Microsystems - Beijing China 	    MPI2_IOC_STATE_OPERATIONAL) {
7645b504601Sjiang wu - Sun Microsystems - Beijing China 		mptsas_log(mpt, CE_NOTE,
7655b504601Sjiang wu - Sun Microsystems - Beijing China 		    "?mpt%d: IOC Operational.\n", mpt->m_instance);
7665b504601Sjiang wu - Sun Microsystems - Beijing China 	} else {
7675b504601Sjiang wu - Sun Microsystems - Beijing China 		return (DDI_FAILURE);
7685b504601Sjiang wu - Sun Microsystems - Beijing China 	}
7695b504601Sjiang wu - Sun Microsystems - Beijing China 
7705b504601Sjiang wu - Sun Microsystems - Beijing China 	return (DDI_SUCCESS);
7715b504601Sjiang wu - Sun Microsystems - Beijing China }
772