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 * Copyright 2008 Sun Microsystems, Inc. All rights reserved. 23 * Use is subject to license terms. 24 */ 25 26 #ifndef _CFGA_USB_H 27 #define _CFGA_USB_H 28 29 30 #ifdef __cplusplus 31 extern "C" { 32 #endif 33 34 #include <stdlib.h> 35 #include <strings.h> 36 #include <fcntl.h> 37 #include <ctype.h> 38 #include <unistd.h> 39 #include <libintl.h> 40 #include <libdevice.h> 41 #include <sys/varargs.h> 42 #include <sys/usb/usba.h> 43 #include <sys/usb/hubd/hub.h> 44 #include <sys/usb/hubd/hubd_impl.h> 45 #include <libdevinfo.h> 46 #include <libdevice.h> 47 #include <librcm.h> 48 #include <synch.h> 49 #include <thread.h> 50 #include <assert.h> 51 52 #define CFGA_PLUGIN_LIB 53 #include <config_admin.h> 54 55 56 /* 57 * Debug stuff. 58 */ 59 #ifdef DEBUG 60 #define DPRINTF (void) printf 61 #else 62 #define DPRINTF 0 && 63 #endif /* DEBUG */ 64 65 66 /* for walking links */ 67 typedef struct walk_link { 68 char *path; 69 char len; 70 char **linkpp; 71 } walk_link_t; 72 73 74 /* 75 * Stuff carried over for the routines borrowed from cfgadm/SCSI. 76 */ 77 typedef enum { 78 UCFGA_TERMINATE = 0, 79 UCFGA_CONTINUE 80 } ucfga_recur_t; 81 82 /* Structures for tree walking code */ 83 typedef struct { 84 char *phys; 85 char *log; 86 int ret; 87 int match_minor; 88 int l_errno; 89 } pathm_t; 90 91 92 #define MATCH_MINOR_NAME 1 93 #define S_FREE(x) (((x) != NULL) ? (free(x), (x) = NULL) : (void *)0) 94 #define GET_DYN(a) (((a) != NULL) ? strstr((a), DYN_SEP) : (void *)0) 95 96 97 /* Location of USB configuration file */ 98 #define USBCONF_FILE "/etc/usb/config_map.conf" 99 100 /* Hardware options */ 101 #define OPT_DISABLE_RCM "disable_rcm" 102 #define FLAG_DISABLE_RCM 0x00000001 /* flags */ 103 104 /* Return/error codes */ 105 typedef enum { 106 UCFGA_ERR = -2, 107 UCFGA_LIB_ERR, 108 UCFGA_OK, 109 UCFGA_BUSY, 110 UCFGA_NO_REC 111 } ucfga_ret_t; 112 113 114 115 /* Messages */ 116 117 typedef struct { 118 int intl; /* Flag: if 1, internationalize */ 119 cfga_err_t cfga_err; /* Error code libcfgadm understands */ 120 const char *msgstr; 121 } msgcvt_t; 122 #define NO_CVT 0 123 #define CVT 1 124 125 #define MSG_TBL_SZ(table) (sizeof ((table)) / sizeof (msgcvt_t)) 126 127 128 /* Error message ids (and indices into usb_error_msgs) */ 129 typedef enum { 130 131 CFGA_USB_OK = 0, 132 CFGA_USB_UNKNOWN, 133 CFGA_USB_INTERNAL_ERROR, 134 CFGA_USB_OPTIONS, 135 CFGA_USB_DYNAMIC_AP, 136 CFGA_USB_AP, 137 CFGA_USB_PORT, 138 CFGA_USB_DEVCTL, 139 CFGA_USB_NOT_CONNECTED, 140 CFGA_USB_NOT_CONFIGURED, 141 CFGA_USB_ALREADY_CONNECTED, 142 CFGA_USB_ALREADY_CONFIGURED, 143 CFGA_USB_OPEN, 144 CFGA_USB_IOCTL, 145 CFGA_USB_BUSY, 146 CFGA_USB_ALLOC_FAIL, 147 CFGA_USB_OPNOTSUPP, 148 CFGA_USB_DEVLINK, 149 CFGA_USB_STATE, 150 CFGA_USB_CONFIG_INVAL, 151 CFGA_USB_PRIV, 152 CFGA_USB_NVLIST, 153 CFGA_USB_ZEROLEN, 154 CFGA_USB_CONFIG_FILE, 155 CFGA_USB_LOCK_FILE, 156 CFGA_USB_UNLOCK_FILE, 157 CFGA_USB_ONE_CONFIG, 158 159 /* RCM Errors */ 160 CFGA_USB_RCM_HANDLE, 161 CFGA_USB_RCM_ONLINE, 162 CFGA_USB_RCM_OFFLINE, 163 CFGA_USB_RCM_INFO 164 165 } cfga_usb_ret_t; 166 167 168 /* 169 * Given an error msg index, look up the associated string, and 170 * convert it to the current locale if required. 171 */ 172 #define ERR_STR(msg_idx) \ 173 (get_msg((msg_idx), usb_error_msgs, MSG_TBL_SZ(usb_error_msgs))) 174 175 176 /* Misc text strings */ 177 #define CFGA_DEV_DIR "/dev/cfg" 178 #define DYN_SEP "::" 179 #define MINOR_SEP ":" 180 #define PORT "port" 181 #define PORT_SEPERATOR "." 182 #define USB "usb" 183 #define USB_CFGADM_DEFAULT_AP_TYPE "unknown" 184 185 /* these set of defines are -lav listing */ 186 #define USB_UNDEF_STR "<undef>" 187 #define USB_NO_CFG_STR "<no cfg str descr>" 188 189 /* -x commands */ 190 #define RESET_DEVICE "usb_reset" /* with -x option */ 191 #define USB_CONFIG "usb_config" /* with -x option */ 192 #define SET_CONFIG "config=" /* with -o option */ 193 #define SET_DRIVER "drv=" /* with -op option */ 194 195 /* for confirm operation */ 196 #define USB_CONFIRM_0 "the device: " 197 #define USB_CONFIRM_1 \ 198 "This operation will suspend activity on the USB device\nContinue" 199 200 /* Prototypes */ 201 extern int add_entry(char *, int, int, int, char *, char *, char *, 202 char **); 203 extern cfga_usb_ret_t do_control_ioctl(const char *, uint_t, uint_t, 204 void **, size_t *); 205 206 207 #ifdef __cplusplus 208 } 209 #endif 210 211 #endif /* _CFGA_USB_H */ 212