⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hosts.h

📁 Linux内核源代码 为压缩文件 是<<Linux内核>>一书中的源代码
💻 H
📖 第 1 页 / 共 2 页
字号:
     * True for emulated SCSI host adapters (e.g. ATAPI)     */    unsigned emulated:1;    /*     * Name of proc directory     */    char *proc_name;} 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;    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. */    wait_queue_head_t       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;    /* These parameters should be set by the detect routine */    unsigned long 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.     */    /*     * The maximum length of SCSI commands that this host can accept.     * Probably 12 for most host adapters, but could be 16 for others.     * For drivers that don't set this field, a value of 12 is     * assumed.  I am leaving this as a number rather than a bit     * because you never know what subsequent SCSI standards might do     * (i.e. could there be a 20 byte or a 24-byte command a few years     * down the road?).       */    unsigned char max_cmd_len;    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 has requested that no further requests come through for the     * time being.     */    unsigned host_self_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;    /*     * Indicates that one or more devices on this host were starved, and     * when the device becomes less busy that we need to feed them.     */    unsigned some_device_starved: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))));};/* * These two functions are used to allocate and free a pseudo device * which will connect to the host adapter itself rather than any * physical device.  You must deallocate when you are done with the * thing.  This physical pseudo-device isn't real and won't be available * from any high-level drivers. */extern void scsi_free_host_dev(Scsi_Device * SDpnt);extern Scsi_Device * scsi_get_host_dev(struct Scsi_Host * SHpnt);extern void scsi_unblock_requests(struct Scsi_Host * SHpnt);extern void scsi_block_requests(struct Scsi_Host * SHpnt);extern void scsi_report_bus_reset(struct Scsi_Host * SHpnt, int channel);typedef struct SHN    {    struct SHN * next;    char * name;    unsigned short host_no;    unsigned short host_registered;    unsigned loaded_as_module;    } Scsi_Host_Name;	extern Scsi_Host_Name * scsi_host_no_list;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. */extern int next_scsi_host;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_register_blocked_host(struct Scsi_Host * SHpnt);extern void scsi_deregister_blocked_host(struct Scsi_Host * SHpnt);/* * Prototypes for functions/data in scsi_scan.c */extern void scan_scsis(struct Scsi_Host *shpnt,		       uint hardcoded,		       uint hchannel,		       uint hid,                       uint hlun);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 int major;    unsigned int min_major;      /* Minimum major in range. */     unsigned int max_major;      /* Maximum major in range. */    unsigned int nr_dev;	  /* Number currently attached */    unsigned int dev_noticed;	  /* Number of devices detected. */    unsigned int 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 *);    int (*init_command)(Scsi_Cmnd *);     /* Used by new queueing code.                                            Selects command for blkdevs */};void  scsi_initialize_queue(Scsi_Device * SDpnt, struct Scsi_Host * SHpnt);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 * * Note: These things are all evil and all need to go away.  My plan is to * tackle the character devices first, as there aren't any locking implications * in the block device layer.   The block devices will require more work. * * The generics driver has been updated to resize as required.  So as the tape * driver. Two down, two more to go. */#ifndef CONFIG_SD_EXTRA_DEVS#define CONFIG_SD_EXTRA_DEVS 2#endif#ifndef CONFIG_SR_EXTRA_DEVS#define CONFIG_SR_EXTRA_DEVS 2#endif#define SD_EXTRA_DEVS CONFIG_SD_EXTRA_DEVS#define SR_EXTRA_DEVS CONFIG_SR_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 + -