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  *          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  */

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