1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 22 /* 23 * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 24 * Use is subject to license terms. 25 */ 26 27 #include <sun_sas.h> 28 #include <signal.h> 29 30 /* 31 * Verify that a given adapter is present on the system. 32 * No checks will be performed on the targets, and it is assumed 33 * that an adapter can't change the number of ports it has. 34 */ 35 HBA_STATUS 36 verifyAdapter(struct sun_sas_hba *hba_ptr) { 37 const char ROUTINE[] = "verifyAdapter"; 38 char *charptr, path[MAXPATHLEN+1]; 39 di_node_t node; 40 uint_t state; 41 42 /* 43 * valid test for a removed HBA. 44 */ 45 if (hba_ptr == NULL) { 46 log(LOG_DEBUG, ROUTINE, "Null hba_ptr argument"); 47 return (HBA_STATUS_ERROR); 48 } 49 (void) strlcpy(path, hba_ptr->device_path, sizeof (path)); 50 51 charptr = strrchr(path, ':'); 52 if (charptr) { 53 *charptr = '\0'; 54 } 55 56 errno = 0; 57 58 node = di_init(path, DINFOCPYALL); 59 if (node == DI_NODE_NIL) { 60 log(LOG_DEBUG, ROUTINE, 61 "Unable to take devinfo snapshot on HBA \"%s\" due to %s", 62 path, strerror(errno)); 63 return (HBA_STATUS_ERROR); 64 } else { 65 state = di_state(node); 66 if (((state & DI_DRIVER_DETACHED) == DI_DRIVER_DETACHED) || 67 ((state & DI_BUS_DOWN) == DI_BUS_DOWN) || 68 ((state & DI_BUS_QUIESCED) == DI_BUS_QUIESCED)) { 69 di_fini(node); 70 log(LOG_DEBUG, ROUTINE, 71 "devinfo node is not online state: %d", state); 72 return (HBA_STATUS_ERROR); 73 } 74 } 75 76 di_fini(node); 77 78 return (HBA_STATUS_OK); 79 } 80