root/drivers/scsi/hosts.h

/* [previous][next][first][last][top][bottom][index][help] */

INCLUDED FROM


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

/* [previous][next][first][last][top][bottom][index][help] */