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

📄 ide.h

📁 GNU Mach 微内核源代码, 基于美国卡内基美隆大学的 Mach 研究项目
💻 H
📖 第 1 页 / 共 2 页
字号:
#ifdef CONFIG_BLK_DEV_IDETAPE	idetape_tape_t	tape;		/* for ide-tape.c */#endif /* CONFIG_BLK_DEV_IDETAPE */#ifdef CONFIG_BLK_DEV_IDEFLOPPY	void *floppy;			/* for ide-floppy.c */#endif /* CONFIG_BLK_DEV_IDEFLOPPY */#ifdef CONFIG_BLK_DEV_IDESCSI	void *scsi;			/* for ide-scsi.c */#endif /* CONFIG_BLK_DEV_IDESCSI */	byte		ide_scsi;	/* use ide-scsi driver */	} ide_drive_t;/* * An ide_dmaproc_t() initiates/aborts DMA read/write operations on a drive. * * The caller is assumed to have selected the drive and programmed the drive's * sector address using CHS or LBA.  All that remains is to prepare for DMA * and then issue the actual read/write DMA/PIO command to the drive. * * Returns 0 if all went well. * Returns 1 if DMA read/write could not be started, in which case the caller * should either try again later, or revert to PIO for the current request. */typedef enum {	ide_dma_read = 0,	ide_dma_write = 1,		ide_dma_abort = 2,	ide_dma_check = 3,		ide_dma_status_bad = 4,	ide_dma_transferred = 5,		ide_dma_begin = 6 }	ide_dma_action_t;typedef int (ide_dmaproc_t)(ide_dma_action_t, ide_drive_t *);/* * An ide_tuneproc_t() is used to set the speed of an IDE interface * to a particular PIO mode.  The "byte" parameter is used * to select the PIO mode by number (0,1,2,3,4,5), and a value of 255 * indicates that the interface driver should "auto-tune" the PIO mode * according to the drive capabilities in drive->id; * * Not all interface types support tuning, and not all of those * support all possible PIO settings.  They may silently ignore * or round values as they see fit. */typedef void (ide_tuneproc_t)(ide_drive_t *, byte);/* * This is used to provide HT6560B & PROMISE interface support. */typedef void (ide_selectproc_t) (ide_drive_t *);/* * hwif_chipset_t is used to keep track of the specific hardware * chipset used by each IDE interface, if known. */typedef enum {	ide_unknown,	ide_generic,	ide_triton,		ide_cmd640,	ide_dtc2278,	ide_ali14xx,		ide_qd6580,	ide_umc8672,	ide_ht6560b,		ide_promise,	ide_promise_udma }	hwif_chipset_t;typedef struct hwif_s {	struct hwif_s	*next;		/* for linked-list in ide_hwgroup_t */	void		*hwgroup;	/* actually (ide_hwgroup_t *) */	unsigned short	io_base;	/* base io port addr */	unsigned short	ctl_port;	/* usually io_base+0x206 */	ide_drive_t	drives[MAX_DRIVES];	/* drive info */	struct gendisk	*gd;		/* gendisk structure */	ide_tuneproc_t	*tuneproc;	/* routine to tune PIO mode for drives */#if defined(CONFIG_BLK_DEV_HT6560B) || defined(CONFIG_BLK_DEV_PROMISE)	ide_selectproc_t *selectproc;	/* tweaks hardware to select drive */#endif	ide_dmaproc_t	*dmaproc;	/* dma read/write/abort routine */	unsigned long	*dmatable;	/* dma physical region descriptor table */	unsigned short	dma_base;	/* base addr for dma ports (triton) */	byte		irq;		/* our irq number */	byte		major;		/* our major number */	char 		name[5];	/* name of interface, eg. "ide0" */	byte		index;		/* 0 for ide0; 1 for ide1; ... */	hwif_chipset_t	chipset;	/* sub-module for tuning.. */	unsigned	noprobe    : 1;	/* don't probe for this interface */	unsigned	present    : 1;	/* this interface exists */	unsigned	serialized : 1;	/* serialized operation with mate hwif */	unsigned	sharing_irq: 1;	/* 1 = sharing irq with another hwif */#ifdef CONFIG_BLK_DEV_PROMISE	unsigned	is_promise2: 1;	/* 2nd i/f on promise DC4030 */#endif /* CONFIG_BLK_DEV_PROMISE */#if (DISK_RECOVERY_TIME > 0)	unsigned long	last_time;	/* time when previous rq was done */#endif#ifdef CONFIG_BLK_DEV_IDECD	struct request request_sense_request;	/* from ide-cd.c */	struct packet_command request_sense_pc;	/* from ide-cd.c */#endif /* CONFIG_BLK_DEV_IDECD */#ifdef CONFIG_BLK_DEV_IDETAPE	ide_drive_t	*tape_drive;	/* Pointer to the tape on this interface */#endif /* CONFIG_BLK_DEV_IDETAPE */	} ide_hwif_t;/* *  internal ide interrupt handler type */typedef void (ide_handler_t)(ide_drive_t *);typedef struct hwgroup_s {	ide_handler_t		*handler;/* irq handler, if active */	ide_drive_t		*drive;	/* current drive */	ide_hwif_t		*hwif;	/* ptr to current hwif in linked-list */	ide_hwif_t		*next_hwif; /* next selected hwif (for tape) */	struct request		*rq;	/* current request */	struct timer_list	timer;	/* failsafe timer */	struct request		wrq;	/* local copy of current write rq */	unsigned long		poll_timeout;	/* timeout value during long polls */	int			active; /* set when servicing requests */	} ide_hwgroup_t;/* * ide_hwifs[] is the master data structure used to keep track * of just about everything in ide.c.  Whenever possible, routines * should be using pointers to a drive (ide_drive_t *) or  * pointers to a hwif (ide_hwif_t *), rather than indexing this * structure directly (the allocation/layout may change!). * */#ifndef _IDE_Cextern	ide_hwif_t	ide_hwifs[];		/* master data repository */#endif/* * One final include file, which references some of the data/defns from above */#define IDE_DRIVER	/* "parameter" for blk.h */#include <linux/blk.h>#if (DISK_RECOVERY_TIME > 0)void ide_set_recovery_timer (ide_hwif_t *);#define SET_RECOVERY_TIMER(drive) ide_set_recovery_timer (drive)#else#define SET_RECOVERY_TIMER(drive)#endif/* * This is used for (nearly) all data transfers from the IDE interface */void ide_input_data (ide_drive_t *drive, void *buffer, unsigned int wcount);/* * This is used for (nearly) all data transfers to the IDE interface */void ide_output_data (ide_drive_t *drive, void *buffer, unsigned int wcount);/* * This is used for (nearly) all ATAPI data transfers from/to the IDE interface */void atapi_input_bytes (ide_drive_t *drive, void *buffer, unsigned int bytecount);void atapi_output_bytes (ide_drive_t *drive, void *buffer, unsigned int bytecount);/* * This is used on exit from the driver, to designate the next irq handler * and also to start the safety timer. */void ide_set_handler (ide_drive_t *drive, ide_handler_t *handler, unsigned int timeout);/* * Error reporting, in human readable form (luxurious, but a memory hog). */byte ide_dump_status (ide_drive_t *drive, const char *msg, byte stat);/* * ide_error() takes action based on the error returned by the controller. * The calling function must return afterwards, to restart the request. */void ide_error (ide_drive_t *drive, const char *msg, byte stat);/* * ide_fixstring() cleans up and (optionally) byte-swaps a text string, * removing leading/trailing blanks and compressing internal blanks. * It is primarily used to tidy up the model name/number fields as * returned by the WIN_[P]IDENTIFY commands. */void ide_fixstring (byte *s, const int bytecount, const int byteswap);/* * This routine busy-waits for the drive status to be not "busy". * It then checks the status for all of the "good" bits and none * of the "bad" bits, and if all is okay it returns 0.  All other * cases return 1 after invoking ide_error() -- caller should return. * */int ide_wait_stat (ide_drive_t *drive, byte good, byte bad, unsigned long timeout);/* * This routine is called from the partition-table code in genhd.c * to "convert" a drive to a logical geometry with fewer than 1024 cyls. * * The second parameter, "xparm", determines exactly how the translation * will be handled: *		 0 = convert to CHS with fewer than 1024 cyls *			using the same method as Ontrack DiskManager. *		 1 = same as "0", plus offset everything by 63 sectors. *		-1 = similar to "0", plus redirect sector 0 to sector 1. *		>1 = convert to a CHS geometry with "xparm" heads. * * Returns 0 if the translation was not possible, if the device was not * an IDE disk drive, or if a geometry was "forced" on the commandline. * Returns 1 if the geometry translation was successful. */int ide_xlate_1024 (kdev_t, int, const char *);/* * Start a reset operation for an IDE interface. * The caller should return immediately after invoking this. */void ide_do_reset (ide_drive_t *);/* * This function is intended to be used prior to invoking ide_do_drive_cmd(). */void ide_init_drive_cmd (struct request *rq);/* * "action" parameter type for ide_do_drive_cmd() below. */typedef enum	{ide_wait,	/* insert rq at end of list, and wait for it */	 ide_next,	/* insert rq immediately after current request */	 ide_preempt,	/* insert rq in front of current request */	 ide_end}	/* insert rq at end of list, but don't wait for it */ ide_action_t;/* * This function issues a special IDE device request * onto the request queue. * * If action is ide_wait, then the rq is queued at the end of the * request queue, and the function sleeps until it has been processed. * This is for use when invoked from an ioctl handler. * * If action is ide_preempt, then the rq is queued at the head of * the request queue, displacing the currently-being-processed * request and this function returns immediately without waiting * for the new rq to be completed.  This is VERY DANGEROUS, and is * intended for careful use by the ATAPI tape/cdrom driver code. * * If action is ide_next, then the rq is queued immediately after * the currently-being-processed-request (if any), and the function * returns without waiting for the new rq to be completed.  As above, * This is VERY DANGEROUS, and is intended for careful use by the  * ATAPI tape/cdrom driver code. * * If action is ide_end, then the rq is queued at the end of the * request queue, and the function returns immediately without waiting * for the new rq to be completed. This is again intended for careful * use by the ATAPI tape/cdrom driver code. (Currently used by ide-tape.c, * when operating in the pipelined operation mode). */int ide_do_drive_cmd (ide_drive_t *drive, struct request *rq, ide_action_t action); /* * Clean up after success/failure of an explicit drive cmd. * stat/err are used only when (HWGROUP(drive)->rq->cmd == IDE_DRIVE_CMD). */void ide_end_drive_cmd (ide_drive_t *drive, byte stat, byte err);/* * ide_system_bus_speed() returns what we think is the system VESA/PCI * bus speed (in Mhz).  This is used for calculating interface PIO timings. * The default is 40 for known PCI systems, 50 otherwise. * The "idebus=xx" parameter can be used to override this value. */int ide_system_bus_speed (void);/* * ide_multwrite() transfers a block of up to mcount sectors of data * to a drive as part of a disk multwrite operation. */void ide_multwrite (ide_drive_t *drive, unsigned int mcount);#ifdef CONFIG_BLK_DEV_IDECD/* * These are routines in ide-cd.c invoked from ide.c */void ide_do_rw_cdrom (ide_drive_t *, unsigned long);int ide_cdrom_ioctl (ide_drive_t *, struct inode *, struct file *, unsigned int, unsigned long);int ide_cdrom_check_media_change (ide_drive_t *);int ide_cdrom_open (struct inode *, struct file *, ide_drive_t *);void ide_cdrom_release (struct inode *, struct file *, ide_drive_t *);void ide_cdrom_setup (ide_drive_t *);#endif /* CONFIG_BLK_DEV_IDECD */#ifdef CONFIG_BLK_DEV_IDETAPE/* *	Functions in ide-tape.c which are invoked from ide.c: *//* *	idetape_identify_device is called during device probing stage to *	probe for an ide atapi tape drive and to initialize global variables *	in ide-tape.c which provide the link between the character device *	and the corresponding block device. * *	Returns 1 if an ide tape was detected and is supported. *	Returns 0 otherwise. */ int idetape_identify_device (ide_drive_t *drive,struct hd_driveid *id);/* *	idetape_setup is called a bit later than idetape_identify_device, *	during the search for disk partitions, to initialize various tape *	state variables in ide_drive_t *drive. */ void idetape_setup (ide_drive_t *drive);/* *	idetape_do_request is our request function. It is called by ide.c *	to process a new request. */void idetape_do_request (ide_drive_t *drive, struct request *rq, unsigned long block);/* *	idetape_end_request is used to finish servicing a request, and to *	insert a pending pipeline request into the main device queue. */ void idetape_end_request (byte uptodate, ide_hwgroup_t *hwgroup);/* *	Block device interface functions. */  int idetape_blkdev_ioctl (ide_drive_t *drive, struct inode *inode, struct file *file,			unsigned int cmd, unsigned long arg);int idetape_blkdev_open (struct inode *inode, struct file *filp, ide_drive_t *drive);void idetape_blkdev_release (struct inode *inode, struct file *filp, ide_drive_t *drive);/* *	idetape_register_chrdev initializes the character device interface to *	the ide tape drive. */ void idetape_register_chrdev (void);#endif /* CONFIG_BLK_DEV_IDETAPE */#ifdef CONFIG_BLK_DEV_IDEFLOPPYint idefloppy_identify_device (ide_drive_t *drive,struct hd_driveid *id);void idefloppy_setup (ide_drive_t *drive);void idefloppy_do_request (ide_drive_t *drive, struct request *rq, unsigned long block);void idefloppy_end_request (byte uptodate, ide_hwgroup_t *hwgroup);int idefloppy_ioctl (ide_drive_t *drive, struct inode *inode, struct file *file,			unsigned int cmd, unsigned long arg);int idefloppy_open (struct inode *inode, struct file *filp, ide_drive_t *drive);void idefloppy_release (struct inode *inode, struct file *filp, ide_drive_t *drive);int idefloppy_media_change (ide_drive_t *drive);unsigned long idefloppy_capacity (ide_drive_t *drive);#endif /* CONFIG_BLK_DEV_IDEFLOPPY */#ifdef CONFIG_BLK_DEV_IDESCSIvoid idescsi_setup (ide_drive_t *drive);void idescsi_do_request (ide_drive_t *drive, struct request *rq, unsigned long block);void idescsi_end_request (byte uptodate, ide_hwgroup_t *hwgroup);int idescsi_ioctl (ide_drive_t *drive, struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg);int idescsi_open (struct inode *inode, struct file *filp, ide_drive_t *drive);void idescsi_ide_release (struct inode *inode, struct file *filp, ide_drive_t *drive);#endif /* CONFIG_BLK_DEV_IDESCSI */#ifdef CONFIG_BLK_DEV_TRITONvoid ide_init_triton (byte, byte);void ide_init_promise (byte bus, byte fn, ide_hwif_t *hwif0, ide_hwif_t *hwif1, unsigned short dma);#endif /* CONFIG_BLK_DEV_TRITON */

⌨️ 快捷键说明

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