📄 hosts.h
字号:
/* * true if this host adapter can make good use of clustering. * I originally thought that if the tablesize was large that it * was a waste of CPU cycles to prepare a cluster list, but * it works out that the Buslogic is faster if you use a smaller * number of segments (i.e. use clustering). I guess it is * inefficient. */ unsigned use_clustering:1; /* * True if this driver uses the new error handling code. This flag is * really only temporary until all of the other drivers get converted * to use the new error handling code. */ unsigned use_new_eh_code:1; /* * True for emulated SCSI host adapters (e.g. ATAPI) */ unsigned emulated:1;} Scsi_Host_Template;/* * The scsi_hosts array is the array containing the data for all * possible <supported> scsi hosts. This is similar to the * Scsi_Host_Template, except that we have one entry for each * actual physical host adapter on the system, stored as a linked * list. Note that if there are 2 aha1542 boards, then there will * be two Scsi_Host entries, but only 1 Scsi_Host_Template entry. */struct Scsi_Host{/* private: */ /* * This information is private to the scsi mid-layer. Wrapping it in a * struct private is a way of marking it in a sort of C++ type of way. */ struct Scsi_Host * next; Scsi_Device * host_queue; /* * List of commands that have been rejected because either the host * or the device was busy. These need to be retried relatively quickly, * but we need to hold onto it for a short period until the host/device * is available. */ Scsi_Cmnd * pending_commands; struct task_struct * ehandler; /* Error recovery thread. */ struct semaphore * eh_wait; /* The error recovery thread waits on this. */ struct semaphore * eh_notify; /* wait for eh to begin */ struct semaphore * eh_action; /* Wait for specific actions on the host. */ unsigned int eh_active:1; /* Indicates the eh thread is awake and active if this is true. */ struct wait_queue * host_wait; Scsi_Host_Template * hostt; atomic_t host_active; /* commands checked out */ volatile unsigned short host_busy; /* commands actually active on low-level */ volatile unsigned short host_failed; /* commands that failed. */ /* public: */ unsigned short extra_bytes; unsigned short host_no; /* Used for IOCTL_GET_IDLUN, /proc/scsi et al. */ int resetting; /* if set, it means that last_reset is a valid value */ unsigned long last_reset; /* * These three parameters can be used to allow for wide scsi, * and for host adapters that support multiple busses * The first two should be set to 1 more than the actual max id * or lun (i.e. 8 for normal systems). */ unsigned int max_id; unsigned int max_lun; unsigned int max_channel; /* * Pointer to a circularly linked list - this indicates the hosts * that should be locked out of performing I/O while we have an active * command on this host. */ struct Scsi_Host * block; unsigned wish_block:1; /* These parameters should be set by the detect routine */ unsigned char *base; unsigned long io_port; unsigned char n_io_port; unsigned char dma_channel; unsigned int irq; /* * This is a unique identifier that must be assigned so that we * have some way of identifying each detected host adapter properly * and uniquely. For hosts that do not support more than one card * in the system at one time, this does not need to be set. It is * initialized to 0 in scsi_register. */ unsigned int unique_id; /* * The rest can be copied from the template, or specifically * initialized, as required. */ int this_id; int can_queue; short cmd_per_lun; short unsigned int sg_tablesize; unsigned in_recovery:1; unsigned unchecked_isa_dma:1; unsigned use_clustering:1; /* * True if this host was loaded as a loadable module */ unsigned loaded_as_module:1; /* * Host has rejected a command because it was busy. */ unsigned host_blocked:1; /* * Host uses correct SCSI ordering not PC ordering. The bit is * set for the minority of drivers whose authors actually read the spec ;) */ unsigned reverse_ordering:1; void (*select_queue_depths)(struct Scsi_Host *, Scsi_Device *); /* * We should ensure that this is aligned, both for better performance * and also because some compilers (m68k) don't automatically force * alignment to a long boundary. */ unsigned long hostdata[0] /* Used for storage of host specific stuff */ __attribute__ ((aligned (sizeof(unsigned long))));};extern struct Scsi_Host * scsi_hostlist;extern struct Scsi_Device_Template * scsi_devicelist;extern Scsi_Host_Template * scsi_hosts;extern void build_proc_dir_entries(Scsi_Host_Template *);/* * scsi_init initializes the scsi hosts. *//* * We use these goofy things because the MM is not set up when we init * the scsi subsystem. By using these functions we can write code that * looks normal. Also, it makes it possible to use the same code for a * loadable module. */extern void * scsi_init_malloc(unsigned int size, int priority);extern void scsi_init_free(char * ptr, unsigned int size);extern int next_scsi_host;extern int scsi_loadable_module_flag;unsigned int scsi_init(void);extern struct Scsi_Host * scsi_register(Scsi_Host_Template *, int j);extern void scsi_unregister(struct Scsi_Host * i);extern void scsi_mark_host_reset(struct Scsi_Host *Host);#define BLANK_HOST {"", 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}struct Scsi_Device_Template{ struct Scsi_Device_Template * next; const char * name; const char * tag; struct module * module; /* Used for loadable modules */ unsigned char scsi_type; unsigned char major; unsigned char nr_dev; /* Number currently attached */ unsigned char dev_noticed; /* Number of devices detected. */ unsigned char dev_max; /* Current size of arrays */ unsigned blk:1; /* 0 if character device */ int (*detect)(Scsi_Device *); /* Returns 1 if we can attach this device */ int (*init)(void); /* Sizes arrays based upon number of devices * detected */ void (*finish)(void); /* Perform initialization after attachment */ int (*attach)(Scsi_Device *); /* Attach devices to arrays */ void (*detach)(Scsi_Device *);};extern struct Scsi_Device_Template sd_template;extern struct Scsi_Device_Template st_template;extern struct Scsi_Device_Template sr_template;extern struct Scsi_Device_Template sg_template;int scsi_register_device(struct Scsi_Device_Template * sdpnt);/* These are used by loadable modules */extern int scsi_register_module(int, void *);extern void scsi_unregister_module(int, void *);/* The different types of modules that we can load and unload */#define MODULE_SCSI_HA 1#define MODULE_SCSI_CONST 2#define MODULE_SCSI_IOCTL 3#define MODULE_SCSI_DEV 4/* * This is an ugly hack. If we expect to be able to load devices at run time, * we need to leave extra room in some of the data structures. Doing a * realloc to enlarge the structures would be riddled with race conditions, * so until a better solution is discovered, we use this crude approach * * Even bigger hack for SparcSTORAGE arrays. Those are at least 6 disks, but * usually up to 30 disks, so everyone would need to change this. -jj */#ifdef CONFIG_SCSI_PLUTO_MODULE#define SD_EXTRA_DEVS 40#else#define SD_EXTRA_DEVS 4#endif#define ST_EXTRA_DEVS 2#define SR_EXTRA_DEVS 2#define SG_EXTRA_DEVS (SD_EXTRA_DEVS + SR_EXTRA_DEVS + ST_EXTRA_DEVS)#endif/* * Overrides for Emacs so that we follow Linus's tabbing style. * Emacs will notice this stuff at the end of the file and automatically * adjust the settings for this buffer only. This must remain at the end * of the file. * --------------------------------------------------------------------------- * Local variables: * c-indent-level: 4 * c-brace-imaginary-offset: 0 * c-brace-offset: -4 * c-argdecl-indent: 4 * c-label-offset: -4 * c-continued-statement-offset: 4 * c-continued-brace-offset: 0 * indent-tabs-mode: nil * tab-width: 8 * End: */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -