📄 ide.h
字号:
#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 + -