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 + -
显示快捷键?