1 /* 2 * hosts.h Copyright (C) 1992 Drew Eckhardt 3 * Copyright (C) 1993, 1994, 1995 Eric Youngdale 4 * 5 * mid to low-level SCSI driver interface header 6 * Initial versions: Drew Eckhardt 7 * Subsequent revisions: Eric Youngdale 8 * 9 * <drew@colorado.edu> 10 * 11 * Modified by Eric Youngdale eric@aib.com to 12 * add scatter-gather, multiple outstanding request, and other 13 * enhancements. 14 * 15 * Further modified by Eric Youngdale to support multiple host adapters 16 * of the same type. 17 */ 18 19 #ifndef _HOSTS_H 20 #define _HOSTS_H 21 22 /* 23 $Header: /usr/src/linux/kernel/blk_drv/scsi/RCS/hosts.h,v 1.3 1993/09/24 12:21:00 drew Exp drew $ 24 */ 25 26 #include <linux/proc_fs.h> 27 28 /* It is senseless to set SG_ALL any higher than this - the performance 29 * does not get any better, and it wastes memory 30 */ 31 #define SG_NONE 0 32 #define SG_ALL 0xff 33 34 #define DISABLE_CLUSTERING 0 35 #define ENABLE_CLUSTERING 1 36 37 /* The various choices mean: 38 * NONE: Self evident. Host adapter is not capable of scatter-gather. 39 * ALL: Means that the host adapter module can do scatter-gather, 40 * and that there is no limit to the size of the table to which 41 * we scatter/gather data. 42 * Anything else: Indicates the maximum number of chains that can be 43 * used in one scatter-gather request. 44 */ 45 46 /* 47 * The Scsi_Host_Template type has all that is needed to interface with a SCSI 48 * host in a device independent matter. There is one entry for each different 49 * type of host adapter that is supported on the system. 50 */ 51 52 typedef struct scsi_disk Disk; 53 54 typedef struct SHT 55 { 56 57 /* Used with loadable modules so we can construct a linked list. */ 58 struct SHT * next; 59 60 /* Used with loadable modules so that we know when it is safe to unload */ 61 long * usage_count; 62 63 /* The pointer to the /proc/scsi directory entry */ 64 struct proc_dir_entry *proc_dir; 65 66 /* proc-fs info function. 67 * Can be used to export driver statistics and other infos to the world 68 * outside the kernel ie. userspace and it also provides an interface 69 * to feed the driver with information. Check eata_dma_proc.c for reference 70 */ 71 int (*proc_info)(char *, char **, off_t, int, int, int); 72 73 /* 74 * The name pointer is a pointer to the name of the SCSI 75 * device detected. 76 */ 77 const char *name; 78 79 /* 80 * The detect function shall return non zero on detection, 81 * indicating the number of host adapters of this particular 82 * type were found. It should also 83 * initialize all data necessary for this particular 84 * SCSI driver. It is passed the host number, so this host 85 * knows where the first entry is in the scsi_hosts[] array. 86 * 87 * Note that the detect routine MUST not call any of the mid level 88 * functions to queue commands because things are not guaranteed 89 * to be set up yet. The detect routine can send commands to 90 * the host adapter as long as the program control will not be 91 * passed to scsi.c in the processing of the command. Note 92 * especially that scsi_malloc/scsi_free must not be called. 93 */ 94 int (* detect)(struct SHT *); 95 96 /* Used with loadable modules to unload the host structures. Note: 97 * there is a default action built into the modules code which may 98 * be sufficient for most host adapters. Thus you may not have to supply 99 * this at all. 100 */ 101 int (*release)(struct Scsi_Host *); 102 103 /* 104 * The info function will return whatever useful 105 * information the developer sees fit. If not provided, then 106 * the name field will be used instead. 107 */ 108 const char *(* info)(struct Scsi_Host *); 109 110 /* 111 * The command function takes a target, a command (this is a SCSI 112 * command formatted as per the SCSI spec, nothing strange), a 113 * data buffer pointer, and data buffer length pointer. The return 114 * is a status int, bit fielded as follows : 115 * Byte What 116 * 0 SCSI status code 117 * 1 SCSI 1 byte message 118 * 2 host error return. 119 * 3 mid level error return 120 */ 121 int (* command)(Scsi_Cmnd *); 122 123 /* 124 * The QueueCommand function works in a similar manner 125 * to the command function. It takes an additional parameter, 126 * void (* done)(int host, int code) which is passed the host 127 * # and exit result when the command is complete. 128 * Host number is the POSITION IN THE hosts array of THIS 129 * host adapter. 130 */ 131 int (* queuecommand)(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *)); 132 133 /* 134 * Since the mid level driver handles time outs, etc, we want to 135 * be able to abort the current command. Abort returns 0 if the 136 * abortion was successful. The field SCpnt->abort reason 137 * can be filled in with the appropriate reason why we wanted 138 * the abort in the first place, and this will be used 139 * in the mid-level code instead of the host_byte(). 140 * If non-zero, the code passed to it 141 * will be used as the return code, otherwise 142 * DID_ABORT should be returned. 143 * 144 * Note that the scsi driver should "clean up" after itself, 145 * resetting the bus, etc. if necessary. 146 */ 147 int (* abort)(Scsi_Cmnd *); 148 149 /* 150 * The reset function will reset the SCSI bus. Any executing 151 * commands should fail with a DID_RESET in the host byte. 152 * The Scsi_Cmnd is passed so that the reset routine can figure 153 * out which host adapter should be reset, and also which command 154 * within the command block was responsible for the reset in 155 * the first place. Some hosts do not implement a reset function, 156 * and these hosts must call scsi_request_sense(SCpnt) to keep 157 * the command alive. 158 */ 159 int (* reset)(Scsi_Cmnd *); 160 161 /* 162 * This function is used to select synchronous communications, 163 * which will result in a higher data throughput. Not implemented 164 * yet. 165 */ 166 int (* slave_attach)(int, int); 167 168 /* 169 * This function determines the bios parameters for a given 170 * harddisk. These tend to be numbers that are made up by 171 * the host adapter. Parameters: 172 * size, device number, list (heads, sectors, cylinders) 173 */ 174 int (* bios_param)(Disk *, kdev_t, int []); 175 176 /* 177 * This determines if we will use a non-interrupt driven 178 * or an interrupt driven scheme, It is set to the maximum number 179 * of simultaneous commands a given host adapter will accept. 180 */ 181 int can_queue; 182 183 /* 184 * In many instances, especially where disconnect / reconnect are 185 * supported, our host also has an ID on the SCSI bus. If this is 186 * the case, then it must be reserved. Please set this_id to -1 if 187 * your setup is in single initiator mode, and the host lacks an 188 * ID. 189 */ 190 int this_id; 191 192 /* 193 * This determines the degree to which the host adapter is capable 194 * of scatter-gather. 195 */ 196 short unsigned int sg_tablesize; 197 198 /* 199 * True if this host adapter can make good use of linked commands. 200 * This will allow more than one command to be queued to a given 201 * unit on a given host. Set this to the maximum number of command 202 * blocks to be provided for each device. Set this to 1 for one 203 * command block per lun, 2 for two, etc. Do not set this to 0. 204 * You should make sure that the host adapter will do the right thing 205 * before you try setting this above 1. 206 */ 207 short cmd_per_lun; 208 209 /* 210 * present contains counter indicating how many boards of this 211 * type were found when we did the scan. 212 */ 213 unsigned char present; 214 215 /* 216 * true if this host adapter uses unchecked DMA onto an ISA bus. 217 */ 218 unsigned unchecked_isa_dma:1; 219 220 /* 221 * true if this host adapter can make good use of clustering. 222 * I originally thought that if the tablesize was large that it 223 * was a waste of CPU cycles to prepare a cluster list, but 224 * it works out that the Buslogic is faster if you use a smaller 225 * number of segments (i.e. use clustering). I guess it is 226 * inefficient. 227 */ 228 unsigned use_clustering:1; 229 230 } Scsi_Host_Template; 231 232 /* 233 * The scsi_hosts array is the array containing the data for all 234 * possible <supported> scsi hosts. This is similar to the 235 * Scsi_Host_Template, except that we have one entry for each 236 * actual physical host adapter on the system, stored as a linked 237 * list. Note that if there are 2 aha1542 boards, then there will 238 * be two Scsi_Host entries, but only 1 Scsi_Host_Template entries. 239 */ 240 241 struct Scsi_Host 242 { 243 struct Scsi_Host * next; 244 unsigned short extra_bytes; 245 volatile unsigned char host_busy; 246 char host_no; /* Used for IOCTL_GET_IDLUN, /proc/scsi et al. */ 247 int last_reset; 248 struct wait_queue *host_wait; 249 Scsi_Cmnd *host_queue; 250 Scsi_Host_Template * hostt; 251 252 /* 253 * These three parameters can be used to allow for wide scsi, 254 * and for host adapters that support multiple busses 255 * The first two should be set to 1 more than the actual max id 256 * or lun (i.e. 8 for normal systems). 257 */ 258 unsigned int max_id; 259 unsigned int max_lun; 260 unsigned int max_channel; 261 262 /* 263 * Pointer to a circularly linked list - this indicates the hosts 264 * that should be locked out of performing I/O while we have an active 265 * command on this host. 266 */ 267 struct Scsi_Host * block; 268 unsigned wish_block:1; 269 270 /* These parameters should be set by the detect routine */ 271 unsigned char *base; 272 unsigned int io_port; 273 unsigned char n_io_port; 274 unsigned char irq; 275 unsigned char dma_channel; 276 277 /* 278 * This is a unique identifier that must be assigned so that we 279 * have some way of identifying each detected host adapter properly 280 * and uniquely. For hosts that do not support more than one card 281 * in the system at one time, this does not need to be set. It is 282 * initialized to 0 in scsi_register. 283 */ 284 unsigned int unique_id; 285 286 /* 287 * Set these if there are conflicts between memory 288 * in the < 1mb region and regions at 16mb multiples. 289 * The address must be on a page boundary. 290 */ 291 unsigned long forbidden_addr; 292 unsigned long forbidden_size; 293 294 /* 295 * The rest can be copied from the template, or specifically 296 * initialized, as required. 297 */ 298 299 int this_id; 300 int can_queue; 301 short cmd_per_lun; 302 short unsigned int sg_tablesize; 303 unsigned unchecked_isa_dma:1; 304 unsigned use_clustering:1; 305 /* 306 * True if this host was loaded as a loadable module 307 */ 308 unsigned loaded_as_module:1; 309 310 /* 311 * True when we call the low-level reset function, and 312 * the midlevel code suggests a full bus reset. 313 */ 314 unsigned suggest_bus_reset:1; 315 316 int hostdata[0]; /* Used for storage of host specific stuff */ 317 }; 318 319 extern struct Scsi_Host * scsi_hostlist; 320 extern struct Scsi_Device_Template * scsi_devicelist; 321 322 extern Scsi_Host_Template * scsi_hosts; 323 324 extern void build_proc_dir_entries(Scsi_Host_Template *); 325 326 327 /* 328 * scsi_init initializes the scsi hosts. 329 */ 330 331 /* 332 * We use these goofy things because the MM is not set up when we init 333 * the scsi subsystem. By using these functions we can write code that 334 * looks normal. Also, it makes it possible to use the same code for a 335 * loadable module. 336 */ 337 338 extern void * scsi_init_malloc(unsigned int size, int priority); 339 extern void scsi_init_free(char * ptr, unsigned int size); 340 341 extern int next_scsi_host; 342 343 extern int scsi_loadable_module_flag; 344 unsigned int scsi_init(void); 345 extern struct Scsi_Host * scsi_register(Scsi_Host_Template *, int j); 346 extern void scsi_unregister(struct Scsi_Host * i); 347 348 #define BLANK_HOST {"", 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} 349 350 struct Scsi_Device_Template 351 { 352 struct Scsi_Device_Template * next; 353 const char * name; 354 const char * tag; 355 long * usage_count; /* Used for loadable modules */ 356 unsigned char scsi_type; 357 unsigned char major; 358 unsigned char nr_dev; /* Number currently attached */ 359 unsigned char dev_noticed; /* Number of devices detected. */ 360 unsigned char dev_max; /* Current size of arrays */ 361 unsigned blk:1; /* 0 if character device */ 362 int (*detect)(Scsi_Device *); /* Returns 1 if we can attach this device */ 363 int (*init)(void); /* Sizes arrays based upon number of devices 364 * detected */ 365 void (*finish)(void); /* Perform initialization after attachment */ 366 int (*attach)(Scsi_Device *); /* Attach devices to arrays */ 367 void (*detach)(Scsi_Device *); 368 }; 369 370 extern struct Scsi_Device_Template sd_template; 371 extern struct Scsi_Device_Template st_template; 372 extern struct Scsi_Device_Template sr_template; 373 extern struct Scsi_Device_Template sg_template; 374 375 int scsi_register_device(struct Scsi_Device_Template * sdpnt); 376 377 /* These are used by loadable modules */ 378 extern int scsi_register_module(int, void *); 379 extern void scsi_unregister_module(int, void *); 380 381 /* The different types of modules that we can load and unload */ 382 #define MODULE_SCSI_HA 1 383 #define MODULE_SCSI_CONST 2 384 #define MODULE_SCSI_IOCTL 3 385 #define MODULE_SCSI_DEV 4 386 387 388 /* 389 * This is an ugly hack. If we expect to be able to load devices at run time, 390 * we need to leave extra room in some of the data structures. Doing a 391 * realloc to enlarge the structures would be riddled with race conditions, 392 * so until a better solution is discovered, we use this crude approach 393 */ 394 #define SD_EXTRA_DEVS 2 395 #define ST_EXTRA_DEVS 2 396 #define SR_EXTRA_DEVS 2 397 #define SG_EXTRA_DEVS (SD_EXTRA_DEVS + SR_EXTRA_DEVS + ST_EXTRA_DEVS) 398 399 #endif 400 /* 401 * Overrides for Emacs so that we follow Linus's tabbing style. 402 * Emacs will notice this stuff at the end of the file and automatically 403 * adjust the settings for this buffer only. This must remain at the end 404 * of the file. 405 * --------------------------------------------------------------------------- 406 * Local variables: 407 * c-indent-level: 4 408 * c-brace-imaginary-offset: 0 409 * c-brace-offset: -4 410 * c-argdecl-indent: 4 411 * c-label-offset: -4 412 * c-continued-statement-offset: 4 413 * c-continued-brace-offset: 0 414 * indent-tabs-mode: nil 415 * tab-width: 8 416 * End: 417 */