Blame view

include/linux/libata.h 57.8 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
  /*
af36d7f0d   Jeff Garzik   [libata] license ...
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
   *  Copyright 2003-2005 Red Hat, Inc.  All rights reserved.
   *  Copyright 2003-2005 Jeff Garzik
   *
   *
   *  This program is free software; you can redistribute it and/or modify
   *  it under the terms of the GNU General Public License as published by
   *  the Free Software Foundation; either version 2, or (at your option)
   *  any later version.
   *
   *  This program is distributed in the hope that it will be useful,
   *  but WITHOUT ANY WARRANTY; without even the implied warranty of
   *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   *  GNU General Public License for more details.
   *
   *  You should have received a copy of the GNU General Public License
   *  along with this program; see the file COPYING.  If not, write to
   *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
   *
   *
   *  libata documentation is available via 'make {ps|pdf}docs',
   *  as Documentation/DocBook/libata.*
   *
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
24
25
26
27
28
29
   */
  
  #ifndef __LINUX_LIBATA_H__
  #define __LINUX_LIBATA_H__
  
  #include <linux/delay.h>
341c2c958   Tejun Heo   libata: consisten...
30
  #include <linux/jiffies.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
31
  #include <linux/interrupt.h>
1c72d8d90   Andrew Morton   [PATCH] libata.h ...
32
  #include <linux/dma-mapping.h>
872602162   Jens Axboe   libata: convert t...
33
  #include <linux/scatterlist.h>
f0d36efdc   Tejun Heo   libata: update li...
34
  #include <linux/io.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
35
36
  #include <linux/ata.h>
  #include <linux/workqueue.h>
35bb94b11   Jeff Garzik   libata: Add helpe...
37
  #include <scsi/scsi_host.h>
11ef697b3   Kristen Carlson Accardi   [PATCH] libata: A...
38
  #include <linux/acpi.h>
ceb0c6426   Tejun Heo   libata: add ATAPI...
39
  #include <linux/cdrom.h>
c0c362b60   Tejun Heo   libata: implement...
40
  #include <linux/sched.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
41

a6d967a48   Jeff Garzik   [libata] No need ...
42
43
44
45
46
  /*
   * Define if arch has non-standard setup.  This is a _PCI_ standard
   * not a legacy or ISA standard.
   */
  #ifdef CONFIG_ATA_NONSTANDARD
2ec7df045   Alan Cox   [PATCH] libata: r...
47
  #include <asm/libata-portmap.h>
a6d967a48   Jeff Garzik   [libata] No need ...
48
49
50
  #else
  #include <asm-generic/libata-portmap.h>
  #endif
2ec7df045   Alan Cox   [PATCH] libata: r...
51

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
52
  /*
bfd605795   Randy Dunlap   From: Borislav Pe...
53
54
   * compile-time options: to be removed as soon as all the drivers are
   * converted to the new debugging mechanism
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
55
56
57
58
59
   */
  #undef ATA_DEBUG		/* debugging output */
  #undef ATA_VERBOSE_DEBUG	/* yet more debugging output */
  #undef ATA_IRQ_TRAP		/* define to ack screaming irqs */
  #undef ATA_NDEBUG		/* define to disable quick runtime checks */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
60
61
62
63
  
  
  /* note: prints function name for you */
  #ifdef ATA_DEBUG
1f938d060   Alexander Beregalov   libata.h: replace...
64
  #define DPRINTK(fmt, args...) printk(KERN_ERR "%s: " fmt, __func__, ## args)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
65
  #ifdef ATA_VERBOSE_DEBUG
1f938d060   Alexander Beregalov   libata.h: replace...
66
  #define VPRINTK(fmt, args...) printk(KERN_ERR "%s: " fmt, __func__, ## args)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
67
68
69
70
71
72
73
  #else
  #define VPRINTK(fmt, args...)
  #endif	/* ATA_VERBOSE_DEBUG */
  #else
  #define DPRINTK(fmt, args...)
  #define VPRINTK(fmt, args...)
  #endif	/* ATA_DEBUG */
1f938d060   Alexander Beregalov   libata.h: replace...
74
  #define BPRINTK(fmt, args...) if (ap->flags & ATA_FLAG_DEBUGMSG) printk(KERN_ERR "%s: " fmt, __func__, ## args)
2c13b7cee   Jeff Garzik   [libata] minor fi...
75

06296a1e6   Joe Perches   ata: Add and use ...
76
77
78
79
80
81
82
83
84
  #define ata_print_version_once(dev, version)			\
  ({								\
  	static bool __print_once;				\
  								\
  	if (!__print_once) {					\
  		__print_once = true;				\
  		ata_print_version(dev, version);		\
  	}							\
  })
bfd605795   Randy Dunlap   From: Borislav Pe...
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
  /* NEW: debug levels */
  #define HAVE_LIBATA_MSG 1
  
  enum {
  	ATA_MSG_DRV	= 0x0001,
  	ATA_MSG_INFO	= 0x0002,
  	ATA_MSG_PROBE	= 0x0004,
  	ATA_MSG_WARN	= 0x0008,
  	ATA_MSG_MALLOC	= 0x0010,
  	ATA_MSG_CTL	= 0x0020,
  	ATA_MSG_INTR	= 0x0040,
  	ATA_MSG_ERR	= 0x0080,
  };
  
  #define ata_msg_drv(p)    ((p)->msg_enable & ATA_MSG_DRV)
  #define ata_msg_info(p)   ((p)->msg_enable & ATA_MSG_INFO)
  #define ata_msg_probe(p)  ((p)->msg_enable & ATA_MSG_PROBE)
  #define ata_msg_warn(p)   ((p)->msg_enable & ATA_MSG_WARN)
  #define ata_msg_malloc(p) ((p)->msg_enable & ATA_MSG_MALLOC)
  #define ata_msg_ctl(p)    ((p)->msg_enable & ATA_MSG_CTL)
  #define ata_msg_intr(p)   ((p)->msg_enable & ATA_MSG_INTR)
  #define ata_msg_err(p)    ((p)->msg_enable & ATA_MSG_ERR)
  
  static inline u32 ata_msg_init(int dval, int default_msg_enable_bits)
  {
  	if (dval < 0 || dval >= (sizeof(u32) * 8))
  		return default_msg_enable_bits; /* should be 0x1 - only driver info msgs */
  	if (!dval)
  		return 0;
  	return (1 << dval) - 1;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
116
117
  /* defines only for the constants which don't work well as enums */
  #define ATA_TAG_POISON		0xfafbfcfdU
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
118
119
120
  enum {
  	/* various global constants */
  	LIBATA_MAX_PRD		= ATA_MAX_PRD / 2,
d26fc9551   Alan Cox   libata: Support c...
121
  	LIBATA_DUMB_MAX_PRD	= ATA_MAX_PRD / 4,	/* Worst case */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
122
  	ATA_DEF_QUEUE		= 1,
2ab7db1ff   Tejun Heo   [PATCH] libata-eh...
123
  	/* tag ATA_MAX_QUEUE - 1 is reserved for internal commands */
a6e6ce8e8   Tejun Heo   [PATCH] libata-nc...
124
  	ATA_MAX_QUEUE		= 32,
2ab7db1ff   Tejun Heo   [PATCH] libata-eh...
125
  	ATA_TAG_INTERNAL	= ATA_MAX_QUEUE - 1,
341c2c958   Tejun Heo   libata: consisten...
126
  	ATA_SHORT_PAUSE		= 16,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
127

140b5e591   Tejun Heo   libata: fix ATAPI...
128
  	ATAPI_MAX_DRAIN		= 16 << 10,
b558edddb   Tejun Heo   libata: kill ata_...
129
  	ATA_ALL_DEVICES		= (1 << ATA_MAX_DEVICES) - 1,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
130
131
132
  	ATA_SHT_EMULATED	= 1,
  	ATA_SHT_CMD_PER_LUN	= 1,
  	ATA_SHT_THIS_ID		= -1,
cf482935c   Jeff Garzik   libata: turn on b...
133
  	ATA_SHT_USE_CLUSTERING	= 1,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
134
135
  
  	/* struct ata_device stuff */
949b38af4   Tejun Heo   [PATCH] libata: c...
136
137
  	ATA_DFLAG_LBA		= (1 << 0), /* device supports LBA */
  	ATA_DFLAG_LBA48		= (1 << 1), /* device supports LBA48 */
029f5468b   Jeff Garzik   Merge branch 'ups...
138
  	ATA_DFLAG_CDB_INTR	= (1 << 2), /* device asserts INTRQ when ready for CDB */
88e490340   Tejun Heo   [PATCH] libata-nc...
139
  	ATA_DFLAG_NCQ		= (1 << 3), /* device supports NCQ */
6fc49adb9   Tejun Heo   [PATCH] libata: u...
140
  	ATA_DFLAG_FLUSH_EXT	= (1 << 4), /* do FLUSH_EXT instead of FLUSH */
6746544c3   Tejun Heo   libata: reimpleme...
141
142
  	ATA_DFLAG_ACPI_PENDING	= (1 << 5), /* ACPI resume action pending */
  	ATA_DFLAG_ACPI_FAILED	= (1 << 6), /* ACPI on devcfg has failed */
7d77b2470   Tejun Heo   libata-pmp-prep: ...
143
  	ATA_DFLAG_AN		= (1 << 7), /* AN configured */
911630063   Tejun Heo   libata: automatic...
144
  	ATA_DFLAG_DMADIR	= (1 << 10), /* device requires DMADIR */
2557164e0   Kristen Carlson Accardi   ata: increase all...
145
  	ATA_DFLAG_CFG_MASK	= (1 << 12) - 1,
949b38af4   Tejun Heo   [PATCH] libata: c...
146

2557164e0   Kristen Carlson Accardi   ata: increase all...
147
148
  	ATA_DFLAG_PIO		= (1 << 12), /* device limited to PIO mode */
  	ATA_DFLAG_NCQ_OFF	= (1 << 13), /* device limited to non-NCQ mode */
054a5fbac   Tejun Heo   libata: track SLE...
149
  	ATA_DFLAG_SLEEPING	= (1 << 15), /* device is sleeping */
00115e0f5   Tejun Heo   libata: implement...
150
  	ATA_DFLAG_DUBIOUS_XFER	= (1 << 16), /* data transfer not verified */
45fabbb77   Elias Oltmanns   libata: Implement...
151
  	ATA_DFLAG_NO_UNLOAD	= (1 << 17), /* device doesn't support unload */
445d211b0   Tejun Heo   libata: unlock HP...
152
  	ATA_DFLAG_UNLOCK_HPA	= (1 << 18), /* unlock HPA */
f20ded38a   Tejun Heo   libata: rearrange...
153
  	ATA_DFLAG_INIT_MASK	= (1 << 24) - 1,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
154

f20ded38a   Tejun Heo   libata: rearrange...
155
156
  	ATA_DFLAG_DETACH	= (1 << 24),
  	ATA_DFLAG_DETACHED	= (1 << 25),
abdda7331   Tejun Heo   [PATCH] libata-hp...
157

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
158
159
160
161
162
  	ATA_DEV_UNKNOWN		= 0,	/* unknown device */
  	ATA_DEV_ATA		= 1,	/* ATA device */
  	ATA_DEV_ATA_UNSUP	= 2,	/* ATA device (unsupported) */
  	ATA_DEV_ATAPI		= 3,	/* ATAPI device */
  	ATA_DEV_ATAPI_UNSUP	= 4,	/* ATAPI device (unsupported) */
e0a717526   Tejun Heo   libata-pmp-prep: ...
163
164
165
166
167
  	ATA_DEV_PMP		= 5,	/* SATA port multiplier */
  	ATA_DEV_PMP_UNSUP	= 6,	/* SATA port multiplier (unsupported) */
  	ATA_DEV_SEMB		= 7,	/* SEMB */
  	ATA_DEV_SEMB_UNSUP	= 8,	/* SEMB (unsupported) */
  	ATA_DEV_NONE		= 9,	/* no device */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
168

0c88758b5   Tejun Heo   libata-link: make...
169
  	/* struct ata_link flags */
05944bdf6   Tejun Heo   libata: implement...
170
  	ATA_LFLAG_NO_HRST	= (1 << 1), /* avoid hardreset */
ae791c056   Tejun Heo   libata-pmp-prep: ...
171
172
173
174
  	ATA_LFLAG_NO_SRST	= (1 << 2), /* avoid softreset */
  	ATA_LFLAG_ASSUME_ATA	= (1 << 3), /* assume ATA class */
  	ATA_LFLAG_ASSUME_SEMB	= (1 << 4), /* assume SEMB class */
  	ATA_LFLAG_ASSUME_CLASS	= ATA_LFLAG_ASSUME_ATA | ATA_LFLAG_ASSUME_SEMB,
fd995f703   Tejun Heo   libata-pmp-prep: ...
175
  	ATA_LFLAG_NO_RETRY	= (1 << 5), /* don't retry this link */
f9df58cb2   Tejun Heo   libata-pmp-prep: ...
176
  	ATA_LFLAG_DISABLED	= (1 << 6), /* link is disabled */
18f7ba4c2   Kristen Carlson Accardi   libata/ahci: encl...
177
  	ATA_LFLAG_SW_ACTIVITY	= (1 << 7), /* keep activity stats */
6b7ae9545   Tejun Heo   libata: reimpleme...
178
  	ATA_LFLAG_NO_LPM	= (1 << 8), /* disable LPM on this link */
0c88758b5   Tejun Heo   libata-link: make...
179

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
180
  	/* struct ata_port flags */
949b38af4   Tejun Heo   [PATCH] libata: c...
181
  	ATA_FLAG_SLAVE_POSS	= (1 << 0), /* host supports slave dev */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
182
  					    /* (doesn't imply presence) */
949b38af4   Tejun Heo   [PATCH] libata: c...
183
  	ATA_FLAG_SATA		= (1 << 1),
949b38af4   Tejun Heo   [PATCH] libata: c...
184
185
186
  	ATA_FLAG_NO_ATAPI	= (1 << 6), /* No ATAPI support */
  	ATA_FLAG_PIO_DMA	= (1 << 7), /* PIO cmds via DMA */
  	ATA_FLAG_PIO_LBA48	= (1 << 8), /* Host DMA engine is LBA28 only */
7395acb2c   Tejun Heo   [PATCH] libata: s...
187
188
189
  	ATA_FLAG_PIO_POLLING	= (1 << 9), /* use polling PIO if LLD
  					     * doesn't handle PIO interrupts */
  	ATA_FLAG_NCQ		= (1 << 10), /* host supports NCQ */
2a6e58d27   Rafael J. Wysocki   SATA: Blacklistin...
190
191
  	ATA_FLAG_NO_POWEROFF_SPINDOWN = (1 << 11), /* don't spindown before poweroff */
  	ATA_FLAG_NO_HIBERNATE_SPINDOWN = (1 << 12), /* don't spindown before hibernation */
7395acb2c   Tejun Heo   [PATCH] libata: s...
192
  	ATA_FLAG_DEBUGMSG	= (1 << 13),
388539f3f   Shaohua Li   [libata] add DMA ...
193
  	ATA_FLAG_FPDMA_AA		= (1 << 14), /* driver supports Auto-Activate */
b2a8bbe67   Tejun Heo   libata: implement...
194
  	ATA_FLAG_IGN_SIMPLEX	= (1 << 15), /* ignore SIMPLEX */
f834e49f1   Alan Cox   libata: Add a hos...
195
  	ATA_FLAG_NO_IORDY	= (1 << 16), /* controller lacks iordy */
3cadbcc09   Tejun Heo   libata-acpi: add ...
196
  	ATA_FLAG_ACPI_SATA	= (1 << 17), /* need native SATA ACPI layout */
9f45cbd3f   Kristen Carlson Accardi   [libata] check fo...
197
  	ATA_FLAG_AN		= (1 << 18), /* controller supports AN */
e0a717526   Tejun Heo   libata-pmp-prep: ...
198
  	ATA_FLAG_PMP		= (1 << 19), /* controller supports PMP */
18f7ba4c2   Kristen Carlson Accardi   libata/ahci: encl...
199
200
201
202
  	ATA_FLAG_EM		= (1 << 21), /* driver supports enclosure
  					      * management */
  	ATA_FLAG_SW_ACTIVITY	= (1 << 22), /* driver supports sw activity
  					      * led */
ae01b2493   Tejun Heo   libata: Implement...
203
  	ATA_FLAG_NO_DIPM	= (1 << 23), /* host not happy with DIPM */
949b38af4   Tejun Heo   [PATCH] libata: c...
204

b51e9e5db   Tejun Heo   [PATCH] libata: a...
205
  	/* bits 24:31 of ap->flags are reserved for LLD specific flags */
9ec957f20   Tejun Heo   [PATCH] libata-eh...
206

e3cf95dd6   Alan Cox   ata: Report 16/32...
207

b51e9e5db   Tejun Heo   [PATCH] libata: a...
208
209
210
211
212
213
  	/* struct ata_port pflags */
  	ATA_PFLAG_EH_PENDING	= (1 << 0), /* EH pending */
  	ATA_PFLAG_EH_IN_PROGRESS = (1 << 1), /* EH in progress */
  	ATA_PFLAG_FROZEN	= (1 << 2), /* port is frozen */
  	ATA_PFLAG_RECOVERED	= (1 << 3), /* recovery action performed */
  	ATA_PFLAG_LOADING	= (1 << 4), /* boot/loading probe */
b51e9e5db   Tejun Heo   [PATCH] libata: a...
214
  	ATA_PFLAG_SCSI_HOTPLUG	= (1 << 6), /* SCSI hotplug scheduled */
f4d6d0046   Tejun Heo   libata: ignore EH...
215
  	ATA_PFLAG_INITIALIZING	= (1 << 7), /* being initialized, don't touch */
afaa5c373   Tejun Heo   libata: implement...
216
  	ATA_PFLAG_RESETTING	= (1 << 8), /* reset in progress */
ece180d1c   Tejun Heo   libata: perform p...
217
218
  	ATA_PFLAG_UNLOADING	= (1 << 9), /* driver is being unloaded */
  	ATA_PFLAG_UNLOADED	= (1 << 10), /* driver is unloaded */
949b38af4   Tejun Heo   [PATCH] libata: c...
219

b51e9e5db   Tejun Heo   [PATCH] libata: a...
220
  	ATA_PFLAG_SUSPENDED	= (1 << 17), /* port is suspended (power) */
500530f65   Tejun Heo   [PATCH] libata: r...
221
  	ATA_PFLAG_PM_PENDING	= (1 << 18), /* PM operation pending */
c05e6ff03   Tejun Heo   libata-acpi: impl...
222
  	ATA_PFLAG_INIT_GTM_VALID = (1 << 19), /* initial gtm data valid */
949b38af4   Tejun Heo   [PATCH] libata: c...
223

e3cf95dd6   Alan Cox   ata: Report 16/32...
224
225
  	ATA_PFLAG_PIO32		= (1 << 20),  /* 32bit PIO */
  	ATA_PFLAG_PIO32CHANGE	= (1 << 21),  /* 32bit PIO can be turned on/off */
949b38af4   Tejun Heo   [PATCH] libata: c...
226
227
  	/* struct ata_queued_cmd flags */
  	ATA_QCFLAG_ACTIVE	= (1 << 0), /* cmd not yet ack'd to scsi lyer */
001102d78   Tejun Heo   libata: kill non-...
228
  	ATA_QCFLAG_DMAMAP	= (1 << 1), /* SG table is DMA mapped */
271973677   Tejun Heo   [PATCH] libata: a...
229
  	ATA_QCFLAG_IO		= (1 << 3), /* standard IO command */
e61e06722   Tejun Heo   [PATCH] libata: i...
230
  	ATA_QCFLAG_RESULT_TF	= (1 << 4), /* result TF requested */
da917d69d   Tejun Heo   libata-pmp-prep: ...
231
  	ATA_QCFLAG_CLEAR_EXCL	= (1 << 5), /* clear excl_link on completion */
e027bd36c   Tejun Heo   libata: implement...
232
  	ATA_QCFLAG_QUIET	= (1 << 6), /* don't report device error */
03faab782   Tejun Heo   libata: implement...
233
  	ATA_QCFLAG_RETRY	= (1 << 7), /* retry after failure */
e61e06722   Tejun Heo   [PATCH] libata: i...
234

9ec957f20   Tejun Heo   [PATCH] libata-eh...
235
236
237
  	ATA_QCFLAG_FAILED	= (1 << 16), /* cmd failed and is owned by EH */
  	ATA_QCFLAG_SENSE_VALID	= (1 << 17), /* sense data valid */
  	ATA_QCFLAG_EH_SCHEDULED = (1 << 18), /* EH scheduled (obsolete) */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
238

4e5ec5dba   Alan Cox   [PATCH] libata: B...
239
  	/* host set flags */
cca3974e4   Jeff Garzik   libata: Grand ren...
240
  	ATA_HOST_SIMPLEX	= (1 << 0),	/* Host is simplex, one DMA channel per host only */
ecef72532   Tejun Heo   libata: separate ...
241
  	ATA_HOST_STARTED	= (1 << 1),	/* Host started */
886ad09fc   Arjan van de Ven   libata: Add a per...
242
  	ATA_HOST_PARALLEL_SCAN	= (1 << 2),	/* Ports on this host can be scanned in parallel */
9bec2e385   Jeff Garzik   [libata] Trim tra...
243

b8b275efc   Tejun Heo   ata_piix: fix sus...
244
  	/* bits 24:31 of host->flags are reserved for LLD specific flags */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
245
  	/* various lengths of time */
341c2c958   Tejun Heo   libata: consisten...
246
247
  	ATA_TMOUT_BOOT		= 30000,	/* heuristic */
  	ATA_TMOUT_BOOT_QUICK	=  7000,	/* heuristic */
341c2c958   Tejun Heo   libata: consisten...
248
  	ATA_TMOUT_INTERNAL_QUICK = 5000,
45fabbb77   Elias Oltmanns   libata: Implement...
249
  	ATA_TMOUT_MAX_PARK	= 30000,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
250

b48d58f55   Tejun Heo   libata: use longe...
251
252
253
254
  	/*
  	 * GoVault needs 2s and iVDR disk HHD424020F7SV00 800ms.  2s
  	 * is too much without parallel probing.  Use 2s if parallel
  	 * probing is available, 800ms otherwise.
88ff6eafb   Tejun Heo   libata: implement...
255
  	 */
b48d58f55   Tejun Heo   libata: use longe...
256
257
  	ATA_TMOUT_FF_WAIT_LONG	=  2000,
  	ATA_TMOUT_FF_WAIT	=   800,
88ff6eafb   Tejun Heo   libata: implement...
258

705e76beb   Tejun Heo   libata: restructu...
259
260
261
262
263
264
265
266
267
268
  	/* Spec mandates to wait for ">= 2ms" before checking status
  	 * after reset.  We wait 150ms, because that was the magic
  	 * delay used for ATAPI devices in Hale Landis's ATADRVR, for
  	 * the period of time between when the ATA command register is
  	 * written, and then status is checked.  Because waiting for
  	 * "a while" before checking status is fine, post SRST, we
  	 * perform this magic delay here as well.
  	 *
  	 * Old drivers/ide uses the 2mS rule and then waits for ready.
  	 */
341c2c958   Tejun Heo   libata: consisten...
269
  	ATA_WAIT_AFTER_RESET	=  150,
705e76beb   Tejun Heo   libata: restructu...
270

9dadd45b2   Tejun Heo   libata: move gene...
271
272
273
274
275
  	/* If PMP is supported, we have to do follow-up SRST.  As some
  	 * PMPs don't send D2H Reg FIS after hardreset, LLDs are
  	 * advised to wait only for the following duration before
  	 * doing SRST.
  	 */
e7d3ef13d   Stuart Hayes   libata: change dr...
276
  	ATA_TMOUT_PMP_SRST_WAIT	= 5000,
9dadd45b2   Tejun Heo   libata: move gene...
277

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
  	/* ATA bus states */
  	BUS_UNKNOWN		= 0,
  	BUS_DMA			= 1,
  	BUS_IDLE		= 2,
  	BUS_NOINTR		= 3,
  	BUS_NODATA		= 4,
  	BUS_TIMER		= 5,
  	BUS_PIO			= 6,
  	BUS_EDD			= 7,
  	BUS_IDENTIFY		= 8,
  	BUS_PACKET		= 9,
  
  	/* SATA port states */
  	PORT_UNKNOWN		= 0,
  	PORT_ENABLED		= 1,
  	PORT_DISABLED		= 2,
  
  	/* encoding various smaller bitmaps into a single
7dc951aef   Tejun Heo   libata: xfer_mask...
296
  	 * unsigned long bitmap
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
297
  	 */
70cd071e4   Tejun Heo   libata: clean up ...
298
299
300
  	ATA_NR_PIO_MODES	= 7,
  	ATA_NR_MWDMA_MODES	= 5,
  	ATA_NR_UDMA_MODES	= 8,
1da7b0d01   Tejun Heo   [PATCH] libata: i...
301
302
  
  	ATA_SHIFT_PIO		= 0,
70cd071e4   Tejun Heo   libata: clean up ...
303
304
  	ATA_SHIFT_MWDMA		= ATA_SHIFT_PIO + ATA_NR_PIO_MODES,
  	ATA_SHIFT_UDMA		= ATA_SHIFT_MWDMA + ATA_NR_MWDMA_MODES,
cedc9a478   Jeff Garzik   libata: fix ATAPI...
305
306
  	/* size of buffer to pad xfers ending on unaligned boundaries */
  	ATA_DMA_PAD_SZ		= 4,
949b38af4   Tejun Heo   [PATCH] libata: c...
307

0c247c559   Tejun Heo   [PATCH] libata-eh...
308
309
  	/* ering size */
  	ATA_ERING_SIZE		= 32,
31cc23b34   Tejun Heo   libata-pmp-prep: ...
310
311
312
  	/* return values for ->qc_defer */
  	ATA_DEFER_LINK		= 1,
  	ATA_DEFER_PORT		= 2,
f3e81b19a   Tejun Heo   [PATCH] libata-eh...
313
314
  	/* desc_len for ata_eh_info and context */
  	ATA_EH_DESC_LEN		= 80,
9be1e979f   Tejun Heo   [PATCH] libata-eh...
315
316
  	/* reset / recovery action types */
  	ATA_EH_REVALIDATE	= (1 << 0),
cf4806265   Tejun Heo   libata: prefer ha...
317
318
319
  	ATA_EH_SOFTRESET	= (1 << 1), /* meaningful only in ->prereset */
  	ATA_EH_HARDRESET	= (1 << 2), /* meaningful only in ->prereset */
  	ATA_EH_RESET		= ATA_EH_SOFTRESET | ATA_EH_HARDRESET,
f9df58cb2   Tejun Heo   libata-pmp-prep: ...
320
  	ATA_EH_ENABLE_LINK	= (1 << 3),
45fabbb77   Elias Oltmanns   libata: Implement...
321
  	ATA_EH_PARK		= (1 << 5), /* unload heads and stop I/O */
9be1e979f   Tejun Heo   [PATCH] libata-eh...
322

45fabbb77   Elias Oltmanns   libata: Implement...
323
  	ATA_EH_PERDEV_MASK	= ATA_EH_REVALIDATE | ATA_EH_PARK,
b5b3fa386   Tejun Heo   libata: misc upda...
324
  	ATA_EH_ALL_ACTIONS	= ATA_EH_REVALIDATE | ATA_EH_RESET |
6b7ae9545   Tejun Heo   libata: reimpleme...
325
  				  ATA_EH_ENABLE_LINK,
9be1e979f   Tejun Heo   [PATCH] libata-eh...
326

f3e81b19a   Tejun Heo   [PATCH] libata-eh...
327
  	/* ata_eh_info->flags */
abdda7331   Tejun Heo   [PATCH] libata-hp...
328
  	ATA_EHI_HOTPLUGGED	= (1 << 0),  /* could have been hotplugged */
1cdaf534f   Tejun Heo   [PATCH] libata: i...
329
330
  	ATA_EHI_NO_AUTOPSY	= (1 << 2),  /* no autopsy */
  	ATA_EHI_QUIET		= (1 << 3),  /* be quiet */
e2f3d75fc   Tejun Heo   libata: skip EH a...
331
  	ATA_EHI_NO_RECOVERY	= (1 << 4),  /* no recovery */
abdda7331   Tejun Heo   [PATCH] libata-hp...
332

0d64a233f   Tejun Heo   libata: separate ...
333
334
335
336
  	ATA_EHI_DID_SOFTRESET	= (1 << 16), /* already soft-reset this port */
  	ATA_EHI_DID_HARDRESET	= (1 << 17), /* already soft-reset this port */
  	ATA_EHI_PRINTINFO	= (1 << 18), /* print configuration info */
  	ATA_EHI_SETMODE		= (1 << 19), /* configure transfer mode */
89692c032   Andrea Gelmini   include/linux/lib...
337
  	ATA_EHI_POST_SETMODE	= (1 << 20), /* revalidating after setmode */
f3e81b19a   Tejun Heo   [PATCH] libata-eh...
338

0d64a233f   Tejun Heo   libata: separate ...
339
  	ATA_EHI_DID_RESET	= ATA_EHI_DID_SOFTRESET | ATA_EHI_DID_HARDRESET,
13abf50df   Tejun Heo   [PATCH] libata: i...
340

848e4c68c   Tejun Heo   libata: transfer ...
341
342
  	/* mask of flags to transfer *to* the slave link */
  	ATA_EHI_TO_SLAVE_MASK	= ATA_EHI_NO_AUTOPSY | ATA_EHI_QUIET,
a1e10f7e6   Tejun Heo   libata: move EH r...
343
344
  	/* max tries if error condition is still set after ->error_handler */
  	ATA_EH_MAX_TRIES	= 5,
ad9e27624   Tejun Heo   [PATCH] libata-eh...
345

5040ab67a   Tejun Heo   libata: retry lin...
346
347
  	/* sometimes resuming a link requires several retries */
  	ATA_LINK_RESUME_TRIES	= 5,
14d2bac18   Tejun Heo   [PATCH] libata: i...
348
349
  	/* how hard are we gonna try to probe/recover devices */
  	ATA_PROBE_MAX_TRIES	= 3,
022bdb075   Tejun Heo   [PATCH] libata-eh...
350
  	ATA_EH_DEV_TRIES	= 3,
e0a717526   Tejun Heo   libata-pmp-prep: ...
351
352
  	ATA_EH_PMP_TRIES	= 5,
  	ATA_EH_PMP_LINK_TRIES	= 3,
bf1bff6fa   Tejun Heo   libata: increase ...
353
  	SATA_PMP_RW_TIMEOUT	= 3000,		/* PMP read/write timeout */
f5914a461   Tejun Heo   [PATCH] libata-hp...
354

87fbc5a06   Tejun Heo   libata: improve E...
355
356
357
  	/* This should match the actual table size of
  	 * ata_eh_cmd_timeout_table in libata-eh.c.
  	 */
6013efd88   Tejun Heo   libata: retry fai...
358
  	ATA_EH_CMD_TIMEOUT_TABLE_SIZE = 6,
87fbc5a06   Tejun Heo   libata: improve E...
359

935908598   Alan Cox   [PATCH] libata: i...
360
  	/* Horkage types. May be set by libata or controller on drives
25985edce   Lucas De Marchi   Fix common misspe...
361
  	   (some horkage may be drive/controller pair dependent */
935908598   Alan Cox   [PATCH] libata: i...
362
363
  
  	ATA_HORKAGE_DIAGNOSTIC	= (1 << 0),	/* Failed boot diag */
6919a0a6c   Alan Cox   [PATCH] libata: R...
364
365
  	ATA_HORKAGE_NODMA	= (1 << 1),	/* DMA problems */
  	ATA_HORKAGE_NONCQ	= (1 << 2),	/* Don't use NCQ */
18d6e9d51   Albert Lee   libata: Limit max...
366
  	ATA_HORKAGE_MAX_SEC_128	= (1 << 3),	/* Limit max sects to 128 */
16c55b038   Tejun Heo   libata: implement...
367
  	ATA_HORKAGE_BROKEN_HPA	= (1 << 4),	/* Broken HPA */
50af2fa1e   Tejun Heo   libata: ignore SI...
368
  	ATA_HORKAGE_DISABLE	= (1 << 5),	/* Disable it */
93328e114   Alan Cox   [PATCH] libata: F...
369
  	ATA_HORKAGE_HPA_SIZE	= (1 << 6),	/* native size off by one */
6bbfd53d4   Alan Cox   libata: handle br...
370
  	ATA_HORKAGE_IVB		= (1 << 8),	/* cbl det validity bit bugs */
2d3b8eea7   Albert Lee   libata: workaroun...
371
  	ATA_HORKAGE_STUCK_ERR	= (1 << 9),	/* stuck ERR on next PACKET */
9ce8e3073   Jens Axboe   libata: add white...
372
  	ATA_HORKAGE_BRIDGE_OK	= (1 << 10),	/* no bridge limits */
6a87e42e9   Tejun Heo   libata: implement...
373
374
  	ATA_HORKAGE_ATAPI_MOD16_DMA = (1 << 11), /* use ATAPI DMA for commands
  						    not multiple of 16 bytes */
877d03105   Nick Andrew   trivial: Fix miss...
375
  	ATA_HORKAGE_FIRMWARE_WARN = (1 << 12),	/* firmware update warning */
9062712fa   Tejun Heo   libata: implement...
376
  	ATA_HORKAGE_1_5_GBPS	= (1 << 13),	/* force 1.5 Gbps */
d0cb43b35   Tejun Heo   libata: implement...
377
  	ATA_HORKAGE_NOSETXFER	= (1 << 14),	/* skip SETXFER, SATA only */
388539f3f   Shaohua Li   [libata] add DMA ...
378
  	ATA_HORKAGE_BROKEN_FPDMA_AA	= (1 << 15),	/* skip AA */
43c9c5918   Tejun Heo   libata: implement...
379
  	ATA_HORKAGE_DUMP_ID	= (1 << 16),	/* dump IDENTIFY data */
b3a706014   Alan Cox   libata: Add a dri...
380

2dcb407e6   Jeff Garzik   [libata] checkpat...
381
  	 /* DMA mask for user DMA control: User visible values; DO NOT
b3a706014   Alan Cox   libata: Add a dri...
382
383
384
385
  	    renumber */
  	ATA_DMA_MASK_ATA	= (1 << 0),	/* DMA on ATA Disk */
  	ATA_DMA_MASK_ATAPI	= (1 << 1),	/* DMA on ATAPI */
  	ATA_DMA_MASK_CFA	= (1 << 2),	/* DMA on CF Card */
ceb0c6426   Tejun Heo   libata: add ATAPI...
386
387
388
389
390
  
  	/* ATAPI command types */
  	ATAPI_READ		= 0,		/* READs */
  	ATAPI_WRITE		= 1,		/* WRITEs */
  	ATAPI_READ_CD		= 2,		/* READ CD [MSF] */
e52dcc489   Tejun Heo   libata: ATA_12/16...
391
392
  	ATAPI_PASS_THRU		= 3,		/* SAT pass-thru */
  	ATAPI_MISC		= 4,		/* the rest */
624d5c514   Tejun Heo   libata: reorganiz...
393
394
395
396
397
398
399
400
401
402
  
  	/* Timing constants */
  	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),
3ada9c126   David Daney   libata: Add anoth...
403
404
405
  	ATA_TIMING_DMACK_HOLD	= (1 << 6),
  	ATA_TIMING_CYCLE	= (1 << 7),
  	ATA_TIMING_UDMA		= (1 << 8),
624d5c514   Tejun Heo   libata: reorganiz...
406
407
408
  	ATA_TIMING_ALL		= ATA_TIMING_SETUP | ATA_TIMING_ACT8B |
  				  ATA_TIMING_REC8B | ATA_TIMING_CYC8B |
  				  ATA_TIMING_ACTIVE | ATA_TIMING_RECOVER |
3ada9c126   David Daney   libata: Add anoth...
409
410
  				  ATA_TIMING_DMACK_HOLD | ATA_TIMING_CYCLE |
  				  ATA_TIMING_UDMA,
f1bce7f80   Tejun Heo   libata: cosmetic ...
411
412
413
414
415
  
  	/* ACPI constants */
  	ATA_ACPI_FILTER_SETXFER	= 1 << 0,
  	ATA_ACPI_FILTER_LOCK	= 1 << 1,
  	ATA_ACPI_FILTER_DIPM	= 1 << 2,
fa5b561c4   Tejun Heo   libata: implement...
416
417
  	ATA_ACPI_FILTER_FPDMA_OFFSET = 1 << 3,	/* FPDMA non-zero offset */
  	ATA_ACPI_FILTER_FPDMA_AA = 1 << 4,	/* FPDMA auto activate */
f1bce7f80   Tejun Heo   libata: cosmetic ...
418
419
420
421
  
  	ATA_ACPI_FILTER_DEFAULT	= ATA_ACPI_FILTER_SETXFER |
  				  ATA_ACPI_FILTER_LOCK |
  				  ATA_ACPI_FILTER_DIPM,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
422
  };
7dc951aef   Tejun Heo   libata: xfer_mask...
423
424
425
426
427
428
429
430
  enum ata_xfer_mask {
  	ATA_MASK_PIO		= ((1LU << ATA_NR_PIO_MODES) - 1)
  					<< ATA_SHIFT_PIO,
  	ATA_MASK_MWDMA		= ((1LU << ATA_NR_MWDMA_MODES) - 1)
  					<< ATA_SHIFT_MWDMA,
  	ATA_MASK_UDMA		= ((1LU << ATA_NR_UDMA_MODES) - 1)
  					<< ATA_SHIFT_UDMA,
  };
14be71f4c   Albert Lee   [PATCH] libata: r...
431
  enum hsm_task_states {
c56b14d2a   Albert Lee   [PATCH] libata ir...
432
  	HSM_ST_IDLE,		/* no command on going */
715276470   Albert Lee   libata: reorder H...
433
434
  	HSM_ST_FIRST,		/* (waiting the device to)
  				   write CDB or first data block */
c56b14d2a   Albert Lee   [PATCH] libata ir...
435
436
  	HSM_ST,			/* (waiting the device to) transfer data */
  	HSM_ST_LAST,		/* (waiting the device to) complete command */
c56b14d2a   Albert Lee   [PATCH] libata ir...
437
  	HSM_ST_ERR,		/* error */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
438
  };
a7dac447b   Jeff Garzik   [libata] change a...
439
  enum ata_completion_errors {
11a56d243   Tejun Heo   [PATCH] libata: a...
440
441
442
443
444
445
446
447
448
  	AC_ERR_DEV		= (1 << 0), /* device reported error */
  	AC_ERR_HSM		= (1 << 1), /* host state machine violation */
  	AC_ERR_TIMEOUT		= (1 << 2), /* timeout */
  	AC_ERR_MEDIA		= (1 << 3), /* media error */
  	AC_ERR_ATA_BUS		= (1 << 4), /* ATA bus error */
  	AC_ERR_HOST_BUS		= (1 << 5), /* host bus error */
  	AC_ERR_SYSTEM		= (1 << 6), /* system error */
  	AC_ERR_INVALID		= (1 << 7), /* invalid argument */
  	AC_ERR_OTHER		= (1 << 8), /* unknown */
55a8e2c83   Tejun Heo   [PATCH] libata: i...
449
  	AC_ERR_NODEV_HINT	= (1 << 9), /* polling device detection hint */
5335b7290   Tejun Heo   libata: implement...
450
  	AC_ERR_NCQ		= (1 << 10), /* marker for offending NCQ qc */
a7dac447b   Jeff Garzik   [libata] change a...
451
  };
c93b263e0   Tejun Heo   libata: clean up ...
452
453
454
455
456
457
458
459
460
461
  /*
   * Link power management policy: If you alter this, you also need to
   * alter libata-scsi.c (for the ascii descriptions)
   */
  enum ata_lpm_policy {
  	ATA_LPM_UNKNOWN,
  	ATA_LPM_MAX_POWER,
  	ATA_LPM_MED_POWER,
  	ATA_LPM_MIN_POWER,
  };
6b7ae9545   Tejun Heo   libata: reimpleme...
462
463
464
465
  enum ata_lpm_hints {
  	ATA_LPM_EMPTY		= (1 << 0), /* port empty/probing */
  	ATA_LPM_HIPM		= (1 << 1), /* may use HIPM */
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
466
467
468
469
  /* forward declarations */
  struct scsi_device;
  struct ata_port_operations;
  struct ata_port;
cc0680a58   Tejun Heo   libata-link: link...
470
  struct ata_link;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
471
472
473
  struct ata_queued_cmd;
  
  /* typedefs */
77853bf2b   Tejun Heo   [PATCH] libata: m...
474
  typedef void (*ata_qc_cb_t) (struct ata_queued_cmd *qc);
cc0680a58   Tejun Heo   libata-link: link...
475
476
  typedef int (*ata_prereset_fn_t)(struct ata_link *link, unsigned long deadline);
  typedef int (*ata_reset_fn_t)(struct ata_link *link, unsigned int *classes,
d4b2bab4f   Tejun Heo   libata: add deadl...
477
  			      unsigned long deadline);
cc0680a58   Tejun Heo   libata-link: link...
478
  typedef void (*ata_postreset_fn_t)(struct ata_link *link, unsigned int *classes);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
479

ee959b00c   Tony Jones   SCSI: convert str...
480
  extern struct device_attribute dev_attr_link_power_management_policy;
45fabbb77   Elias Oltmanns   libata: Implement...
481
  extern struct device_attribute dev_attr_unload_heads;
18f7ba4c2   Kristen Carlson Accardi   libata/ahci: encl...
482
483
484
485
486
487
488
489
490
  extern struct device_attribute dev_attr_em_message_type;
  extern struct device_attribute dev_attr_em_message;
  extern struct device_attribute dev_attr_sw_activity;
  
  enum sw_activity {
  	OFF,
  	BLINK_ON,
  	BLINK_OFF,
  };
ca77329fb   Kristen Carlson Accardi   [libata] Link pow...
491

127102aea   Tejun Heo   libata: make SFF ...
492
  #ifdef CONFIG_ATA_SFF
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
493
  struct ata_ioports {
0d5ff5667   Tejun Heo   libata: convert t...
494
495
496
497
498
499
500
501
502
503
504
505
506
  	void __iomem		*cmd_addr;
  	void __iomem		*data_addr;
  	void __iomem		*error_addr;
  	void __iomem		*feature_addr;
  	void __iomem		*nsect_addr;
  	void __iomem		*lbal_addr;
  	void __iomem		*lbam_addr;
  	void __iomem		*lbah_addr;
  	void __iomem		*device_addr;
  	void __iomem		*status_addr;
  	void __iomem		*command_addr;
  	void __iomem		*altstatus_addr;
  	void __iomem		*ctl_addr;
9a7780c9a   Tejun Heo   libata-sff: make ...
507
  #ifdef CONFIG_ATA_BMDMA
0d5ff5667   Tejun Heo   libata: convert t...
508
  	void __iomem		*bmdma_addr;
9a7780c9a   Tejun Heo   libata-sff: make ...
509
  #endif /* CONFIG_ATA_BMDMA */
0d5ff5667   Tejun Heo   libata: convert t...
510
  	void __iomem		*scr_addr;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
511
  };
127102aea   Tejun Heo   libata: make SFF ...
512
  #endif /* CONFIG_ATA_SFF */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
513

cca3974e4   Jeff Garzik   libata: Grand ren...
514
  struct ata_host {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
515
516
  	spinlock_t		lock;
  	struct device 		*dev;
0d5ff5667   Tejun Heo   libata: convert t...
517
  	void __iomem * const	*iomap;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
518
519
  	unsigned int		n_ports;
  	void			*private_data;
029cfd6b7   Tejun Heo   libata: implement...
520
  	struct ata_port_operations *ops;
5444a6f40   Alan Cox   [PATCH] libata: S...
521
  	unsigned long		flags;
c0c362b60   Tejun Heo   libata: implement...
522
523
524
  
  	struct mutex		eh_mutex;
  	struct task_struct	*eh_owner;
fafbae87d   Tejun Heo   libata-acpi: impl...
525
526
527
  #ifdef CONFIG_ATA_ACPI
  	acpi_handle		acpi_handle;
  #endif
032af1ce1   Alan Cox   libata-core: Fix ...
528
  	struct ata_port		*simplex_claimed;	/* channel owning the DMA */
f0eb62b81   Tejun Heo   [PATCH] libata: a...
529
  	struct ata_port		*ports[0];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
  };
  
  struct ata_queued_cmd {
  	struct ata_port		*ap;
  	struct ata_device	*dev;
  
  	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;
5825627c9   FUJITA Tomonori   libata: fix dma_u...
545
  	unsigned int		orig_n_elem;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
546
547
  
  	int			dma_dir;
5a5dbd18a   Mark Lord   libata: add suppo...
548
  	unsigned int		sect_size;
cedc9a478   Jeff Garzik   libata: fix ATAPI...
549

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
550
  	unsigned int		nbytes;
aacda3753   Tejun Heo   libata: implement...
551
  	unsigned int		extrabytes;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
552
  	unsigned int		curbytes;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
553
  	struct scatterlist	sgent;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
554

ff2aeb1eb   Tejun Heo   libata: convert t...
555
  	struct scatterlist	*sg;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
556

b34e90429   Richard Kennedy   libata: reorder a...
557
558
  	struct scatterlist	*cursg;
  	unsigned int		cursg_ofs;
a22e2eb07   Albert Lee   [PATCH] libata: m...
559
  	unsigned int		err_mask;
e61e06722   Tejun Heo   [PATCH] libata: i...
560
  	struct ata_taskfile	result_tf;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
561
  	ata_qc_cb_t		complete_fn;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
562
  	void			*private_data;
1c50dc83f   Darrick J. Wong   [SCSI] sas_ata: a...
563
  	void			*lldd_task;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
564
  };
cca3974e4   Jeff Garzik   libata: Grand ren...
565
  struct ata_port_stats {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
566
567
568
569
  	unsigned long		unhandled_irq;
  	unsigned long		idle_irq;
  	unsigned long		rw_reqbuf;
  };
0c247c559   Tejun Heo   [PATCH] libata-eh...
570
  struct ata_ering_entry {
3884f7b0a   Tejun Heo   libata: clean up ...
571
  	unsigned int		eflags;
0c247c559   Tejun Heo   [PATCH] libata-eh...
572
573
574
575
576
577
578
579
  	unsigned int		err_mask;
  	u64			timestamp;
  };
  
  struct ata_ering {
  	int			cursor;
  	struct ata_ering_entry	ring[ATA_ERING_SIZE];
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
580
  struct ata_device {
9af5c9c97   Tejun Heo   libata-link: intr...
581
  	struct ata_link		*link;
72fa4b742   Tejun Heo   [PATCH] libata-hp...
582
  	unsigned int		devno;		/* 0 or 1 */
75683fe71   Tejun Heo   libata: clean up ...
583
  	unsigned int		horkage;	/* List of broken features */
6866e7bc8   Richard Kennedy   libata: reorder a...
584
  	unsigned long		flags;		/* ATA_DFLAG_xxx */
3edebac41   Tejun Heo   [PATCH] libata-hp...
585
  	struct scsi_device	*sdev;		/* attached SCSI device */
95514fd8f   Bartlomiej Zolnierkiewicz   libata: add priva...
586
  	void			*private_data;
fafbae87d   Tejun Heo   libata-acpi: impl...
587
588
  #ifdef CONFIG_ATA_ACPI
  	acpi_handle		acpi_handle;
398e07826   Tejun Heo   libata-acpi: impl...
589
  	union acpi_object	*gtf_cache;
110f66d25   Tejun Heo   libata: make gtf_...
590
  	unsigned int		gtf_filter;
fafbae87d   Tejun Heo   libata-acpi: impl...
591
  #endif
d9027470b   Gwendal Grignou   [libata] Add ATA ...
592
  	struct device		tdev;
99cf610aa   Tejun Heo   libata: clear dev...
593
  	/* n_sector is CLEAR_BEGIN, read comment above CLEAR_BEGIN */
72fa4b742   Tejun Heo   [PATCH] libata-hp...
594
  	u64			n_sectors;	/* size of device, if ATA */
5920dadfb   Tejun Heo   libata: accept la...
595
  	u64			n_native_sectors; /* native size, if ATA */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
596
  	unsigned int		class;		/* ATA_DEV_xxx */
45fabbb77   Elias Oltmanns   libata: Implement...
597
  	unsigned long		unpark_deadline;
e0a717526   Tejun Heo   libata-pmp-prep: ...
598

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
599
600
601
602
  	u8			pio_mode;
  	u8			dma_mode;
  	u8			xfer_mode;
  	unsigned int		xfer_shift;	/* ATA_SHIFT_xxx */
8cbd6df1f   Albert Lee   [PATCH] libata CH...
603
604
  	unsigned int		multi_count;	/* sectors count for
  						   READ/WRITE MULTIPLE */
b00eec1d5   Tejun Heo   [PATCH] libata: a...
605
  	unsigned int		max_sectors;	/* per-device max sectors */
6e7846e9c   Tejun Heo   [PATCH] libata: m...
606
  	unsigned int		cdb_len;
8bf62ecee   Albert Lee   [libata] C/H/S su...
607

acf356b12   Tejun Heo   [PATCH] libata: a...
608
  	/* per-dev xfer mask */
7dc951aef   Tejun Heo   libata: xfer_mask...
609
610
611
  	unsigned long		pio_mask;
  	unsigned long		mwdma_mask;
  	unsigned long		udma_mask;
acf356b12   Tejun Heo   [PATCH] libata: a...
612

8bf62ecee   Albert Lee   [libata] C/H/S su...
613
614
615
616
  	/* for CHS addressing */
  	u16			cylinders;	/* Number of cylinders */
  	u16			heads;		/* Number of heads */
  	u16			sectors;	/* Number of sectors per track */
0c247c559   Tejun Heo   [PATCH] libata-eh...
617

f7e989301   Jeff Garzik   [libata] linux/li...
618
619
620
621
  	union {
  		u16		id[ATA_ID_WORDS]; /* IDENTIFY xxx DEVICE data */
  		u32		gscr[SATA_PMP_GSCR_DWORDS]; /* PMP GSCR block */
  	};
99cf610aa   Tejun Heo   libata: clear dev...
622
623
624
625
626
  
  	/* error history */
  	int			spdn_cnt;
  	/* ering is CLEAR_END, read comment above CLEAR_END */
  	struct ata_ering	ering;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
627
  };
99cf610aa   Tejun Heo   libata: clear dev...
628
629
  /* Fields between ATA_DEVICE_CLEAR_BEGIN and ATA_DEVICE_CLEAR_END are
   * cleared to zero on ata_dev_init().
72fa4b742   Tejun Heo   [PATCH] libata-hp...
630
   */
99cf610aa   Tejun Heo   libata: clear dev...
631
632
  #define ATA_DEVICE_CLEAR_BEGIN		offsetof(struct ata_device, n_sectors)
  #define ATA_DEVICE_CLEAR_END		offsetof(struct ata_device, ering)
72fa4b742   Tejun Heo   [PATCH] libata-hp...
633

f3e81b19a   Tejun Heo   [PATCH] libata-eh...
634
635
636
637
638
  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 */
47005f255   Tejun Heo   [PATCH] libata: i...
639
  	unsigned int		dev_action[ATA_MAX_DEVICES]; /* dev EH action */
f3e81b19a   Tejun Heo   [PATCH] libata-eh...
640
  	unsigned int		flags;		/* ATA_EHI_* flags */
abdda7331   Tejun Heo   [PATCH] libata-hp...
641

abdda7331   Tejun Heo   [PATCH] libata-hp...
642
  	unsigned int		probe_mask;
f3e81b19a   Tejun Heo   [PATCH] libata-eh...
643
644
645
646
647
648
649
  	char			desc[ATA_EH_DESC_LEN];
  	int			desc_len;
  };
  
  struct ata_eh_context {
  	struct ata_eh_info	i;
  	int			tries[ATA_MAX_DEVICES];
87fbc5a06   Tejun Heo   libata: improve E...
650
651
  	int			cmd_timeout_idx[ATA_MAX_DEVICES]
  					       [ATA_EH_CMD_TIMEOUT_TABLE_SIZE];
abdda7331   Tejun Heo   [PATCH] libata-hp...
652
653
  	unsigned int		classes[ATA_MAX_DEVICES];
  	unsigned int		did_probe_mask;
45fabbb77   Elias Oltmanns   libata: Implement...
654
  	unsigned int		unloaded_mask;
00115e0f5   Tejun Heo   libata: implement...
655
656
  	unsigned int		saved_ncq_enabled;
  	u8			saved_xfer_mode[ATA_MAX_DEVICES];
0a2c0f561   Tejun Heo   libata: improve E...
657
658
  	/* timestamp for the last reset attempt or success */
  	unsigned long		last_reset;
f3e81b19a   Tejun Heo   [PATCH] libata-eh...
659
  };
64578a3de   Tejun Heo   libata-acpi: impl...
660
661
662
663
664
665
666
667
668
669
  struct ata_acpi_drive
  {
  	u32 pio;
  	u32 dma;
  } __packed;
  
  struct ata_acpi_gtm {
  	struct ata_acpi_drive drive[2];
  	u32 flags;
  } __packed;
9af5c9c97   Tejun Heo   libata-link: intr...
670
671
  struct ata_link {
  	struct ata_port		*ap;
8989805d6   Tejun Heo   libata-link: add ...
672
  	int			pmp;		/* port multiplier port # */
9af5c9c97   Tejun Heo   libata-link: intr...
673

d9027470b   Gwendal Grignou   [libata] Add ATA ...
674
  	struct device		tdev;
9af5c9c97   Tejun Heo   libata-link: intr...
675
676
  	unsigned int		active_tag;	/* active tag on this link */
  	u32			sactive;	/* active NCQ commands */
0c88758b5   Tejun Heo   libata-link: make...
677
  	unsigned int		flags;		/* ATA_LFLAG_xxx */
d127ea7b8   Tejun Heo   libata: restore S...
678
  	u32			saved_scontrol;	/* SControl on probe */
9af5c9c97   Tejun Heo   libata-link: intr...
679
680
681
  	unsigned int		hw_sata_spd_limit;
  	unsigned int		sata_spd_limit;
  	unsigned int		sata_spd;	/* current SATA PHY speed */
6b7ae9545   Tejun Heo   libata: reimpleme...
682
  	enum ata_lpm_policy	lpm_policy;
9af5c9c97   Tejun Heo   libata-link: intr...
683
684
685
686
687
688
689
690
  
  	/* 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];
  };
d9027470b   Gwendal Grignou   [libata] Add ATA ...
691
692
  #define ATA_LINK_CLEAR_BEGIN		offsetof(struct ata_link, active_tag)
  #define ATA_LINK_CLEAR_END		offsetof(struct ata_link, device[0])
9af5c9c97   Tejun Heo   libata-link: intr...
693

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
694
  struct ata_port {
cca3974e4   Jeff Garzik   libata: Grand ren...
695
  	struct Scsi_Host	*scsi_host; /* our co-allocated scsi host */
029cfd6b7   Tejun Heo   libata: implement...
696
  	struct ata_port_operations *ops;
ba6a13083   Jeff Garzik   [libata] Add host...
697
  	spinlock_t		*lock;
e3cf95dd6   Alan Cox   ata: Report 16/32...
698
699
  	/* Flags owned by the EH context. Only EH should touch these once the
  	   port is active */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
700
  	unsigned long		flags;	/* ATA_FLAG_xxx */
e3cf95dd6   Alan Cox   ata: Report 16/32...
701
  	/* Flags that change dynamically, protected by ap->lock */
b51e9e5db   Tejun Heo   [PATCH] libata: a...
702
  	unsigned int		pflags; /* ATA_PFLAG_xxx */
44877b4e2   Tejun Heo   libata: s/ap->id/...
703
704
  	unsigned int		print_id; /* user visible unique port ID */
  	unsigned int		port_no; /* 0 based port no. inside the host */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
705

127102aea   Tejun Heo   libata: make SFF ...
706
  #ifdef CONFIG_ATA_SFF
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
707
  	struct ata_ioports	ioaddr;	/* ATA cmd/ctl/dma register blocks */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
708
709
  	u8			ctl;	/* cache of ATA control register */
  	u8			last_ctl;	/* Cache last written value */
ea3c64506   Gwendal Grignou   libata-sff: Reena...
710
  	struct ata_link*	sff_pio_task_link; /* link currently used */
c429137a6   Tejun Heo   libata-sff: port_...
711
  	struct delayed_work	sff_pio_task;
9a7780c9a   Tejun Heo   libata-sff: make ...
712
  #ifdef CONFIG_ATA_BMDMA
f60d70113   Tejun Heo   libata-sff: prd i...
713
714
  	struct ata_bmdma_prd	*bmdma_prd;	/* BMDMA SG list */
  	dma_addr_t		bmdma_prd_dma;	/* and its DMA mapping */
9a7780c9a   Tejun Heo   libata-sff: make ...
715
  #endif /* CONFIG_ATA_BMDMA */
5fe7454aa   Tejun Heo   libata-sff: ap->[...
716
  #endif /* CONFIG_ATA_SFF */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
717
718
719
720
  	unsigned int		pio_mask;
  	unsigned int		mwdma_mask;
  	unsigned int		udma_mask;
  	unsigned int		cbl;	/* cable type; ATA_CBL_xxx */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
721
722
  
  	struct ata_queued_cmd	qcmd[ATA_MAX_QUEUE];
8a8bc2233   Tejun Heo   libata: revert co...
723
  	unsigned long		qc_allocated;
dedaf2b03   Tejun Heo   [PATCH] libata-nc...
724
  	unsigned int		qc_active;
da917d69d   Tejun Heo   libata-pmp-prep: ...
725
  	int			nr_active_links; /* #links with active qcs */
dedaf2b03   Tejun Heo   [PATCH] libata-nc...
726

b1c72916a   Tejun Heo   libata: implement...
727
728
  	struct ata_link		link;		/* host default link */
  	struct ata_link		*slave_link;	/* see ata_slave_link_init() */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
729

8989805d6   Tejun Heo   libata-link: add ...
730
731
  	int			nr_pmp_links;	/* nr of available PMP links */
  	struct ata_link		*pmp_link;	/* array of PMP links */
da917d69d   Tejun Heo   libata-pmp-prep: ...
732
  	struct ata_link		*excl_link;	/* for PMP qc exclusion */
8989805d6   Tejun Heo   libata-link: add ...
733

cca3974e4   Jeff Garzik   libata: Grand ren...
734
735
  	struct ata_port_stats	stats;
  	struct ata_host		*host;
2f1f610b6   Brian King   [PATCH] libata: R...
736
  	struct device 		*dev;
d9027470b   Gwendal Grignou   [libata] Add ATA ...
737
  	struct device		tdev;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
738

ad72cf988   Tejun Heo   libata: take adva...
739
  	struct mutex		scsi_scan_mutex;
52bad64d9   David Howells   WorkStruct: Separ...
740
  	struct delayed_work	hotplug_task;
3b01b8af2   Jeff Garzik   libata: fix build...
741
  	struct work_struct	scsi_rescan_task;
86e45b6bd   Tejun Heo   [PATCH] libata: i...
742

14be71f4c   Albert Lee   [PATCH] libata: r...
743
  	unsigned int		hsm_task_state;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
744

bfd605795   Randy Dunlap   From: Borislav Pe...
745
  	u32			msg_enable;
a72ec4ce6   Tejun Heo   [PATCH] libata: i...
746
  	struct list_head	eh_done_q;
c6cf9e99d   Tejun Heo   [PATCH] libata: i...
747
  	wait_queue_head_t	eh_wait_q;
a1e10f7e6   Tejun Heo   libata: move EH r...
748
  	int			eh_tries;
45fabbb77   Elias Oltmanns   libata: Implement...
749
  	struct completion	park_req_pending;
bfd605795   Randy Dunlap   From: Borislav Pe...
750

500530f65   Tejun Heo   [PATCH] libata: r...
751
752
  	pm_message_t		pm_mesg;
  	int			*pm_result;
6b7ae9545   Tejun Heo   libata: reimpleme...
753
  	enum ata_lpm_policy	target_lpm_policy;
500530f65   Tejun Heo   [PATCH] libata: r...
754

5ddf24c5e   Tejun Heo   libata: implement...
755
756
  	struct timer_list	fastdrain_timer;
  	unsigned long		fastdrain_cnt;
18f7ba4c2   Kristen Carlson Accardi   libata/ahci: encl...
757
  	int			em_message_type;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
758
  	void			*private_data;
fe635c7e9   Tejun Heo   [PATCH] libata: u...
759

fafbae87d   Tejun Heo   libata-acpi: impl...
760
761
  #ifdef CONFIG_ATA_ACPI
  	acpi_handle		acpi_handle;
c05e6ff03   Tejun Heo   libata-acpi: impl...
762
  	struct ata_acpi_gtm	__acpi_init_gtm; /* use ata_acpi_init_gtm() */
fafbae87d   Tejun Heo   libata-acpi: impl...
763
  #endif
84bda12af   Tejun Heo   libata: align ap-...
764
765
  	/* owned by EH */
  	u8			sector_buf[ATA_SECT_SIZE] ____cacheline_aligned;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
766
  };
029cfd6b7   Tejun Heo   libata: implement...
767
768
769
770
771
772
  /* The following initializer overrides a method to NULL whether one of
   * its parent has the method defined or not.  This is equivalent to
   * ERR_PTR(-ENOENT).  Unfortunately, ERR_PTR doesn't render a constant
   * expression and thus can't be used as an initializer.
   */
  #define ATA_OP_NULL		(void *)(unsigned long)(-ENOENT)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
773
  struct ata_port_operations {
c1bc899f5   Tejun Heo   libata: reorganiz...
774
775
776
777
778
779
780
  	/*
  	 * Command execution
  	 */
  	int  (*qc_defer)(struct ata_queued_cmd *qc);
  	int  (*check_atapi_dma)(struct ata_queued_cmd *qc);
  	void (*qc_prep)(struct ata_queued_cmd *qc);
  	unsigned int (*qc_issue)(struct ata_queued_cmd *qc);
22183bf56   Tejun Heo   libata: add qc_fi...
781
  	bool (*qc_fill_rtf)(struct ata_queued_cmd *qc);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
782

c1bc899f5   Tejun Heo   libata: reorganiz...
783
784
785
786
787
788
789
790
  	/*
  	 * Configuration and exception handling
  	 */
  	int  (*cable_detect)(struct ata_port *ap);
  	unsigned long (*mode_filter)(struct ata_device *dev, unsigned long xfer_mask);
  	void (*set_piomode)(struct ata_port *ap, struct ata_device *dev);
  	void (*set_dmamode)(struct ata_port *ap, struct ata_device *dev);
  	int  (*set_mode)(struct ata_link *link, struct ata_device **r_failed_dev);
963e4975c   Alan Cox   pata_it821x: Driv...
791
  	unsigned int (*read_id)(struct ata_device *dev, struct ata_taskfile *tf, u16 *id);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
792

c1bc899f5   Tejun Heo   libata: reorganiz...
793
  	void (*dev_config)(struct ata_device *dev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
794

c1bc899f5   Tejun Heo   libata: reorganiz...
795
796
  	void (*freeze)(struct ata_port *ap);
  	void (*thaw)(struct ata_port *ap);
a1efdaba2   Tejun Heo   libata: make rese...
797
798
799
800
801
802
803
804
  	ata_prereset_fn_t	prereset;
  	ata_reset_fn_t		softreset;
  	ata_reset_fn_t		hardreset;
  	ata_postreset_fn_t	postreset;
  	ata_prereset_fn_t	pmp_prereset;
  	ata_reset_fn_t		pmp_softreset;
  	ata_reset_fn_t		pmp_hardreset;
  	ata_postreset_fn_t	pmp_postreset;
c1bc899f5   Tejun Heo   libata: reorganiz...
805
  	void (*error_handler)(struct ata_port *ap);
c96f1732e   Alan Cox   [libata] Improve ...
806
  	void (*lost_interrupt)(struct ata_port *ap);
c1bc899f5   Tejun Heo   libata: reorganiz...
807
808
809
810
811
  	void (*post_internal_cmd)(struct ata_queued_cmd *qc);
  
  	/*
  	 * Optional features
  	 */
82ef04fb4   Tejun Heo   libata: make SCR ...
812
813
  	int  (*scr_read)(struct ata_link *link, unsigned int sc_reg, u32 *val);
  	int  (*scr_write)(struct ata_link *link, unsigned int sc_reg, u32 val);
c1bc899f5   Tejun Heo   libata: reorganiz...
814
815
  	void (*pmp_attach)(struct ata_port *ap);
  	void (*pmp_detach)(struct ata_port *ap);
6b7ae9545   Tejun Heo   libata: reimpleme...
816
817
  	int  (*set_lpm)(struct ata_link *link, enum ata_lpm_policy policy,
  			unsigned hints);
c1bc899f5   Tejun Heo   libata: reorganiz...
818
819
820
821
822
823
824
825
826
  
  	/*
  	 * Start, stop, suspend and resume
  	 */
  	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);
127102aea   Tejun Heo   libata: make SFF ...
827
  #ifdef CONFIG_ATA_SFF
c1bc899f5   Tejun Heo   libata: reorganiz...
828
829
830
  	/*
  	 * SFF / taskfile oriented ops
  	 */
5682ed33a   Tejun Heo   libata: rename SF...
831
  	void (*sff_dev_select)(struct ata_port *ap, unsigned int device);
41dec29bc   Sergei Shtylyov   libata: introduce...
832
  	void (*sff_set_devctl)(struct ata_port *ap, u8 ctl);
5682ed33a   Tejun Heo   libata: rename SF...
833
834
835
836
837
838
839
840
  	u8   (*sff_check_status)(struct ata_port *ap);
  	u8   (*sff_check_altstatus)(struct ata_port *ap);
  	void (*sff_tf_load)(struct ata_port *ap, const struct ata_taskfile *tf);
  	void (*sff_tf_read)(struct ata_port *ap, struct ata_taskfile *tf);
  	void (*sff_exec_command)(struct ata_port *ap,
  				 const struct ata_taskfile *tf);
  	unsigned int (*sff_data_xfer)(struct ata_device *dev,
  			unsigned char *buf, unsigned int buflen, int rw);
e42a542ba   Sergei Shtylyov   libata: make sff_...
841
  	void (*sff_irq_on)(struct ata_port *);
27943620c   Tejun Heo   libata: implement...
842
  	bool (*sff_irq_check)(struct ata_port *);
5682ed33a   Tejun Heo   libata: rename SF...
843
  	void (*sff_irq_clear)(struct ata_port *);
8244cd059   Tejun Heo   libata-sff: renam...
844
  	void (*sff_drain_fifo)(struct ata_queued_cmd *qc);
5682ed33a   Tejun Heo   libata: rename SF...
845

9a7780c9a   Tejun Heo   libata-sff: make ...
846
  #ifdef CONFIG_ATA_BMDMA
c1bc899f5   Tejun Heo   libata: reorganiz...
847
848
849
850
  	void (*bmdma_setup)(struct ata_queued_cmd *qc);
  	void (*bmdma_start)(struct ata_queued_cmd *qc);
  	void (*bmdma_stop)(struct ata_queued_cmd *qc);
  	u8   (*bmdma_status)(struct ata_port *ap);
9a7780c9a   Tejun Heo   libata-sff: make ...
851
  #endif /* CONFIG_ATA_BMDMA */
127102aea   Tejun Heo   libata: make SFF ...
852
  #endif /* CONFIG_ATA_SFF */
c1bc899f5   Tejun Heo   libata: reorganiz...
853

18f7ba4c2   Kristen Carlson Accardi   libata/ahci: encl...
854
855
856
857
858
859
  	ssize_t (*em_show)(struct ata_port *ap, char *buf);
  	ssize_t (*em_store)(struct ata_port *ap, const char *message,
  			    size_t size);
  	ssize_t (*sw_activity_show)(struct ata_device *dev, char *buf);
  	ssize_t (*sw_activity_store)(struct ata_device *dev,
  				     enum sw_activity val);
c1bc899f5   Tejun Heo   libata: reorganiz...
860
861
  	/*
  	 * Obsolete
9ec957f20   Tejun Heo   [PATCH] libata-eh...
862
  	 */
c1bc899f5   Tejun Heo   libata: reorganiz...
863
864
  	void (*phy_reset)(struct ata_port *ap);
  	void (*eng_timeout)(struct ata_port *ap);
029cfd6b7   Tejun Heo   libata: implement...
865
866
867
868
869
870
  
  	/*
  	 * ->inherits must be the last field and all the preceding
  	 * fields must be pointers.
  	 */
  	const struct ata_port_operations	*inherits;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
871
872
873
  };
  
  struct ata_port_info {
cca3974e4   Jeff Garzik   libata: Grand ren...
874
  	unsigned long		flags;
0c88758b5   Tejun Heo   libata-link: make...
875
  	unsigned long		link_flags;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
876
877
878
  	unsigned long		pio_mask;
  	unsigned long		mwdma_mask;
  	unsigned long		udma_mask;
029cfd6b7   Tejun Heo   libata: implement...
879
  	struct ata_port_operations *port_ops;
e99f8b5ef   Alan Cox   [PATCH] libata: p...
880
  	void 			*private_data;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
881
  };
452503f99   Alan Cox   Add ide-timing fu...
882
883
884
885
886
887
888
889
  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 */
3ada9c126   David Daney   libata: Add anoth...
890
  	unsigned short dmack_hold;	/* tj */
452503f99   Alan Cox   Add ide-timing fu...
891
892
893
  	unsigned short cycle;		/* t0 */
  	unsigned short udma;		/* t2CYCTYP/2 */
  };
624d5c514   Tejun Heo   libata: reorganiz...
894
895
896
  /*
   * Core layer - drivers/ata/libata-core.c
   */
e9c839142   Tejun Heo   [PATCH] libata: c...
897
898
899
  extern const unsigned long sata_deb_timing_normal[];
  extern const unsigned long sata_deb_timing_hotplug[];
  extern const unsigned long sata_deb_timing_long[];
029cfd6b7   Tejun Heo   libata: implement...
900
  extern struct ata_port_operations ata_dummy_port_ops;
21b0ad4fb   Tejun Heo   libata: add init ...
901
  extern const struct ata_port_info ata_dummy_port_info;
dd5b06c49   Tejun Heo   [PATCH] libata: i...
902

e9c839142   Tejun Heo   [PATCH] libata: c...
903
904
905
906
907
908
909
910
  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;
  }
d7bb4cc75   Tejun Heo   [PATCH] libata-hp...
911

dd5b06c49   Tejun Heo   [PATCH] libata: i...
912
913
914
915
  static inline int ata_port_is_dummy(struct ata_port *ap)
  {
  	return ap->ops == &ata_dummy_port_ops;
  }
936fd7328   Tejun Heo   libata-link: link...
916
  extern int sata_set_spd(struct ata_link *link);
0aa1113d5   Tejun Heo   libata: separate ...
917
  extern int ata_std_prereset(struct ata_link *link, unsigned long deadline);
aa2731ad9   Tejun Heo   libata: separate ...
918
919
  extern int ata_wait_after_reset(struct ata_link *link, unsigned long deadline,
  				int (*check_ready)(struct ata_link *link));
936fd7328   Tejun Heo   libata-link: link...
920
921
922
923
  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);
1152b2617   Tejun Heo   libata: implement...
924
925
  extern int sata_link_scr_lpm(struct ata_link *link, enum ata_lpm_policy policy,
  			     bool spm_wakeup);
cc0680a58   Tejun Heo   libata-link: link...
926
  extern int sata_link_hardreset(struct ata_link *link,
9dadd45b2   Tejun Heo   libata: move gene...
927
928
  			const unsigned long *timing, unsigned long deadline,
  			bool *online, int (*check_ready)(struct ata_link *));
57c9efdfb   Tejun Heo   libata: implement...
929
930
  extern int sata_std_hardreset(struct ata_link *link, unsigned int *class,
  			      unsigned long deadline);
203c75b82   Tejun Heo   libata: separate ...
931
  extern void ata_std_postreset(struct ata_link *link, unsigned int *classes);
2855568b1   Jeff Garzik   [libata] struct p...
932

f31871951   Tejun Heo   libata: separate ...
933
  extern struct ata_host *ata_host_alloc(struct device *dev, int max_ports);
f5cda2572   Tejun Heo   libata: implement...
934
935
  extern struct ata_host *ata_host_alloc_pinfo(struct device *dev,
  			const struct ata_port_info * const * ppi, int n_ports);
b1c72916a   Tejun Heo   libata: implement...
936
  extern int ata_slave_link_init(struct ata_port *ap);
ecef72532   Tejun Heo   libata: separate ...
937
  extern int ata_host_start(struct ata_host *host);
f31871951   Tejun Heo   libata: separate ...
938
939
  extern int ata_host_register(struct ata_host *host,
  			     struct scsi_host_template *sht);
f5cda2572   Tejun Heo   libata: implement...
940
941
942
  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);
0529c159d   Tejun Heo   libata: implement...
943
  extern void ata_host_detach(struct ata_host *host);
cca3974e4   Jeff Garzik   libata: Grand ren...
944
  extern void ata_host_init(struct ata_host *, struct device *,
029cfd6b7   Tejun Heo   libata: implement...
945
  			  unsigned long, struct ata_port_operations *);
193515d51   Jeff Garzik   [libata] eliminat...
946
  extern int ata_scsi_detect(struct scsi_host_template *sht);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
947
  extern int ata_scsi_ioctl(struct scsi_device *dev, int cmd, void __user *arg);
f281233d3   Jeff Garzik   SCSI host lock pu...
948
  extern int ata_scsi_queuecmd(struct Scsi_Host *h, struct scsi_cmnd *cmd);
94be9a58d   Jeff Garzik   [libata] get-iden...
949
950
  extern int ata_sas_scsi_ioctl(struct ata_port *ap, struct scsi_device *dev,
  			    int cmd, void __user *arg);
80289167f   Brian King   [PATCH] libata: A...
951
  extern void ata_sas_port_destroy(struct ata_port *);
cca3974e4   Jeff Garzik   libata: Grand ren...
952
  extern struct ata_port *ata_sas_port_alloc(struct ata_host *,
80289167f   Brian King   [PATCH] libata: A...
953
954
955
956
957
  					   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 *);
b27dcfb06   Jeff Garzik   [libata] avoid ne...
958
  extern int ata_sas_queuecmd(struct scsi_cmnd *cmd, struct ata_port *ap);
936fd7328   Tejun Heo   libata-link: link...
959
960
961
962
  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);
b5b3fa386   Tejun Heo   libata: misc upda...
963
964
  extern bool ata_link_online(struct ata_link *link);
  extern bool ata_link_offline(struct ata_link *link);
6ffa01d88   Tejun Heo   libata: add CONFI...
965
  #ifdef CONFIG_PM
cca3974e4   Jeff Garzik   libata: Grand ren...
966
967
  extern int ata_host_suspend(struct ata_host *host, pm_message_t mesg);
  extern void ata_host_resume(struct ata_host *host);
6ffa01d88   Tejun Heo   libata: add CONFI...
968
  #endif
67846b301   Jeff Garzik   libata: add ata_r...
969
  extern int ata_ratelimit(void);
97750cebb   Tejun Heo   libata: add @ap t...
970
971
972
  extern void ata_msleep(struct ata_port *ap, unsigned int msecs);
  extern u32 ata_wait_register(struct ata_port *ap, void __iomem *reg, u32 mask,
  			u32 val, unsigned long interval, unsigned long timeout);
436d34b36   Tejun Heo   libata: uninline ...
973
  extern int atapi_cmd_type(u8 opcode);
9977126c4   Tejun Heo   libata: add @is_c...
974
975
  extern void ata_tf_to_fis(const struct ata_taskfile *tf,
  			  u8 pmp, int is_cmd, u8 *fis);
057ace5e7   Jeff Garzik   libata: const-ifi...
976
  extern void ata_tf_from_fis(const u8 *fis, struct ata_taskfile *tf);
7dc951aef   Tejun Heo   libata: xfer_mask...
977
978
979
980
981
982
983
984
985
986
  extern unsigned long ata_pack_xfermask(unsigned long pio_mask,
  			unsigned long mwdma_mask, unsigned long udma_mask);
  extern void ata_unpack_xfermask(unsigned long xfer_mask,
  			unsigned long *pio_mask, unsigned long *mwdma_mask,
  			unsigned long *udma_mask);
  extern u8 ata_xfer_mask2mode(unsigned long xfer_mask);
  extern unsigned long ata_xfer_mode2mask(u8 xfer_mode);
  extern int ata_xfer_mode2shift(unsigned long xfer_mode);
  extern const char *ata_mode_string(unsigned long xfer_mask);
  extern unsigned long ata_id_xfermask(const u16 *id);
31cc23b34   Tejun Heo   libata-pmp-prep: ...
987
  extern int ata_std_qc_defer(struct ata_queued_cmd *qc);
e46834cd2   Brian King   [PATCH] libata: A...
988
  extern void ata_noop_qc_prep(struct ata_queued_cmd *qc);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
989
990
  extern void ata_sg_init(struct ata_queued_cmd *qc, struct scatterlist *sg,
  		 unsigned int n_elem);
057ace5e7   Jeff Garzik   libata: const-ifi...
991
  extern unsigned int ata_dev_classify(const struct ata_taskfile *tf);
10305f0f8   Alan Cox   Add id_to_dma_mod...
992
  extern void ata_dev_disable(struct ata_device *adev);
6a62a04d4   Tejun Heo   [PATCH] libata: r...
993
994
995
996
  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);
963e4975c   Alan Cox   pata_it821x: Driv...
997
998
  extern unsigned int ata_do_dev_read_id(struct ata_device *dev,
  					struct ata_taskfile *tf, u16 *id);
f686bcb80   Tejun Heo   [PATCH] libata-eh...
999
  extern void ata_qc_complete(struct ata_queued_cmd *qc);
79f97dadf   Tejun Heo   libata: drop @fin...
1000
  extern int ata_qc_complete_multiple(struct ata_port *ap, u32 qc_active);
b27dcfb06   Jeff Garzik   [libata] avoid ne...
1001
  extern void ata_scsi_simulate(struct ata_device *dev, struct scsi_cmnd *cmd);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1002
1003
1004
  extern int ata_std_bios_param(struct scsi_device *sdev,
  			      struct block_device *bdev,
  			      sector_t capacity, int geom[]);
d8d9129ea   Tejun Heo   libata: implement...
1005
  extern void ata_scsi_unlock_native_capacity(struct scsi_device *sdev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1006
  extern int ata_scsi_slave_config(struct scsi_device *sdev);
83c47bcb3   Tejun Heo   [PATCH] libata-hp...
1007
  extern void ata_scsi_slave_destroy(struct scsi_device *sdev);
a6e6ce8e8   Tejun Heo   [PATCH] libata-nc...
1008
  extern int ata_scsi_change_queue_depth(struct scsi_device *sdev,
e881a172d   Mike Christie   [SCSI] modify cha...
1009
  				       int queue_depth, int reason);
f6e67035a   Dan Williams   [SCSI] libsas,lib...
1010
1011
  extern int __ata_change_queue_depth(struct ata_port *ap, struct scsi_device *sdev,
  				    int queue_depth, int reason);
3373efd89   Tejun Heo   [PATCH] libata: u...
1012
  extern struct ata_device *ata_dev_pair(struct ata_device *adev);
0260731f0   Tejun Heo   libata-link: link...
1013
  extern int ata_do_set_mode(struct ata_link *link, struct ata_device **r_failed_dev);
0e0b494ca   James Bottomley   libata: separate ...
1014
1015
  extern void ata_scsi_port_error_handler(struct Scsi_Host *host, struct ata_port *ap);
  extern void ata_scsi_cmd_error_handler(struct Scsi_Host *host, struct ata_port *ap, struct list_head *eh_q);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1016

be0d18dff   Alan Cox   libata: cable det...
1017
1018
1019
  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);
c88f90c37   Tejun Heo   libata: add ATA_C...
1020
  extern int ata_cable_ignore(struct ata_port *ap);
be0d18dff   Alan Cox   libata: cable det...
1021
  extern int ata_cable_unknown(struct ata_port *ap);
624d5c514   Tejun Heo   libata: reorganiz...
1022
  /* Timing helpers */
1bc4ccfff   Alan Cox   [PATCH] libata: a...
1023
  extern unsigned int ata_pio_need_iordy(const struct ata_device *);
6357357ca   Tejun Heo   libata: export xf...
1024
  extern const struct ata_timing *ata_timing_find_mode(u8 xfer_mode);
452503f99   Alan Cox   Add ide-timing fu...
1025
1026
1027
1028
1029
  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);
a0f79b929   Tejun Heo   libata: implement...
1030
  extern u8 ata_timing_cycle2mode(unsigned int xfer_shift, int cycle);
452503f99   Alan Cox   Add ide-timing fu...
1031

624d5c514   Tejun Heo   libata: reorganiz...
1032
1033
1034
1035
1036
1037
1038
1039
1040
  /* PCI */
  #ifdef CONFIG_PCI
  struct pci_dev;
  
  struct pci_bits {
  	unsigned int		reg;	/* PCI config register to read */
  	unsigned int		width;	/* 1 (8 bit), 2 (16 bit), 4 (32 bit) */
  	unsigned long		mask;
  	unsigned long		val;
452503f99   Alan Cox   Add ide-timing fu...
1041
  };
624d5c514   Tejun Heo   libata: reorganiz...
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
  extern int pci_test_config_bits(struct pci_dev *pdev, const struct pci_bits *bits);
  extern void ata_pci_remove_one(struct pci_dev *pdev);
  
  #ifdef CONFIG_PM
  extern void ata_pci_device_do_suspend(struct pci_dev *pdev, pm_message_t mesg);
  extern int __must_check 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);
  #endif /* CONFIG_PM */
  #endif /* CONFIG_PCI */
  
  /*
   * ACPI - drivers/ata/libata-acpi.c
   */
e1ddb4b6a   Alan Cox   [libata] add ACPI...
1056
  #ifdef CONFIG_ATA_ACPI
c05e6ff03   Tejun Heo   libata-acpi: impl...
1057
1058
1059
1060
1061
1062
  static inline const struct ata_acpi_gtm *ata_acpi_init_gtm(struct ata_port *ap)
  {
  	if (ap->pflags & ATA_PFLAG_INIT_GTM_VALID)
  		return &ap->__acpi_init_gtm;
  	return NULL;
  }
0d02f0b22   Tejun Heo   libata-acpi: adju...
1063
1064
  int ata_acpi_stm(struct ata_port *ap, const struct ata_acpi_gtm *stm);
  int ata_acpi_gtm(struct ata_port *ap, struct ata_acpi_gtm *stm);
7c77fa4d5   Tejun Heo   libata: separate ...
1065
1066
  unsigned long ata_acpi_gtm_xfermask(struct ata_device *dev,
  				    const struct ata_acpi_gtm *gtm);
021ee9a6d   Tejun Heo   libata: reimpleme...
1067
  int ata_acpi_cbl_80wire(struct ata_port *ap, const struct ata_acpi_gtm *gtm);
e1ddb4b6a   Alan Cox   [libata] add ACPI...
1068
  #else
c05e6ff03   Tejun Heo   libata-acpi: impl...
1069
1070
1071
1072
  static inline const struct ata_acpi_gtm *ata_acpi_init_gtm(struct ata_port *ap)
  {
  	return NULL;
  }
7c77fa4d5   Tejun Heo   libata: separate ...
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
  
  static inline int ata_acpi_stm(const struct ata_port *ap,
  			       struct ata_acpi_gtm *stm)
  {
  	return -ENOSYS;
  }
  
  static inline int ata_acpi_gtm(const struct ata_port *ap,
  			       struct ata_acpi_gtm *stm)
  {
  	return -ENOSYS;
  }
  
  static inline unsigned int ata_acpi_gtm_xfermask(struct ata_device *dev,
  					const struct ata_acpi_gtm *gtm)
  {
  	return 0;
  }
021ee9a6d   Tejun Heo   libata: reimpleme...
1091
1092
1093
1094
1095
1096
  
  static inline int ata_acpi_cbl_80wire(struct ata_port *ap,
  				      const struct ata_acpi_gtm *gtm)
  {
  	return 0;
  }
e1ddb4b6a   Alan Cox   [libata] add ACPI...
1097
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1098

ece1d6361   Tejun Heo   [PATCH] libata: s...
1099
  /*
624d5c514   Tejun Heo   libata: reorganiz...
1100
   * EH - drivers/ata/libata-eh.c
ece1d6361   Tejun Heo   [PATCH] libata: s...
1101
   */
7b70fc039   Tejun Heo   [PATCH] libata-eh...
1102
  extern void ata_port_schedule_eh(struct ata_port *ap);
dbd826168   Tejun Heo   libata-link: impl...
1103
  extern int ata_link_abort(struct ata_link *link);
7b70fc039   Tejun Heo   [PATCH] libata-eh...
1104
  extern int ata_port_abort(struct ata_port *ap);
e31804994   Tejun Heo   [PATCH] libata-eh...
1105
  extern int ata_port_freeze(struct ata_port *ap);
7d77b2470   Tejun Heo   libata-pmp-prep: ...
1106
  extern int sata_async_notification(struct ata_port *ap);
e31804994   Tejun Heo   [PATCH] libata-eh...
1107
1108
1109
  
  extern void ata_eh_freeze_port(struct ata_port *ap);
  extern void ata_eh_thaw_port(struct ata_port *ap);
7b70fc039   Tejun Heo   [PATCH] libata-eh...
1110

ece1d6361   Tejun Heo   [PATCH] libata: s...
1111
1112
  extern void ata_eh_qc_complete(struct ata_queued_cmd *qc);
  extern void ata_eh_qc_retry(struct ata_queued_cmd *qc);
10acf3b0d   Mark Lord   libata: export at...
1113
  extern void ata_eh_analyze_ncq_error(struct ata_link *link);
ece1d6361   Tejun Heo   [PATCH] libata: s...
1114

f5914a461   Tejun Heo   [PATCH] libata-hp...
1115
1116
1117
  extern void ata_do_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);
a1efdaba2   Tejun Heo   libata: make rese...
1118
  extern void ata_std_error_handler(struct ata_port *ap);
8a745f1f3   Kristen Carlson Accardi   libata: Power off...
1119
  extern int ata_link_nr_enabled(struct ata_link *link);
022bdb075   Tejun Heo   [PATCH] libata-eh...
1120

61440db61   Tejun Heo   [PATCH] libata: i...
1121
  /*
68d1d07b5   Tejun Heo   libata: implement...
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
   * Base operations to inherit from and initializers for sht
   *
   * Operations
   *
   * base  : Common to all libata drivers.
   * sata  : SATA controllers w/ native interface.
   * pmp   : SATA controllers w/ PMP support.
   * sff   : SFF ATA controllers w/o BMDMA support.
   * bmdma : SFF ATA controllers w/ BMDMA support.
   *
   * sht initializers
   *
   * BASE  : Common to all libata drivers.  The user must set
   *	   sg_tablesize and dma_boundary.
   * PIO   : SFF ATA controllers w/ only PIO support.
   * BMDMA : SFF ATA controllers w/ BMDMA support.  sg_tablesize and
   *	   dma_boundary are set to BMDMA limits.
   * NCQ   : SATA controllers supporting NCQ.  The user must set
   *	   sg_tablesize, dma_boundary and can_queue.
   */
  extern const struct ata_port_operations ata_base_port_ops;
  extern const struct ata_port_operations sata_port_ops;
45fabbb77   Elias Oltmanns   libata: Implement...
1144
  extern struct device_attribute *ata_common_sdev_attrs[];
68d1d07b5   Tejun Heo   libata: implement...
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
  
  #define ATA_BASE_SHT(drv_name)					\
  	.module			= THIS_MODULE,			\
  	.name			= drv_name,			\
  	.ioctl			= ata_scsi_ioctl,		\
  	.queuecommand		= ata_scsi_queuecmd,		\
  	.can_queue		= ATA_DEF_QUEUE,		\
  	.this_id		= ATA_SHT_THIS_ID,		\
  	.cmd_per_lun		= ATA_SHT_CMD_PER_LUN,		\
  	.emulated		= ATA_SHT_EMULATED,		\
  	.use_clustering		= ATA_SHT_USE_CLUSTERING,	\
  	.proc_name		= drv_name,			\
  	.slave_configure	= ata_scsi_slave_config,	\
  	.slave_destroy		= ata_scsi_slave_destroy,	\
45fabbb77   Elias Oltmanns   libata: Implement...
1159
  	.bios_param		= ata_std_bios_param,		\
d8d9129ea   Tejun Heo   libata: implement...
1160
  	.unlock_native_capacity	= ata_scsi_unlock_native_capacity, \
45fabbb77   Elias Oltmanns   libata: Implement...
1161
  	.sdev_attrs		= ata_common_sdev_attrs
68d1d07b5   Tejun Heo   libata: implement...
1162

68d1d07b5   Tejun Heo   libata: implement...
1163
1164
1165
1166
1167
  #define ATA_NCQ_SHT(drv_name)					\
  	ATA_BASE_SHT(drv_name),					\
  	.change_queue_depth	= ata_scsi_change_queue_depth
  
  /*
071f44b1d   Tejun Heo   libata: implement...
1168
1169
   * PMP helpers
   */
88fcd5627   Tejun Heo   libata: make PMP ...
1170
  #ifdef CONFIG_SATA_PMP
071f44b1d   Tejun Heo   libata: implement...
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
  static inline bool sata_pmp_supported(struct ata_port *ap)
  {
  	return ap->flags & ATA_FLAG_PMP;
  }
  
  static inline bool sata_pmp_attached(struct ata_port *ap)
  {
  	return ap->nr_pmp_links != 0;
  }
  
  static inline int ata_is_host_link(const struct ata_link *link)
  {
b1c72916a   Tejun Heo   libata: implement...
1183
  	return link == &link->ap->link || link == link->ap->slave_link;
071f44b1d   Tejun Heo   libata: implement...
1184
  }
88fcd5627   Tejun Heo   libata: make PMP ...
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
  #else /* CONFIG_SATA_PMP */
  static inline bool sata_pmp_supported(struct ata_port *ap)
  {
  	return false;
  }
  
  static inline bool sata_pmp_attached(struct ata_port *ap)
  {
  	return false;
  }
  
  static inline int ata_is_host_link(const struct ata_link *link)
  {
  	return 1;
  }
  #endif /* CONFIG_SATA_PMP */
071f44b1d   Tejun Heo   libata: implement...
1201
1202
1203
1204
1205
1206
1207
1208
1209
  
  static inline int sata_srst_pmp(struct ata_link *link)
  {
  	if (sata_pmp_supported(link->ap) && ata_is_host_link(link))
  		return SATA_PMP_CTRL_PORT;
  	return link->pmp;
  }
  
  /*
61440db61   Tejun Heo   [PATCH] libata: i...
1210
1211
   * printk helpers
   */
b9075fa96   Joe Perches   treewide: use __p...
1212
  __printf(3, 4)
a9a79dfec   Joe Perches   ata: Convert ata_...
1213
1214
  int ata_port_printk(const struct ata_port *ap, const char *level,
  		    const char *fmt, ...);
b9075fa96   Joe Perches   treewide: use __p...
1215
  __printf(3, 4)
a9a79dfec   Joe Perches   ata: Convert ata_...
1216
1217
  int ata_link_printk(const struct ata_link *link, const char *level,
  		    const char *fmt, ...);
b9075fa96   Joe Perches   treewide: use __p...
1218
  __printf(3, 4)
a9a79dfec   Joe Perches   ata: Convert ata_...
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
  int ata_dev_printk(const struct ata_device *dev, const char *level,
  		   const char *fmt, ...);
  
  #define ata_port_err(ap, fmt, ...)				\
  	ata_port_printk(ap, KERN_ERR, fmt, ##__VA_ARGS__)
  #define ata_port_warn(ap, fmt, ...)				\
  	ata_port_printk(ap, KERN_WARNING, fmt, ##__VA_ARGS__)
  #define ata_port_notice(ap, fmt, ...)				\
  	ata_port_printk(ap, KERN_NOTICE, fmt, ##__VA_ARGS__)
  #define ata_port_info(ap, fmt, ...)				\
  	ata_port_printk(ap, KERN_INFO, fmt, ##__VA_ARGS__)
  #define ata_port_dbg(ap, fmt, ...)				\
  	ata_port_printk(ap, KERN_DEBUG, fmt, ##__VA_ARGS__)
  
  #define ata_link_err(link, fmt, ...)				\
  	ata_link_printk(link, KERN_ERR, fmt, ##__VA_ARGS__)
  #define ata_link_warn(link, fmt, ...)				\
  	ata_link_printk(link, KERN_WARNING, fmt, ##__VA_ARGS__)
  #define ata_link_notice(link, fmt, ...)				\
  	ata_link_printk(link, KERN_NOTICE, fmt, ##__VA_ARGS__)
  #define ata_link_info(link, fmt, ...)				\
  	ata_link_printk(link, KERN_INFO, fmt, ##__VA_ARGS__)
  #define ata_link_dbg(link, fmt, ...)				\
  	ata_link_printk(link, KERN_DEBUG, fmt, ##__VA_ARGS__)
  
  #define ata_dev_err(dev, fmt, ...)				\
  	ata_dev_printk(dev, KERN_ERR, fmt, ##__VA_ARGS__)
  #define ata_dev_warn(dev, fmt, ...)				\
  	ata_dev_printk(dev, KERN_WARNING, fmt, ##__VA_ARGS__)
  #define ata_dev_notice(dev, fmt, ...)				\
  	ata_dev_printk(dev, KERN_NOTICE, fmt, ##__VA_ARGS__)
  #define ata_dev_info(dev, fmt, ...)				\
  	ata_dev_printk(dev, KERN_INFO, fmt, ##__VA_ARGS__)
  #define ata_dev_dbg(dev, fmt, ...)				\
  	ata_dev_printk(dev, KERN_DEBUG, fmt, ##__VA_ARGS__)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1254

06296a1e6   Joe Perches   ata: Add and use ...
1255
  void ata_print_version(const struct device *dev, const char *version);
61440db61   Tejun Heo   [PATCH] libata: i...
1256
  /*
f3e81b19a   Tejun Heo   [PATCH] libata-eh...
1257
1258
   * ata_eh_info helpers
   */
b9075fa96   Joe Perches   treewide: use __p...
1259
1260
1261
1262
  extern __printf(2, 3)
  void __ata_ehi_push_desc(struct ata_eh_info *ehi, const char *fmt, ...);
  extern __printf(2, 3)
  void ata_ehi_push_desc(struct ata_eh_info *ehi, const char *fmt, ...);
b64bbc39f   Tejun Heo   libata: improve E...
1263
  extern void ata_ehi_clear_desc(struct ata_eh_info *ehi);
f3e81b19a   Tejun Heo   [PATCH] libata-eh...
1264

c0b6c0377   Tejun Heo   [PATCH] libata: s...
1265
1266
  static inline void ata_ehi_hotplugged(struct ata_eh_info *ehi)
  {
b558edddb   Tejun Heo   libata: kill ata_...
1267
  	ehi->probe_mask |= (1 << ATA_MAX_DEVICES) - 1;
f8f1e1cc0   Tejun Heo   libata: reorganiz...
1268
  	ehi->flags |= ATA_EHI_HOTPLUGGED;
b558edddb   Tejun Heo   libata: kill ata_...
1269
  	ehi->action |= ATA_EH_RESET | ATA_EH_ENABLE_LINK;
c0b6c0377   Tejun Heo   [PATCH] libata: s...
1270
1271
  	ehi->err_mask |= AC_ERR_ATA_BUS;
  }
f3e81b19a   Tejun Heo   [PATCH] libata-eh...
1272
  /*
cbcdd8759   Tejun Heo   libata: implement...
1273
1274
   * port description helpers
   */
b9075fa96   Joe Perches   treewide: use __p...
1275
1276
  extern __printf(2, 3)
  void ata_port_desc(struct ata_port *ap, const char *fmt, ...);
cbcdd8759   Tejun Heo   libata: implement...
1277
1278
1279
1280
  #ifdef CONFIG_PCI
  extern void ata_port_pbar_desc(struct ata_port *ap, int bar, ssize_t offset,
  			       const char *name);
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1281
1282
1283
1284
  static inline unsigned int ata_tag_valid(unsigned int tag)
  {
  	return (tag < ATA_MAX_QUEUE) ? 1 : 0;
  }
2ab7db1ff   Tejun Heo   [PATCH] libata-eh...
1285
1286
  static inline unsigned int ata_tag_internal(unsigned int tag)
  {
83c063dd7   Yoichi Yuasa   use ATA_TAG_INTER...
1287
  	return tag == ATA_TAG_INTERNAL;
2ab7db1ff   Tejun Heo   [PATCH] libata-eh...
1288
  }
5806db22c   Tejun Heo   [PATCH] libata: i...
1289
1290
1291
  /*
   * device helpers
   */
e1211e3fa   Tejun Heo   [PATCH] libata: i...
1292
  static inline unsigned int ata_class_enabled(unsigned int class)
597afd214   Tejun Heo   [PATCH] libata: s...
1293
  {
e0a717526   Tejun Heo   libata-pmp-prep: ...
1294
1295
  	return class == ATA_DEV_ATA || class == ATA_DEV_ATAPI ||
  		class == ATA_DEV_PMP || class == ATA_DEV_SEMB;
597afd214   Tejun Heo   [PATCH] libata: s...
1296
  }
e1211e3fa   Tejun Heo   [PATCH] libata: i...
1297
  static inline unsigned int ata_class_disabled(unsigned int class)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1298
  {
e0a717526   Tejun Heo   libata-pmp-prep: ...
1299
1300
  	return class == ATA_DEV_ATA_UNSUP || class == ATA_DEV_ATAPI_UNSUP ||
  		class == ATA_DEV_PMP_UNSUP || class == ATA_DEV_SEMB_UNSUP;
e1211e3fa   Tejun Heo   [PATCH] libata: i...
1301
  }
002c8054f   Tejun Heo   [PATCH] libata: i...
1302
1303
1304
1305
  static inline unsigned int ata_class_absent(unsigned int class)
  {
  	return !ata_class_enabled(class) && !ata_class_disabled(class);
  }
e1211e3fa   Tejun Heo   [PATCH] libata: i...
1306
1307
1308
1309
1310
1311
1312
1313
  static inline unsigned int ata_dev_enabled(const struct ata_device *dev)
  {
  	return ata_class_enabled(dev->class);
  }
  
  static inline unsigned int ata_dev_disabled(const struct ata_device *dev)
  {
  	return ata_class_disabled(dev->class);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1314
  }
002c8054f   Tejun Heo   [PATCH] libata: i...
1315
1316
1317
1318
  static inline unsigned int ata_dev_absent(const struct ata_device *dev)
  {
  	return ata_class_absent(dev->class);
  }
5806db22c   Tejun Heo   [PATCH] libata: i...
1319
  /*
f58229f80   Tejun Heo   libata-link: impl...
1320
   * link helpers
5806db22c   Tejun Heo   [PATCH] libata: i...
1321
   */
f58229f80   Tejun Heo   libata-link: impl...
1322
  static inline int ata_link_max_devices(const struct ata_link *link)
5806db22c   Tejun Heo   [PATCH] libata: i...
1323
  {
8989805d6   Tejun Heo   libata-link: add ...
1324
  	if (ata_is_host_link(link) && link->ap->flags & ATA_FLAG_SLAVE_POSS)
5806db22c   Tejun Heo   [PATCH] libata: i...
1325
1326
1327
  		return 2;
  	return 1;
  }
da917d69d   Tejun Heo   libata-pmp-prep: ...
1328
1329
1330
1331
  static inline int ata_link_active(struct ata_link *link)
  {
  	return ata_tag_valid(link->active_tag) || link->sactive;
  }
1eca4365b   Tejun Heo   libata: beef up i...
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
  /*
   * Iterators
   *
   * ATA_LITER_* constants are used to select link iteration mode and
   * ATA_DITER_* device iteration mode.
   *
   * For a custom iteration directly using ata_{link|dev}_next(), if
   * @link or @dev, respectively, is NULL, the first element is
   * returned.  @dev and @link can be any valid device or link and the
   * next element according to the iteration mode will be returned.
   * After the last element, NULL is returned.
   */
  enum ata_link_iter_mode {
  	ATA_LITER_EDGE,		/* if present, PMP links only; otherwise,
  				 * host link.  no slave link */
  	ATA_LITER_HOST_FIRST,	/* host link followed by PMP or slave links */
  	ATA_LITER_PMP_FIRST,	/* PMP links followed by host link,
  				 * slave link still comes after host link */
  };
  
  enum ata_dev_iter_mode {
  	ATA_DITER_ENABLED,
  	ATA_DITER_ENABLED_REVERSE,
  	ATA_DITER_ALL,
  	ATA_DITER_ALL_REVERSE,
  };
  
  extern struct ata_link *ata_link_next(struct ata_link *link,
  				      struct ata_port *ap,
  				      enum ata_link_iter_mode mode);
  
  extern struct ata_device *ata_dev_next(struct ata_device *dev,
  				       struct ata_link *link,
  				       enum ata_dev_iter_mode mode);
  
  /*
   * Shortcut notation for iterations
   *
   * ata_for_each_link() iterates over each link of @ap according to
   * @mode.  @link points to the current link in the loop.  @link is
   * NULL after loop termination.  ata_for_each_dev() works the same way
   * except that it iterates over each device of @link.
   *
   * Note that the mode prefixes ATA_{L|D}ITER_ shouldn't need to be
   * specified when using the following shorthand notations.  Only the
   * mode itself (EDGE, HOST_FIRST, ENABLED, etc...) should be
   * specified.  This not only increases brevity but also makes it
   * impossible to use ATA_LITER_* for device iteration or vice-versa.
   */
  #define ata_for_each_link(link, ap, mode) \
  	for ((link) = ata_link_next(NULL, (ap), ATA_LITER_##mode); (link); \
  	     (link) = ata_link_next((link), (ap), ATA_LITER_##mode))
  
  #define ata_for_each_dev(dev, link, mode) \
  	for ((dev) = ata_dev_next(NULL, (link), ATA_DITER_##mode); (dev); \
  	     (dev) = ata_dev_next((dev), (link), ATA_DITER_##mode))
5806db22c   Tejun Heo   [PATCH] libata: i...
1388

6d1245bf2   Tejun Heo   libata: separate ...
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
  /**
   *	ata_ncq_enabled - Test whether NCQ is enabled
   *	@dev: ATA device to test for
   *
   *	LOCKING:
   *	spin_lock_irqsave(host lock)
   *
   *	RETURNS:
   *	1 if NCQ is enabled for @dev, 0 otherwise.
   */
  static inline int ata_ncq_enabled(struct ata_device *dev)
  {
  	return (dev->flags & (ATA_DFLAG_PIO | ATA_DFLAG_NCQ_OFF |
  			      ATA_DFLAG_NCQ)) == ATA_DFLAG_NCQ;
  }
0baab86b0   Edward Falk   libata: update in...
1404

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1405
1406
1407
1408
  static inline void ata_qc_set_polling(struct ata_queued_cmd *qc)
  {
  	qc->tf.ctl |= ATA_NIEN;
  }
f69499f42   Tejun Heo   [PATCH] libata-eh...
1409
1410
  static inline struct ata_queued_cmd *__ata_qc_from_tag(struct ata_port *ap,
  						       unsigned int tag)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1411
1412
1413
1414
1415
  {
  	if (likely(ata_tag_valid(tag)))
  		return &ap->qcmd[tag];
  	return NULL;
  }
f69499f42   Tejun Heo   [PATCH] libata-eh...
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
  static inline struct ata_queued_cmd *ata_qc_from_tag(struct ata_port *ap,
  						     unsigned int tag)
  {
  	struct ata_queued_cmd *qc = __ata_qc_from_tag(ap, tag);
  
  	if (unlikely(!qc) || !ap->ops->error_handler)
  		return qc;
  
  	if ((qc->flags & (ATA_QCFLAG_ACTIVE |
  			  ATA_QCFLAG_FAILED)) == ATA_QCFLAG_ACTIVE)
  		return qc;
  
  	return NULL;
  }
aacda3753   Tejun Heo   libata: implement...
1430
1431
1432
1433
  static inline unsigned int ata_qc_raw_nbytes(struct ata_queued_cmd *qc)
  {
  	return qc->nbytes - min(qc->extrabytes, qc->nbytes);
  }
3373efd89   Tejun Heo   [PATCH] libata: u...
1434
  static inline void ata_tf_init(struct ata_device *dev, struct ata_taskfile *tf)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1435
1436
  {
  	memset(tf, 0, sizeof(*tf));
5fe7454aa   Tejun Heo   libata-sff: ap->[...
1437
  #ifdef CONFIG_ATA_SFF
9af5c9c97   Tejun Heo   libata-link: intr...
1438
  	tf->ctl = dev->link->ap->ctl;
5fe7454aa   Tejun Heo   libata-sff: ap->[...
1439
1440
1441
  #else
  	tf->ctl = ATA_DEVCTL_OBS;
  #endif
3373efd89   Tejun Heo   [PATCH] libata: u...
1442
  	if (dev->devno == 0)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1443
1444
1445
1446
  		tf->device = ATA_DEVICE_OBS;
  	else
  		tf->device = ATA_DEVICE_OBS | ATA_DEV1;
  }
2c13b7cee   Jeff Garzik   [libata] minor fi...
1447
1448
  static inline void ata_qc_reinit(struct ata_queued_cmd *qc)
  {
501e0c500   Tejun Heo   libata: initializ...
1449
  	qc->dma_dir = DMA_NONE;
ff2aeb1eb   Tejun Heo   libata: convert t...
1450
  	qc->sg = NULL;
2c13b7cee   Jeff Garzik   [libata] minor fi...
1451
  	qc->flags = 0;
872602162   Jens Axboe   libata: convert t...
1452
1453
  	qc->cursg = NULL;
  	qc->cursg_ofs = 0;
aacda3753   Tejun Heo   libata: implement...
1454
  	qc->nbytes = qc->extrabytes = qc->curbytes = 0;
7a801184f   Brian King   libata: Fixup n_e...
1455
  	qc->n_elem = 0;
a22e2eb07   Albert Lee   [PATCH] libata: m...
1456
  	qc->err_mask = 0;
5a5dbd18a   Mark Lord   libata: add suppo...
1457
  	qc->sect_size = ATA_SECT_SIZE;
2c13b7cee   Jeff Garzik   [libata] minor fi...
1458

3373efd89   Tejun Heo   [PATCH] libata: u...
1459
  	ata_tf_init(qc->dev, &qc->tf);
e61e06722   Tejun Heo   [PATCH] libata: i...
1460
1461
1462
1463
  
  	/* init result_tf such that it indicates normal completion */
  	qc->result_tf.command = ATA_DRDY;
  	qc->result_tf.feature = 0;
2c13b7cee   Jeff Garzik   [libata] minor fi...
1464
  }
057ace5e7   Jeff Garzik   libata: const-ifi...
1465
  static inline int ata_try_flush_cache(const struct ata_device *dev)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1466
1467
1468
1469
1470
  {
  	return ata_id_wcache_enabled(dev->id) ||
  	       ata_id_has_flush(dev->id) ||
  	       ata_id_has_flush_ext(dev->id);
  }
a7dac447b   Jeff Garzik   [libata] change a...
1471
1472
  static inline unsigned int ac_err_mask(u8 status)
  {
3655d1d32   Albert Lee   [PATCH] libata: F...
1473
  	if (status & (ATA_BUSY | ATA_DRQ))
11a56d243   Tejun Heo   [PATCH] libata: a...
1474
  		return AC_ERR_HSM;
a7dac447b   Jeff Garzik   [libata] change a...
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
  	if (status & (ATA_ERR | ATA_DF))
  		return AC_ERR_DEV;
  	return 0;
  }
  
  static inline unsigned int __ac_err_mask(u8 status)
  {
  	unsigned int mask = ac_err_mask(status);
  	if (mask == 0)
  		return AC_ERR_OTHER;
  	return mask;
  }
35bb94b11   Jeff Garzik   libata: Add helpe...
1487
1488
  static inline struct ata_port *ata_shost_to_port(struct Scsi_Host *host)
  {
4911487a3   Tejun Heo   libata: allocate ...
1489
  	return *(struct ata_port **)&host->hostdata[0];
35bb94b11   Jeff Garzik   libata: Add helpe...
1490
  }
78ab88f04   Tejun Heo   libata: improve p...
1491
1492
  static inline int ata_check_ready(u8 status)
  {
005b1f749   Jeff Garzik   [libata] revert n...
1493
1494
  	if (!(status & ATA_BUSY))
  		return 1;
78ab88f04   Tejun Heo   libata: improve p...
1495
1496
1497
1498
  
  	/* 0xff indicates either no device or device not ready */
  	if (status == 0xff)
  		return -ENODEV;
005b1f749   Jeff Garzik   [libata] revert n...
1499
  	return 0;
78ab88f04   Tejun Heo   libata: improve p...
1500
  }
341c2c958   Tejun Heo   libata: consisten...
1501
1502
1503
1504
1505
  static inline unsigned long ata_deadline(unsigned long from_jiffies,
  					 unsigned long timeout_msecs)
  {
  	return from_jiffies + msecs_to_jiffies(timeout_msecs);
  }
b15b3ebae   Alan Cox   libata: Fix a lar...
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
  /* Don't open code these in drivers as there are traps. Firstly the range may
     change in future hardware and specs, secondly 0xFF means 'no DMA' but is
     > UDMA_0. Dyma ddreigiau */
  
  static inline int ata_using_mwdma(struct ata_device *adev)
  {
  	if (adev->dma_mode >= XFER_MW_DMA_0 && adev->dma_mode <= XFER_MW_DMA_4)
  		return 1;
  	return 0;
  }
  
  static inline int ata_using_udma(struct ata_device *adev)
  {
  	if (adev->dma_mode >= XFER_UDMA_0 && adev->dma_mode <= XFER_UDMA_7)
  		return 1;
  	return 0;
  }
  
  static inline int ata_dma_enabled(struct ata_device *adev)
  {
  	return (adev->dma_mode == 0xFF ? 0 : 1);
  }
48515f6c0   Tejun Heo   libata: separate ...
1528
1529
1530
1531
  
  /**************************************************************************
   * PMP - drivers/ata/libata-pmp.c
   */
88fcd5627   Tejun Heo   libata: make PMP ...
1532
  #ifdef CONFIG_SATA_PMP
48515f6c0   Tejun Heo   libata: separate ...
1533
1534
1535
1536
  extern const struct ata_port_operations sata_pmp_port_ops;
  
  extern int sata_pmp_qc_defer_cmd_switch(struct ata_queued_cmd *qc);
  extern void sata_pmp_error_handler(struct ata_port *ap);
88fcd5627   Tejun Heo   libata: make PMP ...
1537
1538
1539
1540
1541
1542
1543
  #else /* CONFIG_SATA_PMP */
  
  #define sata_pmp_port_ops		sata_port_ops
  #define sata_pmp_qc_defer_cmd_switch	ata_std_qc_defer
  #define sata_pmp_error_handler		ata_std_error_handler
  
  #endif /* CONFIG_SATA_PMP */
48515f6c0   Tejun Heo   libata: separate ...
1544

624d5c514   Tejun Heo   libata: reorganiz...
1545
1546
1547
  /**************************************************************************
   * SFF - drivers/ata/libata-sff.c
   */
127102aea   Tejun Heo   libata: make SFF ...
1548
  #ifdef CONFIG_ATA_SFF
624d5c514   Tejun Heo   libata: reorganiz...
1549
  extern const struct ata_port_operations ata_sff_port_ops;
871af1210   Alan Cox   libata: Add 32bit...
1550
  extern const struct ata_port_operations ata_bmdma32_port_ops;
624d5c514   Tejun Heo   libata: reorganiz...
1551
1552
1553
1554
1555
1556
  
  /* PIO only, sg_tablesize and dma_boundary limits can be removed */
  #define ATA_PIO_SHT(drv_name)					\
  	ATA_BASE_SHT(drv_name),					\
  	.sg_tablesize		= LIBATA_MAX_PRD,		\
  	.dma_boundary		= ATA_DMA_BOUNDARY
9363c3825   Tejun Heo   libata: rename SF...
1557
1558
  extern void ata_sff_dev_select(struct ata_port *ap, unsigned int device);
  extern u8 ata_sff_check_status(struct ata_port *ap);
a57c1bade   Alan Cox   libata-sff: Fix o...
1559
1560
  extern void ata_sff_pause(struct ata_port *ap);
  extern void ata_sff_dma_pause(struct ata_port *ap);
9363c3825   Tejun Heo   libata: rename SF...
1561
1562
  extern int ata_sff_busy_sleep(struct ata_port *ap,
  			      unsigned long timeout_pat, unsigned long timeout);
705e76beb   Tejun Heo   libata: restructu...
1563
  extern int ata_sff_wait_ready(struct ata_link *link, unsigned long deadline);
9363c3825   Tejun Heo   libata: rename SF...
1564
1565
1566
1567
1568
  extern void ata_sff_tf_load(struct ata_port *ap, const struct ata_taskfile *tf);
  extern void ata_sff_tf_read(struct ata_port *ap, struct ata_taskfile *tf);
  extern void ata_sff_exec_command(struct ata_port *ap,
  				 const struct ata_taskfile *tf);
  extern unsigned int ata_sff_data_xfer(struct ata_device *dev,
624d5c514   Tejun Heo   libata: reorganiz...
1569
  			unsigned char *buf, unsigned int buflen, int rw);
871af1210   Alan Cox   libata: Add 32bit...
1570
1571
  extern unsigned int ata_sff_data_xfer32(struct ata_device *dev,
  			unsigned char *buf, unsigned int buflen, int rw);
9363c3825   Tejun Heo   libata: rename SF...
1572
  extern unsigned int ata_sff_data_xfer_noirq(struct ata_device *dev,
624d5c514   Tejun Heo   libata: reorganiz...
1573
  			unsigned char *buf, unsigned int buflen, int rw);
e42a542ba   Sergei Shtylyov   libata: make sff_...
1574
  extern void ata_sff_irq_on(struct ata_port *ap);
9363c3825   Tejun Heo   libata: rename SF...
1575
1576
1577
  extern void ata_sff_irq_clear(struct ata_port *ap);
  extern int ata_sff_hsm_move(struct ata_port *ap, struct ata_queued_cmd *qc,
  			    u8 status, int in_wq);
64b975942   Viresh Kumar   libata-sff: add a...
1578
1579
1580
  extern void ata_sff_queue_work(struct work_struct *work);
  extern void ata_sff_queue_delayed_work(struct delayed_work *dwork,
  		unsigned long delay);
ea3c64506   Gwendal Grignou   libata-sff: Reena...
1581
  extern void ata_sff_queue_pio_task(struct ata_link *link, unsigned long delay);
9363c3825   Tejun Heo   libata: rename SF...
1582
  extern unsigned int ata_sff_qc_issue(struct ata_queued_cmd *qc);
22183bf56   Tejun Heo   libata: add qc_fi...
1583
  extern bool ata_sff_qc_fill_rtf(struct ata_queued_cmd *qc);
c3b288942   Tejun Heo   libata-sff: separ...
1584
  extern unsigned int ata_sff_port_intr(struct ata_port *ap,
9363c3825   Tejun Heo   libata: rename SF...
1585
1586
  				      struct ata_queued_cmd *qc);
  extern irqreturn_t ata_sff_interrupt(int irq, void *dev_instance);
c96f1732e   Alan Cox   [libata] Improve ...
1587
  extern void ata_sff_lost_interrupt(struct ata_port *ap);
9363c3825   Tejun Heo   libata: rename SF...
1588
1589
1590
1591
1592
  extern void ata_sff_freeze(struct ata_port *ap);
  extern void ata_sff_thaw(struct ata_port *ap);
  extern int ata_sff_prereset(struct ata_link *link, unsigned long deadline);
  extern unsigned int ata_sff_dev_classify(struct ata_device *dev, int present,
  					  u8 *r_err);
705e76beb   Tejun Heo   libata: restructu...
1593
1594
  extern int ata_sff_wait_after_reset(struct ata_link *link, unsigned int devmask,
  				    unsigned long deadline);
9363c3825   Tejun Heo   libata: rename SF...
1595
  extern int ata_sff_softreset(struct ata_link *link, unsigned int *classes,
624d5c514   Tejun Heo   libata: reorganiz...
1596
  			     unsigned long deadline);
9363c3825   Tejun Heo   libata: rename SF...
1597
1598
1599
  extern int sata_sff_hardreset(struct ata_link *link, unsigned int *class,
  			       unsigned long deadline);
  extern void ata_sff_postreset(struct ata_link *link, unsigned int *classes);
3d47aa8e7   Alan Cox   [libata] Drain da...
1600
  extern void ata_sff_drain_fifo(struct ata_queued_cmd *qc);
9363c3825   Tejun Heo   libata: rename SF...
1601
  extern void ata_sff_error_handler(struct ata_port *ap);
9363c3825   Tejun Heo   libata: rename SF...
1602
  extern void ata_sff_std_ports(struct ata_ioports *ioaddr);
624d5c514   Tejun Heo   libata: reorganiz...
1603
  #ifdef CONFIG_PCI
9363c3825   Tejun Heo   libata: rename SF...
1604
1605
  extern int ata_pci_sff_init_host(struct ata_host *host);
  extern int ata_pci_sff_prepare_host(struct pci_dev *pdev,
624d5c514   Tejun Heo   libata: reorganiz...
1606
1607
  				    const struct ata_port_info * const * ppi,
  				    struct ata_host **r_host);
9363c3825   Tejun Heo   libata: rename SF...
1608
  extern int ata_pci_sff_activate_host(struct ata_host *host,
624d5c514   Tejun Heo   libata: reorganiz...
1609
1610
  				     irq_handler_t irq_handler,
  				     struct scsi_host_template *sht);
9363c3825   Tejun Heo   libata: rename SF...
1611
  extern int ata_pci_sff_init_one(struct pci_dev *pdev,
16ea0fc98   Alan Cox   libata: Pass host...
1612
1613
  		const struct ata_port_info * const * ppi,
  		struct scsi_host_template *sht, void *host_priv, int hflags);
624d5c514   Tejun Heo   libata: reorganiz...
1614
  #endif /* CONFIG_PCI */
9a7780c9a   Tejun Heo   libata-sff: make ...
1615
1616
1617
1618
1619
1620
1621
1622
  #ifdef CONFIG_ATA_BMDMA
  
  extern const struct ata_port_operations ata_bmdma_port_ops;
  
  #define ATA_BMDMA_SHT(drv_name)					\
  	ATA_BASE_SHT(drv_name),					\
  	.sg_tablesize		= LIBATA_MAX_PRD,		\
  	.dma_boundary		= ATA_DMA_BOUNDARY
f47451c45   Tejun Heo   libata-sff: ata_s...
1623
  extern void ata_bmdma_qc_prep(struct ata_queued_cmd *qc);
360ff7833   Tejun Heo   libata-sff: separ...
1624
  extern unsigned int ata_bmdma_qc_issue(struct ata_queued_cmd *qc);
f47451c45   Tejun Heo   libata-sff: ata_s...
1625
  extern void ata_bmdma_dumb_qc_prep(struct ata_queued_cmd *qc);
c3b288942   Tejun Heo   libata-sff: separ...
1626
1627
1628
  extern unsigned int ata_bmdma_port_intr(struct ata_port *ap,
  				      struct ata_queued_cmd *qc);
  extern irqreturn_t ata_bmdma_interrupt(int irq, void *dev_instance);
fe06e5f9b   Tejun Heo   libata-sff: separ...
1629
1630
  extern void ata_bmdma_error_handler(struct ata_port *ap);
  extern void ata_bmdma_post_internal_cmd(struct ata_queued_cmd *qc);
37f65b8bc   Tejun Heo   libata-sff: ata_s...
1631
  extern void ata_bmdma_irq_clear(struct ata_port *ap);
9f2f72107   Tejun Heo   libata-sff: reord...
1632
1633
1634
1635
  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);
c7087652e   Tejun Heo   libata-sff: clean...
1636
1637
  extern int ata_bmdma_port_start(struct ata_port *ap);
  extern int ata_bmdma_port_start32(struct ata_port *ap);
9f2f72107   Tejun Heo   libata-sff: reord...
1638
1639
1640
  
  #ifdef CONFIG_PCI
  extern int ata_pci_bmdma_clear_simplex(struct pci_dev *pdev);
c7087652e   Tejun Heo   libata-sff: clean...
1641
  extern void ata_pci_bmdma_init(struct ata_host *host);
1c5afdf7a   Tejun Heo   libata-sff: separ...
1642
1643
1644
1645
1646
1647
1648
  extern int ata_pci_bmdma_prepare_host(struct pci_dev *pdev,
  				      const struct ata_port_info * const * ppi,
  				      struct ata_host **r_host);
  extern int ata_pci_bmdma_init_one(struct pci_dev *pdev,
  				  const struct ata_port_info * const * ppi,
  				  struct scsi_host_template *sht,
  				  void *host_priv, int hflags);
9f2f72107   Tejun Heo   libata-sff: reord...
1649
  #endif /* CONFIG_PCI */
9a7780c9a   Tejun Heo   libata-sff: make ...
1650
  #endif /* CONFIG_ATA_BMDMA */
9f2f72107   Tejun Heo   libata-sff: reord...
1651

624d5c514   Tejun Heo   libata: reorganiz...
1652
  /**
9363c3825   Tejun Heo   libata: rename SF...
1653
   *	ata_sff_busy_wait - Wait for a port status register
624d5c514   Tejun Heo   libata: reorganiz...
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
   *	@ap: Port to wait for.
   *	@bits: bits that must be clear
   *	@max: number of 10uS waits to perform
   *
   *	Waits up to max*10 microseconds for the selected bits in the port's
   *	status register to be cleared.
   *	Returns final value of status register.
   *
   *	LOCKING:
   *	Inherited from caller.
   */
9363c3825   Tejun Heo   libata: rename SF...
1665
1666
  static inline u8 ata_sff_busy_wait(struct ata_port *ap, unsigned int bits,
  				   unsigned int max)
624d5c514   Tejun Heo   libata: reorganiz...
1667
1668
1669
1670
1671
  {
  	u8 status;
  
  	do {
  		udelay(10);
5682ed33a   Tejun Heo   libata: rename SF...
1672
  		status = ap->ops->sff_check_status(ap);
624d5c514   Tejun Heo   libata: reorganiz...
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
  		max--;
  	} while (status != 0xff && (status & bits) && (max > 0));
  
  	return status;
  }
  
  /**
   *	ata_wait_idle - Wait for a port to be idle.
   *	@ap: Port to wait for.
   *
   *	Waits up to 10ms for port's BUSY and DRQ signals to clear.
   *	Returns final value of status register.
   *
   *	LOCKING:
   *	Inherited from caller.
   */
  static inline u8 ata_wait_idle(struct ata_port *ap)
  {
9363c3825   Tejun Heo   libata: rename SF...
1691
  	u8 status = ata_sff_busy_wait(ap, ATA_BUSY | ATA_DRQ, 1000);
624d5c514   Tejun Heo   libata: reorganiz...
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
  
  #ifdef ATA_DEBUG
  	if (status != 0xff && (status & (ATA_BUSY | ATA_DRQ)))
  		ata_port_printk(ap, KERN_DEBUG, "abnormal Status 0x%X
  ",
  				status);
  #endif
  
  	return status;
  }
127102aea   Tejun Heo   libata: make SFF ...
1702
  #endif /* CONFIG_ATA_SFF */
624d5c514   Tejun Heo   libata: reorganiz...
1703

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1704
  #endif /* __LINUX_LIBATA_H__ */