1*fcf3ce44SJohn Forte /* 2*fcf3ce44SJohn Forte * CDDL HEADER START 3*fcf3ce44SJohn Forte * 4*fcf3ce44SJohn Forte * The contents of this file are subject to the terms of the 5*fcf3ce44SJohn Forte * Common Development and Distribution License (the "License"). 6*fcf3ce44SJohn Forte * You may not use this file except in compliance with the License. 7*fcf3ce44SJohn Forte * 8*fcf3ce44SJohn Forte * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9*fcf3ce44SJohn Forte * or http://www.opensolaris.org/os/licensing. 10*fcf3ce44SJohn Forte * See the License for the specific language governing permissions 11*fcf3ce44SJohn Forte * and limitations under the License. 12*fcf3ce44SJohn Forte * 13*fcf3ce44SJohn Forte * When distributing Covered Code, include this CDDL HEADER in each 14*fcf3ce44SJohn Forte * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15*fcf3ce44SJohn Forte * If applicable, add the following below this CDDL HEADER, with the 16*fcf3ce44SJohn Forte * fields enclosed by brackets "[]" replaced with your own identifying 17*fcf3ce44SJohn Forte * information: Portions Copyright [yyyy] [name of copyright owner] 18*fcf3ce44SJohn Forte * 19*fcf3ce44SJohn Forte * CDDL HEADER END 20*fcf3ce44SJohn Forte */ 21*fcf3ce44SJohn Forte /* 22*fcf3ce44SJohn Forte * Copyright 2008 Sun Microsystems, Inc. All rights reserved. 23*fcf3ce44SJohn Forte * Use is subject to license terms. 24*fcf3ce44SJohn Forte */ 25*fcf3ce44SJohn Forte 26*fcf3ce44SJohn Forte 27*fcf3ce44SJohn Forte #include <stdio.h> 28*fcf3ce44SJohn Forte #include <stdlib.h> 29*fcf3ce44SJohn Forte #include <unistd.h> 30*fcf3ce44SJohn Forte #include <hbaapi.h> 31*fcf3ce44SJohn Forte #include <errno.h> 32*fcf3ce44SJohn Forte #include <fcntl.h> 33*fcf3ce44SJohn Forte #include <string.h> 34*fcf3ce44SJohn Forte #include <sys/fibre-channel/fcio.h> 35*fcf3ce44SJohn Forte #include <sys/fibre-channel/impl/fc_error.h> 36*fcf3ce44SJohn Forte #include <sys/scsi/adapters/scsi_vhci.h> 37*fcf3ce44SJohn Forte #include "common.h" 38*fcf3ce44SJohn Forte #include "errorcodes.h" 39*fcf3ce44SJohn Forte #include <locale.h> 40*fcf3ce44SJohn Forte 41*fcf3ce44SJohn Forte /* The i18n catalog */ 42*fcf3ce44SJohn Forte nl_catd l_catd; 43*fcf3ce44SJohn Forte 44*fcf3ce44SJohn Forte void 45*fcf3ce44SJohn Forte i18n_catopen() { 46*fcf3ce44SJohn Forte static int fileopen = 0; 47*fcf3ce44SJohn Forte 48*fcf3ce44SJohn Forte if (setlocale(LC_ALL, "") == NULL) { 49*fcf3ce44SJohn Forte (void) fprintf(stderr, 50*fcf3ce44SJohn Forte "Cannot operate in the locale requested. " 51*fcf3ce44SJohn Forte "Continuing in the default C locale\n"); 52*fcf3ce44SJohn Forte } 53*fcf3ce44SJohn Forte if (!fileopen) { 54*fcf3ce44SJohn Forte l_catd = catopen("a5k_g_fc_i18n_cat", NL_CAT_LOCALE); 55*fcf3ce44SJohn Forte if (l_catd == (nl_catd)-1) { 56*fcf3ce44SJohn Forte return; 57*fcf3ce44SJohn Forte } 58*fcf3ce44SJohn Forte fileopen = 1; 59*fcf3ce44SJohn Forte } 60*fcf3ce44SJohn Forte return; 61*fcf3ce44SJohn Forte 62*fcf3ce44SJohn Forte } 63*fcf3ce44SJohn Forte 64*fcf3ce44SJohn Forte /* 65*fcf3ce44SJohn Forte * Given an error number, this functions 66*fcf3ce44SJohn Forte * calls the get_errString() to print a 67*fcf3ce44SJohn Forte * corresponding error message to the stderr. 68*fcf3ce44SJohn Forte * get_errString() always returns an error 69*fcf3ce44SJohn Forte * message, even in case of undefined error number. 70*fcf3ce44SJohn Forte * So, there is no need to check for a NULL pointer 71*fcf3ce44SJohn Forte * while printing the error message to the stdout. 72*fcf3ce44SJohn Forte * 73*fcf3ce44SJohn Forte * RETURNS: N/A 74*fcf3ce44SJohn Forte * 75*fcf3ce44SJohn Forte */ 76*fcf3ce44SJohn Forte void 77*fcf3ce44SJohn Forte print_errString(int errnum, char *devpath) 78*fcf3ce44SJohn Forte { 79*fcf3ce44SJohn Forte 80*fcf3ce44SJohn Forte char *errStr; 81*fcf3ce44SJohn Forte 82*fcf3ce44SJohn Forte errStr = get_errString(errnum); 83*fcf3ce44SJohn Forte 84*fcf3ce44SJohn Forte if (devpath == NULL) { 85*fcf3ce44SJohn Forte (void) fprintf(stderr, 86*fcf3ce44SJohn Forte "%s \n\n", errStr); 87*fcf3ce44SJohn Forte } else { 88*fcf3ce44SJohn Forte (void) fprintf(stderr, 89*fcf3ce44SJohn Forte "%s - %s.\n\n", errStr, devpath); 90*fcf3ce44SJohn Forte } 91*fcf3ce44SJohn Forte 92*fcf3ce44SJohn Forte /* free the allocated memory for error string */ 93*fcf3ce44SJohn Forte if (errStr != NULL) 94*fcf3ce44SJohn Forte (void) free(errStr); 95*fcf3ce44SJohn Forte } 96*fcf3ce44SJohn Forte 97*fcf3ce44SJohn Forte static void terminate() { 98*fcf3ce44SJohn Forte fprintf(stdout, MSGSTR(2506, "Unsupported")); 99*fcf3ce44SJohn Forte fprintf(stdout, "\n"); 100*fcf3ce44SJohn Forte exit(1); 101*fcf3ce44SJohn Forte } 102*fcf3ce44SJohn Forte 103*fcf3ce44SJohn Forte /*ARGSUSED*/ 104*fcf3ce44SJohn Forte int adm_display_config(char **a) { 105*fcf3ce44SJohn Forte terminate(); 106*fcf3ce44SJohn Forte return (1); 107*fcf3ce44SJohn Forte } 108*fcf3ce44SJohn Forte 109*fcf3ce44SJohn Forte /*ARGSUSED*/ 110*fcf3ce44SJohn Forte void adm_download(char **a, char *b) { 111*fcf3ce44SJohn Forte terminate(); 112*fcf3ce44SJohn Forte } 113*fcf3ce44SJohn Forte 114*fcf3ce44SJohn Forte /*ARGSUSED*/ 115*fcf3ce44SJohn Forte void up_encl_name(char **a, int b) { 116*fcf3ce44SJohn Forte terminate(); 117*fcf3ce44SJohn Forte } 118*fcf3ce44SJohn Forte 119*fcf3ce44SJohn Forte void adm_failover(char **argv) { 120*fcf3ce44SJohn Forte int path_index = 0, err = 0, fd; 121*fcf3ce44SJohn Forte char path_class[MAXNAMELEN]; 122*fcf3ce44SJohn Forte char client_path[MAXPATHLEN]; 123*fcf3ce44SJohn Forte char *path_phys = NULL, *trailingMinor; 124*fcf3ce44SJohn Forte sv_switch_to_cntlr_iocdata_t iocsc; 125*fcf3ce44SJohn Forte 126*fcf3ce44SJohn Forte (void) memset(path_class, 0, sizeof (path_class)); 127*fcf3ce44SJohn Forte (void) strcpy(path_class, argv[path_index++]); 128*fcf3ce44SJohn Forte if ((strcmp(path_class, "primary") != 0) && 129*fcf3ce44SJohn Forte (strcmp(path_class, "secondary") != 0)) { 130*fcf3ce44SJohn Forte (void) fprintf(stderr, 131*fcf3ce44SJohn Forte MSGSTR(2300, "Incorrect pathclass\n")); 132*fcf3ce44SJohn Forte exit(-1); 133*fcf3ce44SJohn Forte } 134*fcf3ce44SJohn Forte 135*fcf3ce44SJohn Forte if ((fd = open("/devices/scsi_vhci:devctl", O_RDWR)) < 0) { 136*fcf3ce44SJohn Forte print_errString(L_OPEN_PATH_FAIL, "/devices/scsi_vhci:devctl"); 137*fcf3ce44SJohn Forte exit(-1); 138*fcf3ce44SJohn Forte } 139*fcf3ce44SJohn Forte 140*fcf3ce44SJohn Forte iocsc.client = client_path; 141*fcf3ce44SJohn Forte iocsc.class = path_class; 142*fcf3ce44SJohn Forte 143*fcf3ce44SJohn Forte while (argv[path_index] != NULL) { 144*fcf3ce44SJohn Forte path_phys = 145*fcf3ce44SJohn Forte get_slash_devices_from_osDevName(argv[path_index++], 146*fcf3ce44SJohn Forte STANDARD_DEVNAME_HANDLING); 147*fcf3ce44SJohn Forte if ((path_phys == NULL) || 148*fcf3ce44SJohn Forte (strstr(path_phys, "/devices/scsi_vhci") == NULL)) { 149*fcf3ce44SJohn Forte (void) fprintf(stderr, 150*fcf3ce44SJohn Forte MSGSTR(2301, "Incorrect pathname\n")); 151*fcf3ce44SJohn Forte close(fd); 152*fcf3ce44SJohn Forte exit(-1); 153*fcf3ce44SJohn Forte } 154*fcf3ce44SJohn Forte 155*fcf3ce44SJohn Forte strcpy(iocsc.client, path_phys + strlen("/devices")); 156*fcf3ce44SJohn Forte 157*fcf3ce44SJohn Forte /* Now chop off the trailing ":xxx" portion if present */ 158*fcf3ce44SJohn Forte if ((trailingMinor = strrchr(iocsc.client, ':')) != NULL) { 159*fcf3ce44SJohn Forte trailingMinor[0] = '\0'; 160*fcf3ce44SJohn Forte } 161*fcf3ce44SJohn Forte 162*fcf3ce44SJohn Forte if (ioctl(fd, SCSI_VHCI_SWITCH_TO_CNTLR, &iocsc) != 0) { 163*fcf3ce44SJohn Forte switch (errno) { 164*fcf3ce44SJohn Forte case EALREADY: 165*fcf3ce44SJohn Forte err = L_SCSI_VHCI_ALREADY_ACTIVE; 166*fcf3ce44SJohn Forte break; 167*fcf3ce44SJohn Forte case ENXIO: 168*fcf3ce44SJohn Forte err = L_INVALID_PATH; 169*fcf3ce44SJohn Forte break; 170*fcf3ce44SJohn Forte case EIO: 171*fcf3ce44SJohn Forte err = L_SCSI_VHCI_NO_STANDBY; 172*fcf3ce44SJohn Forte break; 173*fcf3ce44SJohn Forte case ENOTSUP: 174*fcf3ce44SJohn Forte err = L_SCSI_VHCI_FAILOVER_NOTSUP; 175*fcf3ce44SJohn Forte break; 176*fcf3ce44SJohn Forte case EBUSY: 177*fcf3ce44SJohn Forte err = L_SCSI_VHCI_FAILOVER_BUSY; 178*fcf3ce44SJohn Forte break; 179*fcf3ce44SJohn Forte case EFAULT: 180*fcf3ce44SJohn Forte default: 181*fcf3ce44SJohn Forte err = L_SCSI_VHCI_ERROR; 182*fcf3ce44SJohn Forte } 183*fcf3ce44SJohn Forte } 184*fcf3ce44SJohn Forte 185*fcf3ce44SJohn Forte if (err != 0) { 186*fcf3ce44SJohn Forte close(fd); 187*fcf3ce44SJohn Forte print_errString(err, path_phys); 188*fcf3ce44SJohn Forte exit(-1); 189*fcf3ce44SJohn Forte } 190*fcf3ce44SJohn Forte } 191*fcf3ce44SJohn Forte 192*fcf3ce44SJohn Forte close(fd); 193*fcf3ce44SJohn Forte } 194*fcf3ce44SJohn Forte 195*fcf3ce44SJohn Forte /*ARGSUSED*/ 196*fcf3ce44SJohn Forte int adm_inquiry(char **a) { 197*fcf3ce44SJohn Forte terminate(); 198*fcf3ce44SJohn Forte return (1); 199*fcf3ce44SJohn Forte } 200*fcf3ce44SJohn Forte 201*fcf3ce44SJohn Forte /*ARGSUSED*/ 202*fcf3ce44SJohn Forte void pho_probe() { 203*fcf3ce44SJohn Forte terminate(); 204*fcf3ce44SJohn Forte } 205*fcf3ce44SJohn Forte 206*fcf3ce44SJohn Forte /*ARGSUSED*/ 207*fcf3ce44SJohn Forte void non_encl_probe() { 208*fcf3ce44SJohn Forte terminate(); 209*fcf3ce44SJohn Forte } 210*fcf3ce44SJohn Forte 211*fcf3ce44SJohn Forte /*ARGSUSED*/ 212*fcf3ce44SJohn Forte void adm_led(char **a, int b) { 213*fcf3ce44SJohn Forte terminate(); 214*fcf3ce44SJohn Forte } 215*fcf3ce44SJohn Forte 216*fcf3ce44SJohn Forte /*ARGSUSED*/ 217*fcf3ce44SJohn Forte void up_password(char **a) { 218*fcf3ce44SJohn Forte terminate(); 219*fcf3ce44SJohn Forte } 220*fcf3ce44SJohn Forte 221*fcf3ce44SJohn Forte /*ARGSUSED*/ 222*fcf3ce44SJohn Forte int adm_reserve(char *path) { 223*fcf3ce44SJohn Forte terminate(); 224*fcf3ce44SJohn Forte return (1); 225*fcf3ce44SJohn Forte } 226*fcf3ce44SJohn Forte 227*fcf3ce44SJohn Forte /*ARGSUSED*/ 228*fcf3ce44SJohn Forte int adm_release(char *path) { 229*fcf3ce44SJohn Forte terminate(); 230*fcf3ce44SJohn Forte return (1); 231*fcf3ce44SJohn Forte } 232*fcf3ce44SJohn Forte 233*fcf3ce44SJohn Forte /*ARGSUSED*/ 234*fcf3ce44SJohn Forte int adm_start(char **a) { 235*fcf3ce44SJohn Forte terminate(); 236*fcf3ce44SJohn Forte return (1); 237*fcf3ce44SJohn Forte } 238*fcf3ce44SJohn Forte 239*fcf3ce44SJohn Forte /*ARGSUSED*/ 240*fcf3ce44SJohn Forte int adm_stop(char **a) { 241*fcf3ce44SJohn Forte terminate(); 242*fcf3ce44SJohn Forte return (1); 243*fcf3ce44SJohn Forte } 244*fcf3ce44SJohn Forte 245*fcf3ce44SJohn Forte /*ARGSUSED*/ 246*fcf3ce44SJohn Forte int adm_power_off(char **a, int b) { 247*fcf3ce44SJohn Forte terminate(); 248*fcf3ce44SJohn Forte return (1); 249*fcf3ce44SJohn Forte } 250*fcf3ce44SJohn Forte 251*fcf3ce44SJohn Forte int 252*fcf3ce44SJohn Forte adm_forcelip(char **argv) 253*fcf3ce44SJohn Forte { 254*fcf3ce44SJohn Forte int path_index = 0, fd; 255*fcf3ce44SJohn Forte uint64_t wwn; 256*fcf3ce44SJohn Forte fcio_t fcio; 257*fcf3ce44SJohn Forte HBA_HANDLE handle; 258*fcf3ce44SJohn Forte HBA_ADAPTERATTRIBUTES hbaAttrs; 259*fcf3ce44SJohn Forte HBA_PORTATTRIBUTES portAttrs; 260*fcf3ce44SJohn Forte HBA_FCPTARGETMAPPINGV2 *map; 261*fcf3ce44SJohn Forte HBA_STATUS status; 262*fcf3ce44SJohn Forte int count, adapterIndex, portIndex, mapIndex; 263*fcf3ce44SJohn Forte char name[256]; 264*fcf3ce44SJohn Forte int matched, ret = 0, wwnCompare = 0, ntries; 265*fcf3ce44SJohn Forte char *physical = NULL, *slash_OSDeviceName = NULL; 266*fcf3ce44SJohn Forte 267*fcf3ce44SJohn Forte if ((status = loadLibrary())) { 268*fcf3ce44SJohn Forte /* loadLibrary print out error msg */ 269*fcf3ce44SJohn Forte return (ret++); 270*fcf3ce44SJohn Forte } 271*fcf3ce44SJohn Forte for (path_index = 0; argv[path_index] != NULL; path_index++) { 272*fcf3ce44SJohn Forte 273*fcf3ce44SJohn Forte if (is_wwn(argv[path_index])) { 274*fcf3ce44SJohn Forte (void) sscanf(argv[path_index], "%016llx", &wwn); 275*fcf3ce44SJohn Forte wwnCompare = 1; 276*fcf3ce44SJohn Forte } else if (!is_path(argv[path_index])) { 277*fcf3ce44SJohn Forte print_errString(L_INVALID_PATH, argv[path_index]); 278*fcf3ce44SJohn Forte ret++; 279*fcf3ce44SJohn Forte continue; 280*fcf3ce44SJohn Forte } 281*fcf3ce44SJohn Forte if (!wwnCompare) { 282*fcf3ce44SJohn Forte /* Convert the paths to phsyical paths */ 283*fcf3ce44SJohn Forte physical = get_slash_devices_from_osDevName(argv[path_index], 284*fcf3ce44SJohn Forte STANDARD_DEVNAME_HANDLING); 285*fcf3ce44SJohn Forte if (!physical) { 286*fcf3ce44SJohn Forte print_errString(L_INVALID_PATH, argv[path_index]); 287*fcf3ce44SJohn Forte ret++; 288*fcf3ce44SJohn Forte continue; 289*fcf3ce44SJohn Forte } 290*fcf3ce44SJohn Forte } 291*fcf3ce44SJohn Forte 292*fcf3ce44SJohn Forte count = getNumberOfAdapters(); 293*fcf3ce44SJohn Forte 294*fcf3ce44SJohn Forte matched = 0; 295*fcf3ce44SJohn Forte for (adapterIndex = 0; adapterIndex < count; adapterIndex ++) { 296*fcf3ce44SJohn Forte status = HBA_GetAdapterName(adapterIndex, (char *)&name); 297*fcf3ce44SJohn Forte if (status != HBA_STATUS_OK) { 298*fcf3ce44SJohn Forte /* May have been DR'd */ 299*fcf3ce44SJohn Forte continue; 300*fcf3ce44SJohn Forte } 301*fcf3ce44SJohn Forte handle = HBA_OpenAdapter(name); 302*fcf3ce44SJohn Forte if (handle == 0) { 303*fcf3ce44SJohn Forte /* May have been DR'd */ 304*fcf3ce44SJohn Forte continue; 305*fcf3ce44SJohn Forte } 306*fcf3ce44SJohn Forte 307*fcf3ce44SJohn Forte if (getAdapterAttrs(handle, name, &hbaAttrs)) { 308*fcf3ce44SJohn Forte /* Should never happen */ 309*fcf3ce44SJohn Forte HBA_CloseAdapter(handle); 310*fcf3ce44SJohn Forte continue; 311*fcf3ce44SJohn Forte } 312*fcf3ce44SJohn Forte 313*fcf3ce44SJohn Forte /* Loop over all HBA Ports */ 314*fcf3ce44SJohn Forte for (portIndex = 0; portIndex < hbaAttrs.NumberOfPorts; 315*fcf3ce44SJohn Forte portIndex++) { 316*fcf3ce44SJohn Forte if (getAdapterPortAttrs(handle, name, portIndex, 317*fcf3ce44SJohn Forte &portAttrs)) { 318*fcf3ce44SJohn Forte continue; 319*fcf3ce44SJohn Forte } 320*fcf3ce44SJohn Forte 321*fcf3ce44SJohn Forte matched = 0; 322*fcf3ce44SJohn Forte if (is_wwn(argv[path_index])) { 323*fcf3ce44SJohn Forte if (wwn == wwnConversion( 324*fcf3ce44SJohn Forte portAttrs.NodeWWN.wwn) || 325*fcf3ce44SJohn Forte wwn == wwnConversion( 326*fcf3ce44SJohn Forte portAttrs.PortWWN.wwn)) { 327*fcf3ce44SJohn Forte matched = 1; 328*fcf3ce44SJohn Forte } 329*fcf3ce44SJohn Forte } else { 330*fcf3ce44SJohn Forte slash_OSDeviceName = get_slash_devices_from_osDevName( 331*fcf3ce44SJohn Forte portAttrs.OSDeviceName, STANDARD_DEVNAME_HANDLING); 332*fcf3ce44SJohn Forte if (!slash_OSDeviceName) { 333*fcf3ce44SJohn Forte continue; 334*fcf3ce44SJohn Forte } else { 335*fcf3ce44SJohn Forte if (strncmp(physical, slash_OSDeviceName, 336*fcf3ce44SJohn Forte strlen(slash_OSDeviceName) - 337*fcf3ce44SJohn Forte strlen(strrchr(slash_OSDeviceName, ':'))) 338*fcf3ce44SJohn Forte == 0) { 339*fcf3ce44SJohn Forte matched = 1; 340*fcf3ce44SJohn Forte } 341*fcf3ce44SJohn Forte free(slash_OSDeviceName); 342*fcf3ce44SJohn Forte } 343*fcf3ce44SJohn Forte } 344*fcf3ce44SJohn Forte 345*fcf3ce44SJohn Forte if (!matched) { 346*fcf3ce44SJohn Forte if (!fetch_mappings(handle, portAttrs.PortWWN, &map)) { 347*fcf3ce44SJohn Forte /* 348*fcf3ce44SJohn Forte * matchr_mapping checks the arg 349*fcf3ce44SJohn Forte * so we pass argv here. 350*fcf3ce44SJohn Forte */ 351*fcf3ce44SJohn Forte mapIndex = match_mappings(argv[path_index], map); 352*fcf3ce44SJohn Forte if (mapIndex >= 0) { 353*fcf3ce44SJohn Forte matched = 1; 354*fcf3ce44SJohn Forte } 355*fcf3ce44SJohn Forte } else { 356*fcf3ce44SJohn Forte continue; 357*fcf3ce44SJohn Forte } 358*fcf3ce44SJohn Forte } 359*fcf3ce44SJohn Forte 360*fcf3ce44SJohn Forte if (matched) { 361*fcf3ce44SJohn Forte if ((fd = open(portAttrs.OSDeviceName, 362*fcf3ce44SJohn Forte O_RDONLY | O_EXCL)) == -1) { 363*fcf3ce44SJohn Forte print_errString(L_OPEN_PATH_FAIL, 364*fcf3ce44SJohn Forte portAttrs.OSDeviceName); 365*fcf3ce44SJohn Forte return (ret++); 366*fcf3ce44SJohn Forte } 367*fcf3ce44SJohn Forte 368*fcf3ce44SJohn Forte fcio.fcio_cmd = FCIO_RESET_LINK; 369*fcf3ce44SJohn Forte fcio.fcio_xfer = FCIO_XFER_WRITE; 370*fcf3ce44SJohn Forte /* 371*fcf3ce44SJohn Forte * Reset the local loop here (fcio_ibuf = 0). 372*fcf3ce44SJohn Forte * Reset a remote loop on the Fabric by 373*fcf3ce44SJohn Forte * passing its node wwn (fcio_len = sizeof(nwwn) 374*fcf3ce44SJohn Forte * and fcio_ibuf = (caddr_t)&nwwn) to the port driver. 375*fcf3ce44SJohn Forte */ 376*fcf3ce44SJohn Forte (void) memset(&wwn, 0, sizeof (wwn)); 377*fcf3ce44SJohn Forte fcio.fcio_ilen = sizeof (wwn); 378*fcf3ce44SJohn Forte fcio.fcio_ibuf = (caddr_t)&wwn; 379*fcf3ce44SJohn Forte 380*fcf3ce44SJohn Forte for (ntries = 0; ntries < RETRY_FCIO_IOCTL; ntries++) { 381*fcf3ce44SJohn Forte errno = 0; 382*fcf3ce44SJohn Forte if (ioctl(fd, FCIO_CMD, &fcio) != 0) { 383*fcf3ce44SJohn Forte /* 384*fcf3ce44SJohn Forte * When port is offlined, qlc 385*fcf3ce44SJohn Forte * returns the FC_OFFLINE error and errno 386*fcf3ce44SJohn Forte * is set to EIO. 387*fcf3ce44SJohn Forte * We do want to ignore this error, 388*fcf3ce44SJohn Forte * especially when an enclosure is 389*fcf3ce44SJohn Forte * removed from the loop. 390*fcf3ce44SJohn Forte */ 391*fcf3ce44SJohn Forte if (fcio.fcio_errno == FC_OFFLINE) 392*fcf3ce44SJohn Forte break; 393*fcf3ce44SJohn Forte if ((errno == EAGAIN) && 394*fcf3ce44SJohn Forte (ntries+1 < RETRY_FCIO_IOCTL)) { 395*fcf3ce44SJohn Forte /* wait WAIT_FCIO_IOCTL */ 396*fcf3ce44SJohn Forte (void) usleep(WAIT_FCIO_IOCTL); 397*fcf3ce44SJohn Forte continue; 398*fcf3ce44SJohn Forte } 399*fcf3ce44SJohn Forte I_DPRINTF("FCIO ioctl failed.\n" 400*fcf3ce44SJohn Forte "Error: %s. fc_error = %d (0x%x)\n", 401*fcf3ce44SJohn Forte strerror(errno), fcio.fcio_errno, 402*fcf3ce44SJohn Forte fcio.fcio_errno); 403*fcf3ce44SJohn Forte close(fd); 404*fcf3ce44SJohn Forte print_errString(L_FCIO_FORCE_LIP_FAIL, 405*fcf3ce44SJohn Forte portAttrs.OSDeviceName); 406*fcf3ce44SJohn Forte return (ret++); 407*fcf3ce44SJohn Forte } else { 408*fcf3ce44SJohn Forte break; /* ioctl succeeds. */ 409*fcf3ce44SJohn Forte } 410*fcf3ce44SJohn Forte } 411*fcf3ce44SJohn Forte close(fd); 412*fcf3ce44SJohn Forte if (ntries == RETRY_FCIO_IOCTL) { 413*fcf3ce44SJohn Forte print_errString(L_FCIO_FORCE_LIP_FAIL, 414*fcf3ce44SJohn Forte portAttrs.OSDeviceName); 415*fcf3ce44SJohn Forte return (ret++); 416*fcf3ce44SJohn Forte } 417*fcf3ce44SJohn Forte } 418*fcf3ce44SJohn Forte if (matched) 419*fcf3ce44SJohn Forte break; /* for HBA port for loop */ 420*fcf3ce44SJohn Forte } 421*fcf3ce44SJohn Forte if (matched) /* HBA adapter for loop */ 422*fcf3ce44SJohn Forte break; 423*fcf3ce44SJohn Forte } 424*fcf3ce44SJohn Forte 425*fcf3ce44SJohn Forte if (!matched) { 426*fcf3ce44SJohn Forte print_errString(L_INVALID_PATH, argv[path_index]); 427*fcf3ce44SJohn Forte ret++; 428*fcf3ce44SJohn Forte } 429*fcf3ce44SJohn Forte } 430*fcf3ce44SJohn Forte HBA_FreeLibrary(); 431*fcf3ce44SJohn Forte return (ret); 432*fcf3ce44SJohn Forte } 433*fcf3ce44SJohn Forte 434*fcf3ce44SJohn Forte /*ARGSUSED*/ 435*fcf3ce44SJohn Forte void adm_bypass_enable(char **argv, int bypass_flag) { 436*fcf3ce44SJohn Forte terminate(); 437*fcf3ce44SJohn Forte } 438*fcf3ce44SJohn Forte 439*fcf3ce44SJohn Forte /*ARGSUSED*/ 440*fcf3ce44SJohn Forte int adm_port_offline_online(char **a, int b) { 441*fcf3ce44SJohn Forte terminate(); 442*fcf3ce44SJohn Forte return (1); 443*fcf3ce44SJohn Forte } 444*fcf3ce44SJohn Forte 445*fcf3ce44SJohn Forte /*ARGSUSED*/ 446*fcf3ce44SJohn Forte void display_link_status(char **a) { 447*fcf3ce44SJohn Forte terminate(); 448*fcf3ce44SJohn Forte } 449*fcf3ce44SJohn Forte 450*fcf3ce44SJohn Forte /*ARGSUSED*/ 451*fcf3ce44SJohn Forte void dump_map(char **argv) { 452*fcf3ce44SJohn Forte terminate(); 453*fcf3ce44SJohn Forte } 454*fcf3ce44SJohn Forte 455*fcf3ce44SJohn Forte /*ARGSUSED*/ 456*fcf3ce44SJohn Forte int adm_display_port(int a) { 457*fcf3ce44SJohn Forte terminate(); 458*fcf3ce44SJohn Forte return (1); 459*fcf3ce44SJohn Forte } 460*fcf3ce44SJohn Forte 461*fcf3ce44SJohn Forte /*ARGSUSED*/ 462*fcf3ce44SJohn Forte int adm_port_loopback(char *a, int b) { 463*fcf3ce44SJohn Forte terminate(); 464*fcf3ce44SJohn Forte return (1); 465*fcf3ce44SJohn Forte } 466*fcf3ce44SJohn Forte 467*fcf3ce44SJohn Forte /*ARGSUSED*/ 468*fcf3ce44SJohn Forte int hotplug_e(int todo, char **argv, int verbose_flag, int force_flag) { 469*fcf3ce44SJohn Forte terminate(); 470*fcf3ce44SJohn Forte return (1); 471*fcf3ce44SJohn Forte } 472*fcf3ce44SJohn Forte 473*fcf3ce44SJohn Forte /*ARGSUSED*/ 474*fcf3ce44SJohn Forte int 475*fcf3ce44SJohn Forte setboot(unsigned int yes, unsigned int verbose, char *fname) 476*fcf3ce44SJohn Forte { 477*fcf3ce44SJohn Forte terminate(); 478*fcf3ce44SJohn Forte return (1); 479*fcf3ce44SJohn Forte } 480*fcf3ce44SJohn Forte 481*fcf3ce44SJohn Forte /*ARGSUSED*/ 482*fcf3ce44SJohn Forte int hotplug(int todo, char **argv, int verbose_flag, int force_flag) { 483*fcf3ce44SJohn Forte terminate(); 484*fcf3ce44SJohn Forte return (1); 485*fcf3ce44SJohn Forte } 486*fcf3ce44SJohn Forte 487*fcf3ce44SJohn Forte /*ARGSUSED*/ 488*fcf3ce44SJohn Forte int adm_check_file(char **argv, int flag) { 489*fcf3ce44SJohn Forte terminate(); 490*fcf3ce44SJohn Forte return (1); 491*fcf3ce44SJohn Forte } 492*fcf3ce44SJohn Forte 493*fcf3ce44SJohn Forte /*ARGSUSED*/ 494*fcf3ce44SJohn Forte int sysdump(int verbose) { 495*fcf3ce44SJohn Forte terminate(); 496*fcf3ce44SJohn Forte return (1); 497*fcf3ce44SJohn Forte } 498*fcf3ce44SJohn Forte 499*fcf3ce44SJohn Forte /*ARGSUSED*/ 500*fcf3ce44SJohn Forte int fcal_update(unsigned int verbose, char *file) { 501*fcf3ce44SJohn Forte terminate(); 502*fcf3ce44SJohn Forte return (1); 503*fcf3ce44SJohn Forte } 504*fcf3ce44SJohn Forte 505*fcf3ce44SJohn Forte /*ARGSUSED*/ 506*fcf3ce44SJohn Forte int q_qlgc_update(unsigned int verbose, char *file) { 507*fcf3ce44SJohn Forte terminate(); 508*fcf3ce44SJohn Forte return (1); 509*fcf3ce44SJohn Forte } 510*fcf3ce44SJohn Forte 511*fcf3ce44SJohn Forte /*ARGSUSED*/ 512*fcf3ce44SJohn Forte int emulex_update(char *file) { 513*fcf3ce44SJohn Forte terminate(); 514*fcf3ce44SJohn Forte return (1); 515*fcf3ce44SJohn Forte } 516*fcf3ce44SJohn Forte 517*fcf3ce44SJohn Forte /*ARGSUSED*/ 518*fcf3ce44SJohn Forte int emulex_fcode_reader(int fcode_fd, char *pattern, char *pattern_value, 519*fcf3ce44SJohn Forte uint32_t pattern_value_size) { 520*fcf3ce44SJohn Forte terminate(); 521*fcf3ce44SJohn Forte return (1); 522*fcf3ce44SJohn Forte } 523*fcf3ce44SJohn Forte 524*fcf3ce44SJohn Forte /*ARGSUSED*/ 525*fcf3ce44SJohn Forte void dump(char **argv) { 526*fcf3ce44SJohn Forte terminate(); 527*fcf3ce44SJohn Forte } 528*fcf3ce44SJohn Forte 529*fcf3ce44SJohn Forte /*ARGSUSED*/ 530*fcf3ce44SJohn Forte int h_insertSena_fcdev() { 531*fcf3ce44SJohn Forte terminate(); 532*fcf3ce44SJohn Forte return (1); 533*fcf3ce44SJohn Forte } 534