📄 libata.h
字号:
struct scsi_cmnd *scsicmd; void (*scsidone)(struct scsi_cmnd *); struct ata_taskfile tf; u8 cdb[ATAPI_CDB_LEN]; unsigned long flags; /* ATA_QCFLAG_xxx */ unsigned int tag; unsigned int n_elem; unsigned int orig_n_elem; int dma_dir; unsigned int pad_len; unsigned int nsect; unsigned int cursect; unsigned int nbytes; unsigned int curbytes; unsigned int cursg; unsigned int cursg_ofs; struct scatterlist sgent; struct scatterlist pad_sgent; void *buf_virt; /* DO NOT iterate over __sg manually, use ata_for_each_sg() */ struct scatterlist *__sg; unsigned int err_mask; struct ata_taskfile result_tf; ata_qc_cb_t complete_fn; void *private_data;};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_port *ap; unsigned int devno; /* 0 or 1 */ unsigned long flags; /* ATA_DFLAG_xxx */ struct scsi_device *sdev; /* attached SCSI device */ /* 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 */ u16 id[ATA_ID_WORDS]; /* IDENTIFY xxx DEVICE data */ 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; unsigned int horkage; /* List of broken features */};/* 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 long hotplug_timestamp; 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_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 id; /* unique id req'd by scsi midlyr */ unsigned int port_no; /* unique port #; from zero */ 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 */ unsigned int hw_sata_spd_limit; unsigned int sata_spd_limit; /* SATA PHY speed limit */ /* record runtime error info, protected by host lock */ struct ata_eh_info eh_info; /* EH context owned by EH */ struct ata_eh_context eh_context; struct ata_device device[ATA_MAX_DEVICES]; struct ata_queued_cmd qcmd[ATA_MAX_QUEUE]; unsigned long qc_allocated; unsigned int qc_active; unsigned int active_tag; u32 sactive; 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; pm_message_t pm_mesg; int *pm_result; void *private_data; u8 sector_buf[ATA_SECT_SIZE]; /* owned by EH */};struct ata_port_operations { void (*port_disable) (struct ata_port *); void (*dev_config) (struct ata_port *, 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) (const struct ata_port *, 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_port *ap, struct ata_device **r_failed_dev); void (*post_set_mode) (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); void (*qc_prep) (struct ata_queued_cmd *qc); unsigned int (*qc_issue) (struct ata_queued_cmd *qc); /* 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 *); u32 (*scr_read) (struct ata_port *ap, unsigned int sc_reg); void (*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 (*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 pio_mask; unsigned long mwdma_mask; unsigned long udma_mask; const struct ata_port_operations *port_ops; 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;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 ata_port_probe(struct ata_port *);extern void __sata_phy_reset(struct ata_port *ap);extern void sata_phy_reset(struct ata_port *ap);extern void ata_bus_reset(struct ata_port *ap);extern int sata_set_spd(struct ata_port *ap);extern int sata_phy_debounce(struct ata_port *ap, const unsigned long *param);extern int sata_phy_resume(struct ata_port *ap, const unsigned long *param);extern int ata_std_prereset(struct ata_port *ap);extern int ata_std_softreset(struct ata_port *ap, unsigned int *classes);extern int sata_port_hardreset(struct ata_port *ap, const unsigned long *timing);extern int sata_std_hardreset(struct ata_port *ap, unsigned int *class);extern void ata_std_postreset(struct ata_port *ap, unsigned int *classes);extern void ata_port_disable(struct ata_port *);extern void ata_std_ports(struct ata_ioports *ioaddr);#ifdef CONFIG_PCIextern int ata_pci_init_one (struct pci_dev *pdev, struct ata_port_info **port_info, unsigned int n_ports);extern void ata_pci_remove_one (struct pci_dev *pdev);extern void ata_pci_device_do_suspend(struct pci_dev *pdev, pm_message_t mesg);extern void ata_pci_device_do_resume(struct pci_dev *pdev);extern int ata_pci_device_suspend(struct pci_dev *pdev, pm_message_t mesg);extern int ata_pci_device_resume(struct pci_dev *pdev);extern int ata_pci_clear_simplex(struct pci_dev *pdev);#endif /* CONFIG_PCI */extern int ata_device_add(const struct ata_probe_ent *ent);extern void ata_port_detach(struct ata_port *ap);extern void ata_host_init(struct ata_host *, struct device *, unsigned long, const struct ata_port_operations *);extern void ata_host_remove(struct ata_host *host);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 int ata_scsi_release(struct Scsi_Host *host);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_port *ap);extern int sata_scr_read(struct ata_port *ap, int reg, u32 *val);extern int sata_scr_write(struct ata_port *ap, int reg, u32 val);extern int sata_scr_write_flush(struct ata_port *ap, int reg, u32 val);extern int ata_port_online(struct ata_port *ap);extern int ata_port_offline(struct ata_port *ap);extern int ata_scsi_device_resume(struct scsi_device *);extern int ata_scsi_device_suspend(struct scsi_device *, pm_message_t mesg);extern int ata_host_suspend(struct ata_host *host, pm_message_t mesg);extern void ata_host_resume(struct ata_host *host);extern int ata_ratelimit(void);extern int ata_busy_sleep(struct ata_port *ap, unsigned long timeout_pat, unsigned long timeout);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);/* * 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 *fis, u8 pmp);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 void ata_port_stop (struct ata_port *ap);extern void ata_host_stop (struct ata_host *host);extern irqreturn_t ata_interrupt (int irq, void *dev_instance);extern void ata_mmio_data_xfer(struct ata_device *adev, unsigned char *buf, unsigned int buflen, int write_data);extern void ata_pio_data_xfer(struct ata_device *adev, unsigned char *buf, unsigned int buflen, int write_data);extern void ata_pio_data_xfer_noirq(struct ata_device *adev, unsigned char *buf, unsigned int buflen, int write_data);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_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 unsigned long ata_device_blacklisted(const struct ata_device *dev);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);/* * 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);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -