19e86db79SHyon Kim /*
29e86db79SHyon Kim  * CDDL HEADER START
39e86db79SHyon Kim  *
49e86db79SHyon Kim  * The contents of this file are subject to the terms of the
59e86db79SHyon Kim  * Common Development and Distribution License (the "License").
69e86db79SHyon Kim  * You may not use this file except in compliance with the License.
79e86db79SHyon Kim  *
89e86db79SHyon Kim  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
99e86db79SHyon Kim  * or http://www.opensolaris.org/os/licensing.
109e86db79SHyon Kim  * See the License for the specific language governing permissions
119e86db79SHyon Kim  * and limitations under the License.
129e86db79SHyon Kim  *
139e86db79SHyon Kim  * When distributing Covered Code, include this CDDL HEADER in each
149e86db79SHyon Kim  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
159e86db79SHyon Kim  * If applicable, add the following below this CDDL HEADER, with the
169e86db79SHyon Kim  * fields enclosed by brackets "[]" replaced with your own identifying
179e86db79SHyon Kim  * information: Portions Copyright [yyyy] [name of copyright owner]
189e86db79SHyon Kim  *
199e86db79SHyon Kim  * CDDL HEADER END
209e86db79SHyon Kim  */
219e86db79SHyon Kim 
229e86db79SHyon Kim /*
239e86db79SHyon Kim  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
249e86db79SHyon Kim  * Use is subject to license terms.
259e86db79SHyon Kim  */
269e86db79SHyon Kim 
279e86db79SHyon Kim 
289e86db79SHyon Kim #include <sun_sas.h>
299e86db79SHyon Kim 
30*c1ba8596SToomas Soome mutex_t all_hbas_lock = DEFAULTMUTEX;
31*c1ba8596SToomas Soome mutex_t open_handles_lock = DEFAULTMUTEX;
32*c1ba8596SToomas Soome HBA_UINT16 open_handle_index;
33*c1ba8596SToomas Soome HBA_UINT32 hba_count;
34*c1ba8596SToomas Soome 
359e86db79SHyon Kim /*
369e86db79SHyon Kim  * Loads the HBA Library.  Must be called before calling any HBA library
379e86db79SHyon Kim  * functions
389e86db79SHyon Kim  *
399e86db79SHyon Kim  * Return values:
409e86db79SHyon Kim  *	HBA_STATUS_OK	    library properly loaded
419e86db79SHyon Kim  *	HBA_STATUS_ERROR    library loaded incorrectly
429e86db79SHyon Kim  */
439e86db79SHyon Kim int	loadCount = 0;
Sun_sasLoadLibrary()449e86db79SHyon Kim HBA_STATUS Sun_sasLoadLibrary() {
459e86db79SHyon Kim 	const char	ROUTINE[] = "Sun_sasLoadLibrary";
469e86db79SHyon Kim 	di_node_t	root;
479e86db79SHyon Kim 	boolean_t	atLeastOneHBA = B_FALSE;
489e86db79SHyon Kim 	boolean_t	atLeastOneFailure = B_FALSE;
499e86db79SHyon Kim 	hrtime_t	    start = 0;
509e86db79SHyon Kim 	hrtime_t	    end = 0;
519e86db79SHyon Kim 	double		    duration = 0;
529e86db79SHyon Kim 
539e86db79SHyon Kim 	/* Make sure that library has not been already loaded */
549e86db79SHyon Kim 	if (loadCount++ > 0) {
559e86db79SHyon Kim 		log(LOG_DEBUG, ROUTINE, "Library already loaded %d time."
569e86db79SHyon Kim 		    " Ignoring.", loadCount);
579e86db79SHyon Kim 		return (HBA_STATUS_ERROR);
589e86db79SHyon Kim 	}
599e86db79SHyon Kim 	hba_count = 0;
609e86db79SHyon Kim 	open_handle_index = 1;
61*c1ba8596SToomas Soome 
629e86db79SHyon Kim 	/* grab write lock */
639e86db79SHyon Kim 	lock(&all_hbas_lock);
649e86db79SHyon Kim 
659e86db79SHyon Kim 	start = gethrtime();
669e86db79SHyon Kim 	if ((root = di_init("/", DINFOCACHE)) == DI_NODE_NIL) {
67*c1ba8596SToomas Soome 		log(LOG_DEBUG, ROUTINE,
68*c1ba8596SToomas Soome 		    "Unable to load device tree: \"%s\"",
69*c1ba8596SToomas Soome 		    strerror(errno));
70*c1ba8596SToomas Soome 		unlock(&all_hbas_lock);
71*c1ba8596SToomas Soome 		return (HBA_STATUS_ERROR);
729e86db79SHyon Kim 	}
739e86db79SHyon Kim 	end = gethrtime();
749e86db79SHyon Kim 	duration = end - start;
759e86db79SHyon Kim 	duration /= HR_SECOND;
769e86db79SHyon Kim 	log(LOG_DEBUG, ROUTINE, "Loading device tree init took "
779e86db79SHyon Kim 	    "%.6f seconds", duration);
789e86db79SHyon Kim 
799e86db79SHyon Kim 	/* At load time, we only gather libdevinfo information */
809e86db79SHyon Kim 	if (devtree_get_all_hbas(root) == HBA_STATUS_OK) {
81*c1ba8596SToomas Soome 		atLeastOneHBA = B_TRUE;
829e86db79SHyon Kim 	} else {
83*c1ba8596SToomas Soome 		atLeastOneFailure = B_TRUE;
849e86db79SHyon Kim 	}
859e86db79SHyon Kim 
869e86db79SHyon Kim 	di_fini(root);
879e86db79SHyon Kim 
889e86db79SHyon Kim 	unlock(&all_hbas_lock);
899e86db79SHyon Kim 
909e86db79SHyon Kim 	/* Now determine what status code to return */
919e86db79SHyon Kim 	if (atLeastOneHBA) {
92*c1ba8596SToomas Soome 		/* We've got at least one HBA and possibly some failures */
93*c1ba8596SToomas Soome 		return (HBA_STATUS_OK);
94*c1ba8596SToomas Soome 	}
95*c1ba8596SToomas Soome 	if (atLeastOneFailure) {
96*c1ba8596SToomas Soome 		/* We have no HBAs but have failures */
97*c1ba8596SToomas Soome 		return (HBA_STATUS_ERROR);
989e86db79SHyon Kim 	}
99*c1ba8596SToomas Soome 
100*c1ba8596SToomas Soome 	/* We have no HBAs and no failures */
101*c1ba8596SToomas Soome 	return (HBA_STATUS_OK);
1029e86db79SHyon Kim }
103