📄 ide.h
字号:
byte unmask; /* flag: okay to unmask other irqs */ byte slow; /* flag: slow data port */ byte bswap; /* flag: byte swap data */ byte dsc_overlap; /* flag: DSC overlap */ byte nice1; /* flag: give potential excess bandwidth */ unsigned present : 1; /* drive is physically present */ unsigned noprobe : 1; /* from: hdx=noprobe */ unsigned busy : 1; /* currently doing revalidate_disk() */ unsigned removable : 1; /* 1 if need to do check_media_change */ unsigned forced_geom : 1; /* 1 if hdx=c,h,s was given at boot */ unsigned no_unmask : 1; /* disallow setting unmask bit */ unsigned no_io_32bit : 1; /* disallow enabling 32bit I/O */ unsigned nobios : 1; /* flag: do not probe bios for drive */ unsigned revalidate : 1; /* request revalidation */ unsigned atapi_overlap : 1; /* flag: ATAPI overlap (not supported) */ unsigned nice0 : 1; /* flag: give obvious excess bandwidth */ unsigned nice2 : 1; /* flag: give a share in our own bandwidth */ unsigned doorlocking : 1; /* flag: for removable only: door lock/unlock works */ unsigned autotune : 2; /* 1=autotune, 2=noautotune, 0=default */ unsigned remap_0_to_1 : 2; /* 0=remap if ezdrive, 1=remap, 2=noremap */ unsigned ata_flash : 1; /* 1=present, 0=default */ unsigned addressing; /* : 2; 0=28-bit, 1=48-bit, 2=64-bit */ byte scsi; /* 0=default, 1=skip current ide-subdriver for ide-scsi emulation */ byte media; /* disk, cdrom, tape, floppy, ... */ select_t select; /* basic drive/head select reg value */ byte ctl; /* "normal" value for IDE_CONTROL_REG */ byte ready_stat; /* min status value for drive ready */ byte mult_count; /* current multiple sector setting */ byte mult_req; /* requested multiple sector setting */ byte tune_req; /* requested drive tuning setting */ byte io_32bit; /* 0=16-bit, 1=32-bit, 2/3=32bit+sync */ byte bad_wstat; /* used for ignoring WRERR_STAT */ byte nowerr; /* used for ignoring WRERR_STAT */ byte sect0; /* offset of first sector for DM6:DDO */ unsigned int usage; /* current "open()" count for drive */ byte head; /* "real" number of heads */ byte sect; /* "real" sectors per track */ byte bios_head; /* BIOS/fdisk/LILO number of heads */ byte bios_sect; /* BIOS/fdisk/LILO sectors per track */ unsigned int bios_cyl; /* BIOS/fdisk/LILO number of cyls */ unsigned int cyl; /* "real" number of cyls */ unsigned long capacity; /* total number of sectors */ unsigned long long capacity48; /* total number of sectors */ unsigned int drive_data; /* for use by tuneproc/selectproc as needed */ void *hwif; /* actually (ide_hwif_t *) */ wait_queue_head_t wqueue; /* used to wait for drive in open() */ struct hd_driveid *id; /* drive model identification info */ struct hd_struct *part; /* drive partition table */ char name[4]; /* drive name, such as "hda" */ void *driver; /* (ide_driver_t *) */ void *driver_data; /* extra driver data */ devfs_handle_t de; /* directory for device */ struct proc_dir_entry *proc; /* /proc/ide/ directory entry */ void *settings; /* /proc/ide/ drive settings */ char driver_req[10]; /* requests specific driver */ int last_lun; /* last logical unit */ int forced_lun; /* if hdxlun was given at boot */ int lun; /* logical unit */ int crc_count; /* crc counter to reduce drive speed */ byte quirk_list; /* drive is considered quirky if set for a specific host */ byte suspend_reset; /* drive suspend mode flag, soft-reset recovers */ byte init_speed; /* transfer rate set at boot */ byte current_speed; /* current transfer rate set */ byte dn; /* now wide spread use */ byte wcache; /* status of write cache */ byte acoustic; /* acoustic management */ unsigned int failures; /* current failure count */ unsigned int max_failures; /* maximum allowed failure count */} 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, ide_dma_write, ide_dma_begin, ide_dma_end, ide_dma_check, ide_dma_on, ide_dma_off, ide_dma_off_quietly, ide_dma_test_irq, ide_dma_bad_drive, ide_dma_good_drive, ide_dma_verbose, ide_dma_retune, ide_dma_lostirq, ide_dma_timeout} ide_dma_action_t;typedef int (ide_dmaproc_t)(ide_dma_action_t, ide_drive_t *);/* * An ide_ideproc_t() performs CPU-polled transfers to/from a drive. * Arguments are: the drive, the buffer pointer, and the length (in bytes or * words depending on if it's an IDE or ATAPI call). * * If it is not defined for a controller, standard-code is used from ide.c. * * Controllers which are not memory-mapped in the standard way need to * override that mechanism using this function to work. * */typedef enum { ideproc_ide_input_data, ideproc_ide_output_data, ideproc_atapi_input_bytes, ideproc_atapi_output_bytes} ide_ide_action_t;typedef void (ide_ideproc_t)(ide_ide_action_t, ide_drive_t *, void *, unsigned int);/* * 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);typedef int (ide_speedproc_t) (ide_drive_t *, byte);/* * This is used to provide support for strange interfaces */typedef void (ide_selectproc_t) (ide_drive_t *);typedef void (ide_resetproc_t) (ide_drive_t *);typedef int (ide_quirkproc_t) (ide_drive_t *);typedef void (ide_intrproc_t) (ide_drive_t *);typedef void (ide_maskproc_t) (ide_drive_t *, int);typedef void (ide_rw_proc_t) (ide_drive_t *, ide_dma_action_t);/* * ide soft-power support */typedef int (ide_busproc_t) (ide_drive_t *, int);#define IDE_CHIPSET_PCI_MASK \ ((1<<ide_pci)|(1<<ide_cmd646)|(1<<ide_ali14xx))#define IDE_CHIPSET_IS_PCI(c) ((IDE_CHIPSET_PCI_MASK >> (c)) & 1)#ifdef CONFIG_BLK_DEV_IDEPCItypedef struct ide_pci_devid_s { unsigned short vid; unsigned short did;} ide_pci_devid_t;#define IDE_PCI_DEVID_NULL ((ide_pci_devid_t){0,0})#define IDE_PCI_DEVID_EQ(a,b) (a.vid == b.vid && a.did == b.did)#endif /* CONFIG_BLK_DEV_IDEPCI */typedef struct hwif_s { struct hwif_s *next; /* for linked-list in ide_hwgroup_t */ void *hwgroup; /* actually (ide_hwgroup_t *) */ ide_ioreg_t io_ports[IDE_NR_PORTS]; /* task file registers */ hw_regs_t hw; /* Hardware info */ ide_drive_t drives[MAX_DRIVES]; /* drive info */ struct gendisk *gd; /* gendisk structure */ ide_tuneproc_t *tuneproc; /* routine to tune PIO mode for drives */ ide_speedproc_t *speedproc; /* routine to retune DMA modes for drives */ ide_selectproc_t *selectproc; /* tweaks hardware to select drive */ ide_resetproc_t *resetproc; /* routine to reset controller after a disk reset */ ide_intrproc_t *intrproc; /* special interrupt handling for shared pci interrupts */ ide_maskproc_t *maskproc; /* special host masking for drive selection */ ide_quirkproc_t *quirkproc; /* check host's drive quirk list */ ide_rw_proc_t *rwproc; /* adjust timing based upon rq->cmd direction */ ide_ideproc_t *ideproc; /* CPU-polled transfer routine */ ide_dmaproc_t *dmaproc; /* dma read/write/abort routine */ unsigned int *dmatable_cpu; /* dma physical region descriptor table (cpu view) */ dma_addr_t dmatable_dma; /* dma physical region descriptor table (dma view) */ struct scatterlist *sg_table; /* Scatter-gather list used to build the above */ int sg_nents; /* Current number of entries in it */ int sg_dma_direction; /* dma transfer direction */ int sg_dma_active; /* is it in use */ struct hwif_s *mate; /* other hwif from same PCI chip */ unsigned long dma_base; /* base addr for dma ports */ unsigned dma_extra; /* extra addr for dma ports */ unsigned long config_data; /* for use by chipset-specific code */ unsigned long select_data; /* for use by chipset-specific code */ struct proc_dir_entry *proc; /* /proc/ide/ directory entry */ int irq; /* our irq number */ byte major; /* our major number */ char name[6]; /* name of interface, eg. "ide0" */ byte index; /* 0 for ide0; 1 for ide1; ... */ hwif_chipset_t chipset; /* sub-module for tuning.. */#if 1 /* MVL */ byte forcenoprobe; /* cmdline specified noprobe */#endif 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 */ unsigned reset : 1; /* reset after probe */ unsigned autodma : 1; /* automatically try to enable DMA at boot */ unsigned udma_four : 1; /* 1=ATA-66 capable, 0=default */ unsigned no_highio : 1; /* don't trust pci dma mask, bounce */ byte channel; /* for dual-port chips: 0=primary, 1=secondary */#ifdef CONFIG_BLK_DEV_IDEPCI struct pci_dev *pci_dev; /* for pci chipsets */ ide_pci_devid_t pci_devid; /* for pci chipsets: {VID,DID} */#endif /* CONFIG_BLK_DEV_IDEPCI */#if (DISK_RECOVERY_TIME > 0) unsigned long last_time; /* time when previous rq was done */#endif byte straight8; /* Alan's straight 8 check */ void *hwif_data; /* extra hwif data */ ide_busproc_t *busproc; /* driver soft-power interface */ byte bus_state; /* power state of the IDE bus */} ide_hwif_t;/* * Status returned from various ide_ functions */typedef enum { ide_stopped, /* no drive operation was started */ ide_started /* a drive operation was started, and a handler was set */} ide_startstop_t;/* * internal ide interrupt handler type */typedef ide_startstop_t (ide_pre_handler_t)(ide_drive_t *, struct request *);typedef ide_startstop_t (ide_handler_t)(ide_drive_t *);typedef ide_startstop_t (ide_post_handler_t)(ide_drive_t *);/* * when ide_timer_expiry fires, invoke a handler of this type * to decide what to do. */typedef int (ide_expiry_t)(ide_drive_t *);typedef struct hwgroup_s { ide_handler_t *handler;/* irq handler, if active */ volatile int busy; /* BOOL: protects all fields below */ int sleeping; /* BOOL: wake us up on timer expiry */ ide_drive_t *drive; /* current drive */ ide_hwif_t *hwif; /* ptr to current hwif in linked-list */ 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 */ ide_expiry_t *expiry; /* queried upon timeouts */} ide_hwgroup_t;/* structure attached to the request for IDE_TASK_CMDS *//* * configurable drive settings */#define TYPE_INT 0#define TYPE_INTA 1#define TYPE_BYTE 2#define TYPE_SHORT 3#define SETTING_READ (1 << 0)#define SETTING_WRITE (1 << 1)#define SETTING_RW (SETTING_READ | SETTING_WRITE)typedef int (ide_procset_t)(ide_drive_t *, int);typedef struct ide_settings_s { char *name; int rw; int read_ioctl; int write_ioctl; int data_type; int min; int max; int mul_factor; int div_factor; void *data; ide_procset_t *set; int auto_remove; struct ide_settings_s *next;} ide_settings_t;void ide_add_setting(ide_drive_t *drive, const char *name, int rw, int read_ioctl, int write_ioctl, int data_type, int min, int max, int mul_factor, int div_factor, void *data, ide_procset_t *set);void ide_remove_setting(ide_drive_t *drive, char *name);ide_settings_t *ide_find_setting_by_name(ide_drive_t *drive, char *name);int ide_read_setting(ide_drive_t *t, ide_settings_t *setting);int ide_write_setting(ide_drive_t *drive, ide_settings_t *setting, int val);void ide_add_generic_settings(ide_drive_t *drive);/* * /proc/ide interface */typedef struct { const char *name; mode_t mode; read_proc_t *read_proc; write_proc_t *write_proc;} ide_proc_entry_t;#ifdef CONFIG_PROC_FSvoid proc_ide_create(void);void proc_ide_destroy(void);void recreate_proc_ide_device(ide_hwif_t *, ide_drive_t *);void destroy_proc_ide_device(ide_hwif_t *, ide_drive_t *);void destroy_proc_ide_drives(ide_hwif_t *);void create_proc_ide_interfaces(void);void ide_add_proc_entries(struct proc_dir_entry *dir, ide_proc_entry_t *p, void *data);void ide_remove_proc_entries(struct proc_dir_entry *dir, ide_proc_entry_t *p);read_proc_t proc_ide_read_capacity;read_proc_t proc_ide_read_geometry;/* * Standard exit stuff: */#define PROC_IDE_READ_RETURN(page,start,off,count,eof,len) \{ \ len -= off; \ if (len < count) { \ *eof = 1; \ if (len <= 0) \ return 0; \ } else \ len = count; \ *start = page + off; \ return len; \}#else#define PROC_IDE_READ_RETURN(page,start,off,count,eof,len) return 0;#endif/* * Subdrivers support. */#define IDE_SUBDRIVER_VERSION 1typedef int (ide_cleanup_proc)(ide_drive_t *);typedef int (ide_standby_proc)(ide_drive_t *);typedef int (ide_flushcache_proc)(ide_drive_t *);typedef ide_startstop_t (ide_do_request_proc)(ide_drive_t *, struct request *, unsigned long);typedef void (ide_end_request_proc)(byte, ide_hwgroup_t *);typedef int (ide_ioctl_proc)(ide_drive_t *, struct inode *, struct file *, unsigned int, unsigned long);typedef int (ide_open_proc)(struct inode *, struct file *, ide_drive_t *);typedef void (ide_release_proc)(struct inode *, struct file *, ide_drive_t *);typedef int (ide_check_media_change_proc)(ide_drive_t *);typedef void (ide_revalidate_proc)(ide_drive_t *);typedef void (ide_pre_reset_proc)(ide_drive_t *);typedef unsigned long (ide_capacity_proc)(ide_drive_t *);typedef ide_startstop_t (ide_special_proc)(ide_drive_t *);typedef void (ide_setting_proc)(ide_drive_t *);typedef int (ide_reinit_proc)(ide_drive_t *);typedef void (ata_prebuilder_proc)(ide_drive_t *);typedef void (atapi_prebuilder_proc)(ide_drive_t *);typedef struct ide_driver_s { const char *name; const char *version; byte media; unsigned busy : 1; unsigned supports_dma : 1; unsigned supports_dsc_overlap : 1; ide_cleanup_proc *cleanup; ide_standby_proc *standby; ide_flushcache_proc *flushcache; ide_do_request_proc *do_request; ide_end_request_proc *end_request; ide_ioctl_proc *ioctl; ide_open_proc *open; ide_release_proc *release; ide_check_media_change_proc *media_change; ide_revalidate_proc *revalidate; ide_pre_reset_proc *pre_reset; ide_capacity_proc *capacity; ide_special_proc *special; ide_proc_entry_t *proc; ide_reinit_proc *reinit; ata_prebuilder_proc *ata_prebuilder; atapi_prebuilder_proc *atapi_prebuilder;} ide_driver_t;#define DRIVER(drive) ((ide_driver_t *)((drive)->driver))/* * IDE modules. */#define IDE_CHIPSET_MODULE 0 /* not supported yet */#define IDE_PROBE_MODULE 1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -