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