scsi_host.h

来自「Linux Kernel 2.6.9 for OMAP1710」· C头文件 代码 · 共 570 行 · 第 1/2 页

H
570
字号
#ifndef _SCSI_SCSI_HOST_H#define _SCSI_SCSI_HOST_H#include <linux/device.h>#include <linux/list.h>#include <linux/types.h>struct block_device;struct module;struct scsi_cmnd;struct scsi_device;struct Scsi_Host;struct scsi_host_cmd_pool;struct scsi_transport_template;/* * The various choices mean: * NONE: Self evident.	Host adapter is not capable of scatter-gather. * ALL:	 Means that the host adapter module can do scatter-gather, *	 and that there is no limit to the size of the table to which *	 we scatter/gather data. * Anything else:  Indicates the maximum number of chains that can be *	 used in one scatter-gather request. */#define SG_NONE 0#define SG_ALL 0xff#define DISABLE_CLUSTERING 0#define ENABLE_CLUSTERING 1enum scsi_eh_timer_return {	EH_NOT_HANDLED,	EH_HANDLED,	EH_RESET_TIMER,};struct scsi_host_template {	struct module *module;	const char *name;	/*	 * Used to initialize old-style drivers.  For new-style drivers	 * just perform all work in your module initialization function.	 *	 * Status:  OBSOLETE	 */	int (* detect)(struct scsi_host_template *);	/*	 * Used as unload callback for hosts with old-style drivers.	 *	 * Status: OBSOLETE	 */	int (* release)(struct Scsi_Host *);	/*	 * The info function will return whatever useful information the	 * developer sees fit.  If not provided, then the name field will	 * be used instead.	 *	 * Status: OPTIONAL	 */	const char *(* info)(struct Scsi_Host *);	/*	 * Ioctl interface	 *	 * Status: OPTIONAL	 */	int (* ioctl)(struct scsi_device *dev, int cmd, void __user *arg);		/*	 * The queuecommand function is used to queue up a scsi	 * command block to the LLDD.  When the driver finished	 * processing the command the done callback is invoked.	 *	 * If queuecommand returns 0, then the HBA has accepted the	 * command.  The done() function must be called on the command	 * when the driver has finished with it. (you may call done on the	 * command before queuecommand returns, but in this case you	 * *must* return 0 from queuecommand).	 *	 * Queuecommand may also reject the command, in which case it may	 * not touch the command and must not call done() for it.	 *	 * There are two possible rejection returns:	 *	 *   SCSI_MLQUEUE_DEVICE_BUSY: Block this device temporarily, but	 *   allow commands to other devices serviced by this host.	 *	 *   SCSI_MLQUEUE_HOST_BUSY: Block all devices served by this	 *   host temporarily.	 *         * For compatibility, any other non-zero return is treated the         * same as SCSI_MLQUEUE_HOST_BUSY.	 *	 * NOTE: "temporarily" means either until the next command for#	 * this device/host completes, or a period of time determined by	 * I/O pressure in the system if there are no other outstanding	 * commands.	 *	 * STATUS: REQUIRED	 */	int (* queuecommand)(struct scsi_cmnd *,			     void (*done)(struct scsi_cmnd *));	/*	 * This is an error handling strategy routine.  You don't need to	 * define one of these if you don't want to - there is a default	 * routine that is present that should work in most cases.  For those	 * driver authors that have the inclination and ability to write their	 * own strategy routine, this is where it is specified.  Note - the	 * strategy routine is *ALWAYS* run in the context of the kernel eh	 * thread.  Thus you are guaranteed to *NOT* be in an interrupt	 * handler when you execute this, and you are also guaranteed to	 * *NOT* have any other commands being queued while you are in the	 * strategy routine. When you return from this function, operations	 * return to normal.	 *	 * See scsi_error.c scsi_unjam_host for additional comments about	 * what this function should and should not be attempting to do.	 *	 * Status: REQUIRED	(at least one of them)	 */	int (* eh_strategy_handler)(struct Scsi_Host *);	int (* eh_abort_handler)(struct scsi_cmnd *);	int (* eh_device_reset_handler)(struct scsi_cmnd *);	int (* eh_bus_reset_handler)(struct scsi_cmnd *);	int (* eh_host_reset_handler)(struct scsi_cmnd *);	/*	 * This is an optional routine to notify the host that the scsi	 * timer just fired.  The returns tell the timer routine what to	 * do about this:	 *	 * EH_HANDLED:		I fixed the error, please complete the command	 * EH_RESET_TIMER:	I need more time, reset the timer and	 *			begin counting again	 * EH_NOT_HANDLED	Begin normal error recovery	 *	 * Status: OPTIONAL	 */	enum scsi_eh_timer_return (* eh_timed_out)(struct scsi_cmnd *);	/*	 * Old EH handlers, no longer used. Make them warn the user of old	 * drivers by using a wrong type	 *	 * Status: MORE THAN OBSOLETE	 */	int (* abort)(int);	int (* reset)(int, int);	/*	 * Before the mid layer attempts to scan for a new device where none	 * currently exists, it will call this entry in your driver.  Should	 * your driver need to allocate any structs or perform any other init	 * items in order to send commands to a currently unused target/lun	 * combo, then this is where you can perform those allocations.  This	 * is specifically so that drivers won't have to perform any kind of	 * "is this a new device" checks in their queuecommand routine,	 * thereby making the hot path a bit quicker.	 *	 * Return values: 0 on success, non-0 on failure	 *	 * Deallocation:  If we didn't find any devices at this ID, you will	 * get an immediate call to slave_destroy().  If we find something	 * here then you will get a call to slave_configure(), then the	 * device will be used for however long it is kept around, then when	 * the device is removed from the system (or * possibly at reboot	 * time), you will then get a call to slave_destroy().  This is	 * assuming you implement slave_configure and slave_destroy.	 * However, if you allocate memory and hang it off the device struct,	 * then you must implement the slave_destroy() routine at a minimum	 * in order to avoid leaking memory	 * each time a device is tore down.	 *	 * Status: OPTIONAL	 */	int (* slave_alloc)(struct scsi_device *);	/*	 * Once the device has responded to an INQUIRY and we know the	 * device is online, we call into the low level driver with the	 * struct scsi_device *.  If the low level device driver implements	 * this function, it *must* perform the task of setting the queue	 * depth on the device.  All other tasks are optional and depend	 * on what the driver supports and various implementation details.	 * 	 * Things currently recommended to be handled at this time include:	 *	 * 1.  Setting the device queue depth.  Proper setting of this is	 *     described in the comments for scsi_adjust_queue_depth.	 * 2.  Determining if the device supports the various synchronous	 *     negotiation protocols.  The device struct will already have	 *     responded to INQUIRY and the results of the standard items	 *     will have been shoved into the various device flag bits, eg.	 *     device->sdtr will be true if the device supports SDTR messages.	 * 3.  Allocating command structs that the device will need.	 * 4.  Setting the default timeout on this device (if needed).	 * 5.  Anything else the low level driver might want to do on a device	 *     specific setup basis...	 * 6.  Return 0 on success, non-0 on error.  The device will be marked	 *     as offline on error so that no access will occur.  If you return	 *     non-0, your slave_destroy routine will never get called for this	 *     device, so don't leave any loose memory hanging around, clean	 *     up after yourself before returning non-0	 *	 * Status: OPTIONAL	 */	int (* slave_configure)(struct scsi_device *);	/*	 * Immediately prior to deallocating the device and after all activity	 * has ceased the mid layer calls this point so that the low level	 * driver may completely detach itself from the scsi device and vice	 * versa.  The low level driver is responsible for freeing any memory	 * it allocated in the slave_alloc or slave_configure calls. 	 *	 * Status: OPTIONAL	 */	void (* slave_destroy)(struct scsi_device *);	/*	 * This function determines the bios parameters for a given	 * harddisk.  These tend to be numbers that are made up by	 * the host adapter.  Parameters:	 * size, device, list (heads, sectors, cylinders)	 *	 * Status: OPTIONAL	 */	int (* bios_param)(struct scsi_device *, struct block_device *,			sector_t, int []);	/*	 * Can be used to export driver statistics and other infos to the	 * world outside the kernel ie. userspace and it also provides an	 * interface to feed the driver with information.	 *	 * Status: OBSOLETE	 */	int (*proc_info)(struct Scsi_Host *, char *, char **, off_t, int, int);	/*	 * Name of proc directory	 */	char *proc_name;	/*	 * Used to store the procfs directory if a driver implements the	 * proc_info method.	 */	struct proc_dir_entry *proc_dir;	/*	 * This determines if we will use a non-interrupt driven	 * or an interrupt driven scheme,  It is set to the maximum number	 * of simultaneous commands a given host adapter will accept.	 */	int can_queue;	/*	 * In many instances, especially where disconnect / reconnect are	 * supported, our host also has an ID on the SCSI bus.  If this is	 * the case, then it must be reserved.  Please set this_id to -1 if	 * your setup is in single initiator mode, and the host lacks an	 * ID.	 */	int this_id;	/*	 * This determines the degree to which the host adapter is capable	 * of scatter-gather.	 */	unsigned short sg_tablesize;	/*	 * If the host adapter has limitations beside segment count	 */	unsigned short max_sectors;	/*

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?