libata.h
来自「linux 内核源代码」· C头文件 代码 · 共 1,401 行 · 第 1/3 页
H
1,401 行
struct scatterlist *__sg; unsigned int err_mask; struct ata_taskfile result_tf; ata_qc_cb_t complete_fn; void *private_data; void *lldd_task;};struct ata_port_stats { unsigned long unhandled_irq; unsigned long idle_irq; unsigned long rw_reqbuf;};struct ata_ering_entry { int is_io; unsigned int err_mask; u64 timestamp;};struct ata_ering { int cursor; struct ata_ering_entry ring[ATA_ERING_SIZE];};struct ata_device { struct ata_link *link; unsigned int devno; /* 0 or 1 */ unsigned long flags; /* ATA_DFLAG_xxx */ unsigned int horkage; /* List of broken features */ struct scsi_device *sdev; /* attached SCSI device */#ifdef CONFIG_ATA_ACPI acpi_handle acpi_handle; union acpi_object *gtf_cache;#endif /* n_sector is used as CLEAR_OFFSET, read comment above CLEAR_OFFSET */ u64 n_sectors; /* size of device, if ATA */ unsigned int class; /* ATA_DEV_xxx */ union { u16 id[ATA_ID_WORDS]; /* IDENTIFY xxx DEVICE data */ u32 gscr[SATA_PMP_GSCR_DWORDS]; /* PMP GSCR block */ }; u8 pio_mode; u8 dma_mode; u8 xfer_mode; unsigned int xfer_shift; /* ATA_SHIFT_xxx */ unsigned int multi_count; /* sectors count for READ/WRITE MULTIPLE */ unsigned int max_sectors; /* per-device max sectors */ unsigned int cdb_len; /* per-dev xfer mask */ unsigned int pio_mask; unsigned int mwdma_mask; unsigned int udma_mask; /* for CHS addressing */ u16 cylinders; /* Number of cylinders */ u16 heads; /* Number of heads */ u16 sectors; /* Number of sectors per track */ /* error history */ struct ata_ering ering; int spdn_cnt;};/* Offset into struct ata_device. Fields above it are maintained * acress device init. Fields below are zeroed. */#define ATA_DEVICE_CLEAR_OFFSET offsetof(struct ata_device, n_sectors)struct ata_eh_info { struct ata_device *dev; /* offending device */ u32 serror; /* SError from LLDD */ unsigned int err_mask; /* port-wide err_mask */ unsigned int action; /* ATA_EH_* action mask */ unsigned int dev_action[ATA_MAX_DEVICES]; /* dev EH action */ unsigned int flags; /* ATA_EHI_* flags */ unsigned int probe_mask; char desc[ATA_EH_DESC_LEN]; int desc_len;};struct ata_eh_context { struct ata_eh_info i; int tries[ATA_MAX_DEVICES]; unsigned int classes[ATA_MAX_DEVICES]; unsigned int did_probe_mask;};struct ata_acpi_drive{ u32 pio; u32 dma;} __packed;struct ata_acpi_gtm { struct ata_acpi_drive drive[2]; u32 flags;} __packed;struct ata_link { struct ata_port *ap; int pmp; /* port multiplier port # */ unsigned int active_tag; /* active tag on this link */ u32 sactive; /* active NCQ commands */ unsigned int flags; /* ATA_LFLAG_xxx */ unsigned int hw_sata_spd_limit; unsigned int sata_spd_limit; unsigned int sata_spd; /* current SATA PHY speed */ /* record runtime error info, protected by host_set lock */ struct ata_eh_info eh_info; /* EH context */ struct ata_eh_context eh_context; struct ata_device device[ATA_MAX_DEVICES];};struct ata_port { struct Scsi_Host *scsi_host; /* our co-allocated scsi host */ const struct ata_port_operations *ops; spinlock_t *lock; unsigned long flags; /* ATA_FLAG_xxx */ unsigned int pflags; /* ATA_PFLAG_xxx */ unsigned int print_id; /* user visible unique port ID */ unsigned int port_no; /* 0 based port no. inside the host */ struct ata_prd *prd; /* our SG list */ dma_addr_t prd_dma; /* and its DMA mapping */ void *pad; /* array of DMA pad buffers */ dma_addr_t pad_dma; struct ata_ioports ioaddr; /* ATA cmd/ctl/dma register blocks */ u8 ctl; /* cache of ATA control register */ u8 last_ctl; /* Cache last written value */ unsigned int pio_mask; unsigned int mwdma_mask; unsigned int udma_mask; unsigned int cbl; /* cable type; ATA_CBL_xxx */ struct ata_queued_cmd qcmd[ATA_MAX_QUEUE]; unsigned long qc_allocated; unsigned int qc_active; int nr_active_links; /* #links with active qcs */ struct ata_link link; /* host default link */ int nr_pmp_links; /* nr of available PMP links */ struct ata_link *pmp_link; /* array of PMP links */ struct ata_link *excl_link; /* for PMP qc exclusion */ struct ata_port_stats stats; struct ata_host *host; struct device *dev; void *port_task_data; struct delayed_work port_task; struct delayed_work hotplug_task; struct work_struct scsi_rescan_task; unsigned int hsm_task_state; u32 msg_enable; struct list_head eh_done_q; wait_queue_head_t eh_wait_q; int eh_tries; pm_message_t pm_mesg; int *pm_result; enum link_pm pm_policy; struct timer_list fastdrain_timer; unsigned long fastdrain_cnt; void *private_data;#ifdef CONFIG_ATA_ACPI acpi_handle acpi_handle; struct ata_acpi_gtm __acpi_init_gtm; /* use ata_acpi_init_gtm() */#endif u8 sector_buf[ATA_SECT_SIZE]; /* owned by EH */};struct ata_port_operations { void (*dev_config) (struct ata_device *); void (*set_piomode) (struct ata_port *, struct ata_device *); void (*set_dmamode) (struct ata_port *, struct ata_device *); unsigned long (*mode_filter) (struct ata_device *, unsigned long); void (*tf_load) (struct ata_port *ap, const struct ata_taskfile *tf); void (*tf_read) (struct ata_port *ap, struct ata_taskfile *tf); void (*exec_command)(struct ata_port *ap, const struct ata_taskfile *tf); u8 (*check_status)(struct ata_port *ap); u8 (*check_altstatus)(struct ata_port *ap); void (*dev_select)(struct ata_port *ap, unsigned int device); void (*phy_reset) (struct ata_port *ap); /* obsolete */ int (*set_mode) (struct ata_link *link, struct ata_device **r_failed_dev); int (*cable_detect) (struct ata_port *ap); int (*check_atapi_dma) (struct ata_queued_cmd *qc); void (*bmdma_setup) (struct ata_queued_cmd *qc); void (*bmdma_start) (struct ata_queued_cmd *qc); void (*data_xfer) (struct ata_device *, unsigned char *, unsigned int, int); int (*qc_defer) (struct ata_queued_cmd *qc); void (*qc_prep) (struct ata_queued_cmd *qc); unsigned int (*qc_issue) (struct ata_queued_cmd *qc); /* port multiplier */ void (*pmp_attach) (struct ata_port *ap); void (*pmp_detach) (struct ata_port *ap); /* Error handlers. ->error_handler overrides ->eng_timeout and * indicates that new-style EH is in place. */ void (*eng_timeout) (struct ata_port *ap); /* obsolete */ void (*freeze) (struct ata_port *ap); void (*thaw) (struct ata_port *ap); void (*error_handler) (struct ata_port *ap); void (*post_internal_cmd) (struct ata_queued_cmd *qc); irq_handler_t irq_handler; void (*irq_clear) (struct ata_port *); u8 (*irq_on) (struct ata_port *); int (*scr_read) (struct ata_port *ap, unsigned int sc_reg, u32 *val); int (*scr_write) (struct ata_port *ap, unsigned int sc_reg, u32 val); int (*port_suspend) (struct ata_port *ap, pm_message_t mesg); int (*port_resume) (struct ata_port *ap); int (*enable_pm) (struct ata_port *ap, enum link_pm policy); void (*disable_pm) (struct ata_port *ap); int (*port_start) (struct ata_port *ap); void (*port_stop) (struct ata_port *ap); void (*host_stop) (struct ata_host *host); void (*bmdma_stop) (struct ata_queued_cmd *qc); u8 (*bmdma_status) (struct ata_port *ap);};struct ata_port_info { struct scsi_host_template *sht; unsigned long flags; unsigned long link_flags; unsigned long pio_mask; unsigned long mwdma_mask; unsigned long udma_mask; const struct ata_port_operations *port_ops; irq_handler_t irq_handler; void *private_data;};struct ata_timing { unsigned short mode; /* ATA mode */ unsigned short setup; /* t1 */ unsigned short act8b; /* t2 for 8-bit I/O */ unsigned short rec8b; /* t2i for 8-bit I/O */ unsigned short cyc8b; /* t0 for 8-bit I/O */ unsigned short active; /* t2 or tD */ unsigned short recover; /* t2i or tK */ unsigned short cycle; /* t0 */ unsigned short udma; /* t2CYCTYP/2 */};#define FIT(v, vmin, vmax) max_t(short, min_t(short, v, vmax), vmin)extern const unsigned long sata_deb_timing_normal[];extern const unsigned long sata_deb_timing_hotplug[];extern const unsigned long sata_deb_timing_long[];extern const struct ata_port_operations ata_dummy_port_ops;extern const struct ata_port_info ata_dummy_port_info;static inline const unsigned long *sata_ehc_deb_timing(struct ata_eh_context *ehc){ if (ehc->i.flags & ATA_EHI_HOTPLUGGED) return sata_deb_timing_hotplug; else return sata_deb_timing_normal;}static inline int ata_port_is_dummy(struct ata_port *ap){ return ap->ops == &ata_dummy_port_ops;}extern void sata_print_link_status(struct ata_link *link);extern void ata_port_probe(struct ata_port *);extern void ata_bus_reset(struct ata_port *ap);extern int sata_set_spd(struct ata_link *link);extern int sata_link_debounce(struct ata_link *link, const unsigned long *params, unsigned long deadline);extern int sata_link_resume(struct ata_link *link, const unsigned long *params, unsigned long deadline);extern int ata_std_prereset(struct ata_link *link, unsigned long deadline);extern int ata_std_softreset(struct ata_link *link, unsigned int *classes, unsigned long deadline);extern int sata_link_hardreset(struct ata_link *link, const unsigned long *timing, unsigned long deadline);extern int sata_std_hardreset(struct ata_link *link, unsigned int *class, unsigned long deadline);extern void ata_std_postreset(struct ata_link *link, unsigned int *classes);extern void ata_port_disable(struct ata_port *);extern void ata_std_ports(struct ata_ioports *ioaddr);extern struct ata_host *ata_host_alloc(struct device *dev, int max_ports);extern struct ata_host *ata_host_alloc_pinfo(struct device *dev, const struct ata_port_info * const * ppi, int n_ports);extern int ata_host_start(struct ata_host *host);extern int ata_host_register(struct ata_host *host, struct scsi_host_template *sht);extern int ata_host_activate(struct ata_host *host, int irq, irq_handler_t irq_handler, unsigned long irq_flags, struct scsi_host_template *sht);extern void ata_host_detach(struct ata_host *host);extern void ata_host_init(struct ata_host *, struct device *, unsigned long, const struct ata_port_operations *);extern int ata_scsi_detect(struct scsi_host_template *sht);extern int ata_scsi_ioctl(struct scsi_device *dev, int cmd, void __user *arg);extern int ata_scsi_queuecmd(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *));extern void ata_sas_port_destroy(struct ata_port *);extern struct ata_port *ata_sas_port_alloc(struct ata_host *, struct ata_port_info *, struct Scsi_Host *);extern int ata_sas_port_init(struct ata_port *);extern int ata_sas_port_start(struct ata_port *ap);extern void ata_sas_port_stop(struct ata_port *ap);extern int ata_sas_slave_configure(struct scsi_device *, struct ata_port *);extern int ata_sas_queuecmd(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *), struct ata_port *ap);extern unsigned int ata_host_intr(struct ata_port *ap, struct ata_queued_cmd *qc);extern int sata_scr_valid(struct ata_link *link);extern int sata_scr_read(struct ata_link *link, int reg, u32 *val);extern int sata_scr_write(struct ata_link *link, int reg, u32 val);extern int sata_scr_write_flush(struct ata_link *link, int reg, u32 val);extern int ata_link_online(struct ata_link *link);extern int ata_link_offline(struct ata_link *link);#ifdef CONFIG_PMextern int ata_host_suspend(struct ata_host *host, pm_message_t mesg);extern void ata_host_resume(struct ata_host *host);#endifextern int ata_ratelimit(void);extern int ata_busy_sleep(struct ata_port *ap, unsigned long timeout_pat, unsigned long timeout);extern void ata_wait_after_reset(struct ata_port *ap, unsigned long deadline);extern int ata_wait_ready(struct ata_port *ap, unsigned long deadline);extern void ata_port_queue_task(struct ata_port *ap, work_func_t fn, void *data, unsigned long delay);extern u32 ata_wait_register(void __iomem *reg, u32 mask, u32 val, unsigned long interval_msec, unsigned long timeout_msec);extern unsigned int ata_dev_try_classify(struct ata_device *dev, int present, u8 *r_err);/* * Default driver ops implementations */extern void ata_tf_load(struct ata_port *ap, const struct ata_taskfile *tf);extern void ata_tf_read(struct ata_port *ap, struct ata_taskfile *tf);extern void ata_tf_to_fis(const struct ata_taskfile *tf, u8 pmp, int is_cmd, u8 *fis);extern void ata_tf_from_fis(const u8 *fis, struct ata_taskfile *tf);extern void ata_noop_dev_select(struct ata_port *ap, unsigned int device);extern void ata_std_dev_select(struct ata_port *ap, unsigned int device);extern u8 ata_check_status(struct ata_port *ap);extern u8 ata_altstatus(struct ata_port *ap);extern void ata_exec_command(struct ata_port *ap, const struct ata_taskfile *tf);extern int ata_port_start(struct ata_port *ap);extern int ata_sff_port_start(struct ata_port *ap);extern irqreturn_t ata_interrupt(int irq, void *dev_instance);extern void ata_data_xfer(struct ata_device *adev, unsigned char *buf, unsigned int buflen, int write_data);extern void ata_data_xfer_noirq(struct ata_device *adev, unsigned char *buf, unsigned int buflen, int write_data);extern int ata_std_qc_defer(struct ata_queued_cmd *qc);extern void ata_dumb_qc_prep(struct ata_queued_cmd *qc);extern void ata_qc_prep(struct ata_queued_cmd *qc);extern void ata_noop_qc_prep(struct ata_queued_cmd *qc);extern unsigned int ata_qc_issue_prot(struct ata_queued_cmd *qc);extern void ata_sg_init_one(struct ata_queued_cmd *qc, void *buf, unsigned int buflen);extern void ata_sg_init(struct ata_queued_cmd *qc, struct scatterlist *sg, unsigned int n_elem);extern unsigned int ata_dev_classify(const struct ata_taskfile *tf);extern void ata_dev_disable(struct ata_device *adev);extern void ata_id_string(const u16 *id, unsigned char *s, unsigned int ofs, unsigned int len);extern void ata_id_c_string(const u16 *id, unsigned char *s, unsigned int ofs, unsigned int len);extern void ata_id_to_dma_mode(struct ata_device *dev, u8 unknown);extern void ata_bmdma_setup(struct ata_queued_cmd *qc);extern void ata_bmdma_start(struct ata_queued_cmd *qc);extern void ata_bmdma_stop(struct ata_queued_cmd *qc);extern u8 ata_bmdma_status(struct ata_port *ap);extern void ata_bmdma_irq_clear(struct ata_port *ap);extern void ata_bmdma_freeze(struct ata_port *ap);extern void ata_bmdma_thaw(struct ata_port *ap);extern void ata_bmdma_drive_eh(struct ata_port *ap, ata_prereset_fn_t prereset, ata_reset_fn_t softreset, ata_reset_fn_t hardreset, ata_postreset_fn_t postreset);extern void ata_bmdma_error_handler(struct ata_port *ap);extern void ata_bmdma_post_internal_cmd(struct ata_queued_cmd *qc);extern int ata_hsm_move(struct ata_port *ap, struct ata_queued_cmd *qc, u8 status, int in_wq);extern void ata_qc_complete(struct ata_queued_cmd *qc);extern int ata_qc_complete_multiple(struct ata_port *ap, u32 qc_active, void (*finish_qc)(struct ata_queued_cmd *));extern void ata_scsi_simulate(struct ata_device *dev, struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *));extern int ata_std_bios_param(struct scsi_device *sdev, struct block_device *bdev, sector_t capacity, int geom[]);extern int ata_scsi_slave_config(struct scsi_device *sdev);extern void ata_scsi_slave_destroy(struct scsi_device *sdev);extern int ata_scsi_change_queue_depth(struct scsi_device *sdev, int queue_depth);extern struct ata_device *ata_dev_pair(struct ata_device *adev);extern int ata_do_set_mode(struct ata_link *link, struct ata_device **r_failed_dev);extern u8 ata_irq_on(struct ata_port *ap);extern int ata_cable_40wire(struct ata_port *ap);extern int ata_cable_80wire(struct ata_port *ap);extern int ata_cable_sata(struct ata_port *ap);extern int ata_cable_unknown(struct ata_port *ap);/* * Timing helpers */extern unsigned int ata_pio_need_iordy(const struct ata_device *);extern int ata_timing_compute(struct ata_device *, unsigned short, struct ata_timing *, int, int);extern void ata_timing_merge(const struct ata_timing *, const struct ata_timing *, struct ata_timing *, unsigned int);enum { ATA_TIMING_SETUP = (1 << 0), ATA_TIMING_ACT8B = (1 << 1), ATA_TIMING_REC8B = (1 << 2), ATA_TIMING_CYC8B = (1 << 3), ATA_TIMING_8BIT = ATA_TIMING_ACT8B | ATA_TIMING_REC8B | ATA_TIMING_CYC8B, ATA_TIMING_ACTIVE = (1 << 4), ATA_TIMING_RECOVER = (1 << 5),
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?