1 /* $NetBSD: scsipiconf.c,v 1.4 1997/10/03 02:04:20 thorpej Exp $ */ 2 3 /* 4 * Copyright (c) 1994 Charles Hannum. All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 2. Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * 3. All advertising materials mentioning features or use of this software 15 * must display the following acknowledgement: 16 * This product includes software developed by Charles Hannum. 17 * 4. The name of the author may not be used to endorse or promote products 18 * derived from this software without specific prior written permission. 19 * 20 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 21 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 22 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 23 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 24 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 25 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 29 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 */ 31 32 /* 33 * Originally written by Julian Elischer (julian@tfs.com) 34 * for TRW Financial Systems for use under the MACH(2.5) operating system. 35 * 36 * TRW Financial Systems, in accordance with their agreement with Carnegie 37 * Mellon University, makes this software available to CMU to distribute 38 * or use in any manner that they see fit as long as this message is kept with 39 * the software. For this reason TFS also grants any other persons or 40 * organisations permission to use or modify this software. 41 * 42 * TFS supplies this software to be publicly redistributed 43 * on the understanding that TFS is not responsible for the correct 44 * functioning of this software in any circumstances. 45 * 46 * Ported to run under 386BSD by Julian Elischer (julian@tfs.com) Sept 1992 47 */ 48 49 #include <sys/types.h> 50 #include <sys/param.h> 51 #include <sys/systm.h> 52 #include <sys/malloc.h> 53 #include <sys/device.h> 54 55 #include <dev/scsipi/scsipi_all.h> 56 #include <dev/scsipi/scsi_all.h> 57 #include <dev/scsipi/scsipiconf.h> 58 59 /* 60 * Return a priority based on how much of the inquiry data matches 61 * the patterns for the particular driver. 62 */ 63 caddr_t 64 scsipi_inqmatch(inqbuf, base, nmatches, matchsize, bestpriority) 65 struct scsipi_inquiry_pattern *inqbuf; 66 caddr_t base; 67 int nmatches, matchsize; 68 int *bestpriority; 69 { 70 u_int8_t type; 71 caddr_t bestmatch; 72 73 /* Include the qualifier to catch vendor-unique types. */ 74 type = inqbuf->type; 75 76 for (*bestpriority = 0, bestmatch = 0; nmatches--; base += matchsize) { 77 struct scsipi_inquiry_pattern *match = (void *)base; 78 int priority, len; 79 80 if (type != match->type) 81 continue; 82 if (inqbuf->removable != match->removable) 83 continue; 84 priority = 2; 85 len = strlen(match->vendor); 86 if (bcmp(inqbuf->vendor, match->vendor, len)) 87 continue; 88 priority += len; 89 len = strlen(match->product); 90 if (bcmp(inqbuf->product, match->product, len)) 91 continue; 92 priority += len; 93 len = strlen(match->revision); 94 if (bcmp(inqbuf->revision, match->revision, len)) 95 continue; 96 priority += len; 97 98 #ifdef SCSIDEBUG 99 printf("scsipi_inqmatch: %d/%d/%d <%s, %s, %s>\n", 100 priority, match->type, match->removable, 101 match->vendor, match->product, match->revision); 102 #endif 103 if (priority > *bestpriority) { 104 *bestpriority = priority; 105 bestmatch = base; 106 } 107 } 108 109 return (bestmatch); 110 } 111 112 char * 113 scsipi_dtype(type) 114 int type; 115 { 116 char *dtype; 117 118 switch (type) { 119 case T_DIRECT: 120 dtype = "direct"; 121 break; 122 case T_SEQUENTIAL: 123 dtype = "sequential"; 124 break; 125 case T_PRINTER: 126 dtype = "printer"; 127 break; 128 case T_PROCESSOR: 129 dtype = "processor"; 130 break; 131 case T_WORM: 132 dtype = "worm"; 133 break; 134 case T_CDROM: 135 dtype = "cdrom"; 136 break; 137 case T_SCANNER: 138 dtype = "scanner"; 139 break; 140 case T_OPTICAL: 141 dtype = "optical"; 142 break; 143 case T_CHANGER: 144 dtype = "changer"; 145 break; 146 case T_COMM: 147 dtype = "communication"; 148 break; 149 case T_IT8_1: 150 case T_IT8_2: 151 dtype = "it8"; /* ??? */ 152 break; 153 case T_STORARRAY: 154 dtype = "storage array"; 155 break; 156 case T_ENCLOSURE: 157 dtype = "enclosure services"; 158 break; 159 case T_NODEVICE: 160 panic("scsipi_dtype: impossible device type"); 161 default: 162 dtype = "unknown"; 163 break; 164 } 165 return (dtype); 166 } 167 168 void 169 scsipi_strvis(dst, src, len) 170 u_char *dst, *src; 171 int len; 172 { 173 174 /* Trim leading and trailing blanks and NULs. */ 175 while (len > 0 && (src[0] == ' ' || src[0] == '\0')) 176 ++src, --len; 177 while (len > 0 && (src[len-1] == ' ' || src[len-1] == '\0')) 178 --len; 179 180 while (len > 0) { 181 if (*src < 0x20 || *src >= 0x80) { 182 /* non-printable characters */ 183 *dst++ = '\\'; 184 *dst++ = ((*src & 0300) >> 6) + '0'; 185 *dst++ = ((*src & 0070) >> 3) + '0'; 186 *dst++ = ((*src & 0007) >> 0) + '0'; 187 } else if (*src == '\\') { 188 /* quote characters */ 189 *dst++ = '\\'; 190 *dst++ = '\\'; 191 } else { 192 /* normal characters */ 193 *dst++ = *src; 194 } 195 ++src, --len; 196 } 197 198 *dst++ = 0; 199 } 200