7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * CDDL HEADER START
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * The contents of this file are subject to the terms of the
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * Common Development and Distribution License (the "License").
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * You may not use this file except in compliance with the License.
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * See the License for the specific language governing permissions
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * and limitations under the License.
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * When distributing Covered Code, include this CDDL HEADER in each
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * If applicable, add the following below this CDDL HEADER, with the
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * fields enclosed by brackets "[]" replaced with your own identifying
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * information: Portions Copyright [yyyy] [name of copyright owner]
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * CDDL HEADER END
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * Use is subject to license terms.
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * creates a handle each time Sun_sas_OpenAdapter() is called.
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * a open_handle_struct was created to keep track of which handles are currently
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * open. This prevents a user from using an old handle that corresponds to
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * an hba that has already been closed.
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek "an error as occurred. global_hba_head is "
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek "NULL. Library may not be loaded yet.");
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek while (RetrieveIndex(open_handle_index) != -1) {
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * If open_handle_index wraps back to zero again,
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * that means all handles are currently in use.
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * Spec only allows for 16 bits of handles
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek "Max number of handles reached.");
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek if ((new_open_handle = (struct open_handle *)calloc(1,
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek (void) memset(new_open_handle, 0, sizeof (struct open_handle));
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek /* add new open handle struct to the open_handles list */
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek global_hba_head->open_handles = new_open_handle;
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek new_open_handle->next = global_hba_head->open_handles;
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek global_hba_head->open_handles = new_open_handle;
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * given a handle, returns the adapterIndex number.
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * This functions checkes to see if the given handle corresponds to an open
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * HBA. If it does, the adapterIndex is returned.
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * Given a handle, returns the open_handle structure
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * The routine assumes that the open_handles_lock has already
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * been taken.
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek log(LOG_DEBUG, ROUTINE, "No adapter is found.");
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek for (open_handle_ptr = global_hba_head->open_handles;
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * Given an adapterIndex, this functions returns a pointer to the handle
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * structure. This handle structure holds the hba's information
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * Caller must take all_hbas_lock first.
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek for (hba_ptr = global_hba_head; hba_ptr != NULL;
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * Given an adapterIndex, this functions returns a pointer to the handle
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * structure and extracts it from the global list.
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * all_hbas_lock must be taken already.
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek /* Hmm, must be the head of the list. */
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * Given an handle, this functions returns a pointer to the handle structure
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * for that hba
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * Caller must take all_hbas_lock first.
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek const char ROUTINE[] = "Retrieve_Sun_sasHandle";
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek /* Retrieve fp device path from handle */
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek "handle could not be found.");
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek "could not find index in the handle list.");
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * Take a mutex lock. The routine will try, and if it fails,
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * it will loop for a while and retry. If it fails many times,
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * it will start writing to the log file.
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek "Lock busy, possible deadlock:0x%x",
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek "Lock failed: owner dead 0x%x",
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek "Lock failed: unmapped 0x%x",
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek "Lock failed: %s 0x%x",
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * Unlock a mutex lock.
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * Get the Port WWN of the first adapter port. This routine
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * is used by the old V1 interfaces so that they can call
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * the new V2 interfaces and exhibit the same behavior.
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * In the event of error the WWN will be zero.
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * This function will transition to PAA state but it will not
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek * verfiy whether data is stale or not
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek const char ROUTINE[] = "getFirstAdapterPortWWN";
return (pwwn);
return (pwwn);
return (tmp);
errno = 0;
return (HBA_STATUS_ERROR);
return (ret);
return (HBA_STATUS_OK);
return (HBA_STATUS_OK);
return (HBA_STATUS_ERROR);