Blame view

include/linux/libata.h 55.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>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
40

a6d967a48   Jeff Garzik   [libata] No need ...
41
42
43
44
45
  /*
   * 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...
46
  #include <asm/libata-portmap.h>
a6d967a48   Jeff Garzik   [libata] No need ...
47
48
49
  #else
  #include <asm-generic/libata-portmap.h>
  #endif
2ec7df045   Alan Cox   [PATCH] libata: r...
50

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
51
  /*
bfd605795   Randy Dunlap   From: Borislav Pe...
52
53
   * 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
54
55
56
57
58
   */
  #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
59
60
61
62
  
  
  /* note: prints function name for you */
  #ifdef ATA_DEBUG
1f938d060   Alexander Beregalov   libata.h: replace...
63
  #define DPRINTK(fmt, args...) printk(KERN_ERR "%s: " fmt, __func__, ## args)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
64
  #ifdef ATA_VERBOSE_DEBUG
1f938d060   Alexander Beregalov   libata.h: replace...
65
  #define VPRINTK(fmt, args...) printk(KERN_ERR "%s: " fmt, __func__, ## args)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
66
67
68
69
70
71
72
  #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...
73
  #define BPRINTK(fmt, args...) if (ap->flags & ATA_FLAG_DEBUGMSG) printk(KERN_ERR "%s: " fmt, __func__, ## args)
2c13b7cee   Jeff Garzik   [libata] minor fi...
74

bfd605795   Randy Dunlap   From: Borislav Pe...
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
  /* 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
106
107
  /* 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
108
109
110
  enum {
  	/* various global constants */
  	LIBATA_MAX_PRD		= ATA_MAX_PRD / 2,
d26fc9551   Alan Cox   libata: Support c...
111
  	LIBATA_DUMB_MAX_PRD	= ATA_MAX_PRD / 4,	/* Worst case */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
112
  	ATA_DEF_QUEUE		= 1,
2ab7db1ff   Tejun Heo   [PATCH] libata-eh...
113
  	/* tag ATA_MAX_QUEUE - 1 is reserved for internal commands */
a6e6ce8e8   Tejun Heo   [PATCH] libata-nc...
114
  	ATA_MAX_QUEUE		= 32,
2ab7db1ff   Tejun Heo   [PATCH] libata-eh...
115
  	ATA_TAG_INTERNAL	= ATA_MAX_QUEUE - 1,
341c2c958   Tejun Heo   libata: consisten...
116
  	ATA_SHORT_PAUSE		= 16,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
117

140b5e591   Tejun Heo   libata: fix ATAPI...
118
  	ATAPI_MAX_DRAIN		= 16 << 10,
b558edddb   Tejun Heo   libata: kill ata_...
119
  	ATA_ALL_DEVICES		= (1 << ATA_MAX_DEVICES) - 1,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
120
121
122
  	ATA_SHT_EMULATED	= 1,
  	ATA_SHT_CMD_PER_LUN	= 1,
  	ATA_SHT_THIS_ID		= -1,
cf482935c   Jeff Garzik   libata: turn on b...
123
  	ATA_SHT_USE_CLUSTERING	= 1,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
124
125
  
  	/* struct ata_device stuff */
949b38af4   Tejun Heo   [PATCH] libata: c...
126
127
  	ATA_DFLAG_LBA		= (1 << 0), /* device supports LBA */
  	ATA_DFLAG_LBA48		= (1 << 1), /* device supports LBA48 */
029f5468b   Jeff Garzik   Merge branch 'ups...
128
  	ATA_DFLAG_CDB_INTR	= (1 << 2), /* device asserts INTRQ when ready for CDB */
88e490340   Tejun Heo   [PATCH] libata-nc...
129
  	ATA_DFLAG_NCQ		= (1 << 3), /* device supports NCQ */
6fc49adb9   Tejun Heo   [PATCH] libata: u...
130
  	ATA_DFLAG_FLUSH_EXT	= (1 << 4), /* do FLUSH_EXT instead of FLUSH */
6746544c3   Tejun Heo   libata: reimpleme...
131
132
  	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: ...
133
  	ATA_DFLAG_AN		= (1 << 7), /* AN configured */
ca77329fb   Kristen Carlson Accardi   [libata] Link pow...
134
135
  	ATA_DFLAG_HIPM		= (1 << 8), /* device supports HIPM */
  	ATA_DFLAG_DIPM		= (1 << 9), /* device supports DIPM */
911630063   Tejun Heo   libata: automatic...
136
  	ATA_DFLAG_DMADIR	= (1 << 10), /* device requires DMADIR */
2557164e0   Kristen Carlson Accardi   ata: increase all...
137
  	ATA_DFLAG_CFG_MASK	= (1 << 12) - 1,
949b38af4   Tejun Heo   [PATCH] libata: c...
138

2557164e0   Kristen Carlson Accardi   ata: increase all...
139
140
  	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...
141
  	ATA_DFLAG_SLEEPING	= (1 << 15), /* device is sleeping */
00115e0f5   Tejun Heo   libata: implement...
142
  	ATA_DFLAG_DUBIOUS_XFER	= (1 << 16), /* data transfer not verified */
45fabbb77   Elias Oltmanns   libata: Implement...
143
  	ATA_DFLAG_NO_UNLOAD	= (1 << 17), /* device doesn't support unload */
445d211b0   Tejun Heo   libata: unlock HP...
144
  	ATA_DFLAG_UNLOCK_HPA	= (1 << 18), /* unlock HPA */
f20ded38a   Tejun Heo   libata: rearrange...
145
  	ATA_DFLAG_INIT_MASK	= (1 << 24) - 1,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
146

f20ded38a   Tejun Heo   libata: rearrange...
147
148
  	ATA_DFLAG_DETACH	= (1 << 24),
  	ATA_DFLAG_DETACHED	= (1 << 25),
abdda7331   Tejun Heo   [PATCH] libata-hp...
149

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
150
151
152
153
154
  	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: ...
155
156
157
158
159
  	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
160

0c88758b5   Tejun Heo   libata-link: make...
161
  	/* struct ata_link flags */
05944bdf6   Tejun Heo   libata: implement...
162
  	ATA_LFLAG_NO_HRST	= (1 << 1), /* avoid hardreset */
ae791c056   Tejun Heo   libata-pmp-prep: ...
163
164
165
166
  	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: ...
167
  	ATA_LFLAG_NO_RETRY	= (1 << 5), /* don't retry this link */
f9df58cb2   Tejun Heo   libata-pmp-prep: ...
168
  	ATA_LFLAG_DISABLED	= (1 << 6), /* link is disabled */
18f7ba4c2   Kristen Carlson Accardi   libata/ahci: encl...
169
  	ATA_LFLAG_SW_ACTIVITY	= (1 << 7), /* keep activity stats */
0c88758b5   Tejun Heo   libata-link: make...
170

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
171
  	/* struct ata_port flags */
949b38af4   Tejun Heo   [PATCH] libata: c...
172
  	ATA_FLAG_SLAVE_POSS	= (1 << 0), /* host supports slave dev */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
173
  					    /* (doesn't imply presence) */
949b38af4   Tejun Heo   [PATCH] libata: c...
174
175
176
177
178
179
180
181
  	ATA_FLAG_SATA		= (1 << 1),
  	ATA_FLAG_NO_LEGACY	= (1 << 2), /* no legacy mode check */
  	ATA_FLAG_MMIO		= (1 << 3), /* use MMIO, not PIO */
  	ATA_FLAG_SRST		= (1 << 4), /* (obsolete) use ATA SRST, not E.D.D. */
  	ATA_FLAG_SATA_RESET	= (1 << 5), /* (obsolete) use COMRESET */
  	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...
182
183
184
  	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...
185
186
  	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...
187
  	ATA_FLAG_DEBUGMSG	= (1 << 13),
388539f3f   Shaohua Li   [libata] add DMA ...
188
  	ATA_FLAG_FPDMA_AA		= (1 << 14), /* driver supports Auto-Activate */
b2a8bbe67   Tejun Heo   libata: implement...
189
  	ATA_FLAG_IGN_SIMPLEX	= (1 << 15), /* ignore SIMPLEX */
f834e49f1   Alan Cox   libata: Add a hos...
190
  	ATA_FLAG_NO_IORDY	= (1 << 16), /* controller lacks iordy */
3cadbcc09   Tejun Heo   libata-acpi: add ...
191
  	ATA_FLAG_ACPI_SATA	= (1 << 17), /* need native SATA ACPI layout */
9f45cbd3f   Kristen Carlson Accardi   [libata] check fo...
192
  	ATA_FLAG_AN		= (1 << 18), /* controller supports AN */
e0a717526   Tejun Heo   libata-pmp-prep: ...
193
  	ATA_FLAG_PMP		= (1 << 19), /* controller supports PMP */
ca77329fb   Kristen Carlson Accardi   [libata] Link pow...
194
  	ATA_FLAG_IPM		= (1 << 20), /* driver can handle IPM */
18f7ba4c2   Kristen Carlson Accardi   libata/ahci: encl...
195
196
197
198
  	ATA_FLAG_EM		= (1 << 21), /* driver supports enclosure
  					      * management */
  	ATA_FLAG_SW_ACTIVITY	= (1 << 22), /* driver supports sw activity
  					      * led */
949b38af4   Tejun Heo   [PATCH] libata: c...
199

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

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

b51e9e5db   Tejun Heo   [PATCH] libata: a...
203
204
205
206
207
208
  	/* 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...
209
  	ATA_PFLAG_SCSI_HOTPLUG	= (1 << 6), /* SCSI hotplug scheduled */
f4d6d0046   Tejun Heo   libata: ignore EH...
210
  	ATA_PFLAG_INITIALIZING	= (1 << 7), /* being initialized, don't touch */
afaa5c373   Tejun Heo   libata: implement...
211
  	ATA_PFLAG_RESETTING	= (1 << 8), /* reset in progress */
ece180d1c   Tejun Heo   libata: perform p...
212
213
  	ATA_PFLAG_UNLOADING	= (1 << 9), /* driver is being unloaded */
  	ATA_PFLAG_UNLOADED	= (1 << 10), /* driver is unloaded */
949b38af4   Tejun Heo   [PATCH] libata: c...
214

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

e3cf95dd6   Alan Cox   ata: Report 16/32...
219
220
  	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...
221
222
  	/* struct ata_queued_cmd flags */
  	ATA_QCFLAG_ACTIVE	= (1 << 0), /* cmd not yet ack'd to scsi lyer */
001102d78   Tejun Heo   libata: kill non-...
223
  	ATA_QCFLAG_DMAMAP	= (1 << 1), /* SG table is DMA mapped */
271973677   Tejun Heo   [PATCH] libata: a...
224
  	ATA_QCFLAG_IO		= (1 << 3), /* standard IO command */
e61e06722   Tejun Heo   [PATCH] libata: i...
225
  	ATA_QCFLAG_RESULT_TF	= (1 << 4), /* result TF requested */
da917d69d   Tejun Heo   libata-pmp-prep: ...
226
  	ATA_QCFLAG_CLEAR_EXCL	= (1 << 5), /* clear excl_link on completion */
e027bd36c   Tejun Heo   libata: implement...
227
  	ATA_QCFLAG_QUIET	= (1 << 6), /* don't report device error */
03faab782   Tejun Heo   libata: implement...
228
  	ATA_QCFLAG_RETRY	= (1 << 7), /* retry after failure */
e61e06722   Tejun Heo   [PATCH] libata: i...
229

9ec957f20   Tejun Heo   [PATCH] libata-eh...
230
231
232
  	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
233

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

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

b48d58f55   Tejun Heo   libata: use longe...
246
247
248
249
  	/*
  	 * 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...
250
  	 */
b48d58f55   Tejun Heo   libata: use longe...
251
252
  	ATA_TMOUT_FF_WAIT_LONG	=  2000,
  	ATA_TMOUT_FF_WAIT	=   800,
88ff6eafb   Tejun Heo   libata: implement...
253

705e76beb   Tejun Heo   libata: restructu...
254
255
256
257
258
259
260
261
262
263
  	/* 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...
264
  	ATA_WAIT_AFTER_RESET	=  150,
705e76beb   Tejun Heo   libata: restructu...
265

9dadd45b2   Tejun Heo   libata: move gene...
266
267
268
269
270
  	/* 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...
271
  	ATA_TMOUT_PMP_SRST_WAIT	= 5000,
9dadd45b2   Tejun Heo   libata: move gene...
272

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
  	/* 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...
291
  	 * unsigned long bitmap
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
292
  	 */
70cd071e4   Tejun Heo   libata: clean up ...
293
294
295
  	ATA_NR_PIO_MODES	= 7,
  	ATA_NR_MWDMA_MODES	= 5,
  	ATA_NR_UDMA_MODES	= 8,
1da7b0d01   Tejun Heo   [PATCH] libata: i...
296
297
  
  	ATA_SHIFT_PIO		= 0,
70cd071e4   Tejun Heo   libata: clean up ...
298
299
  	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...
300
301
  	/* size of buffer to pad xfers ending on unaligned boundaries */
  	ATA_DMA_PAD_SZ		= 4,
949b38af4   Tejun Heo   [PATCH] libata: c...
302

0c247c559   Tejun Heo   [PATCH] libata-eh...
303
304
  	/* ering size */
  	ATA_ERING_SIZE		= 32,
31cc23b34   Tejun Heo   libata-pmp-prep: ...
305
306
307
  	/* return values for ->qc_defer */
  	ATA_DEFER_LINK		= 1,
  	ATA_DEFER_PORT		= 2,
f3e81b19a   Tejun Heo   [PATCH] libata-eh...
308
309
  	/* desc_len for ata_eh_info and context */
  	ATA_EH_DESC_LEN		= 80,
9be1e979f   Tejun Heo   [PATCH] libata-eh...
310
311
  	/* reset / recovery action types */
  	ATA_EH_REVALIDATE	= (1 << 0),
cf4806265   Tejun Heo   libata: prefer ha...
312
313
314
  	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: ...
315
  	ATA_EH_ENABLE_LINK	= (1 << 3),
3ec25ebd6   Tejun Heo   libata: ATA_EHI_L...
316
  	ATA_EH_LPM		= (1 << 4),  /* link power management action */
45fabbb77   Elias Oltmanns   libata: Implement...
317
  	ATA_EH_PARK		= (1 << 5), /* unload heads and stop I/O */
9be1e979f   Tejun Heo   [PATCH] libata-eh...
318

45fabbb77   Elias Oltmanns   libata: Implement...
319
  	ATA_EH_PERDEV_MASK	= ATA_EH_REVALIDATE | ATA_EH_PARK,
b5b3fa386   Tejun Heo   libata: misc upda...
320
321
  	ATA_EH_ALL_ACTIONS	= ATA_EH_REVALIDATE | ATA_EH_RESET |
  				  ATA_EH_ENABLE_LINK | ATA_EH_LPM,
9be1e979f   Tejun Heo   [PATCH] libata-eh...
322

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

0d64a233f   Tejun Heo   libata: separate ...
329
330
331
332
333
  	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 */
  	ATA_EHI_POST_SETMODE	= (1 << 20), /* revaildating after setmode */
f3e81b19a   Tejun Heo   [PATCH] libata-eh...
334

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

848e4c68c   Tejun Heo   libata: transfer ...
337
338
  	/* 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...
339
340
  	/* max tries if error condition is still set after ->error_handler */
  	ATA_EH_MAX_TRIES	= 5,
ad9e27624   Tejun Heo   [PATCH] libata-eh...
341

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

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

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

2dcb407e6   Jeff Garzik   [libata] checkpat...
378
  	 /* DMA mask for user DMA control: User visible values; DO NOT
b3a706014   Alan Cox   libata: Add a dri...
379
380
381
382
  	    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...
383
384
385
386
387
  
  	/* 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...
388
389
  	ATAPI_PASS_THRU		= 3,		/* SAT pass-thru */
  	ATAPI_MISC		= 4,		/* the rest */
624d5c514   Tejun Heo   libata: reorganiz...
390
391
392
393
394
395
396
397
398
399
  
  	/* 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...
400
401
402
  	ATA_TIMING_DMACK_HOLD	= (1 << 6),
  	ATA_TIMING_CYCLE	= (1 << 7),
  	ATA_TIMING_UDMA		= (1 << 8),
624d5c514   Tejun Heo   libata: reorganiz...
403
404
405
  	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...
406
407
  				  ATA_TIMING_DMACK_HOLD | ATA_TIMING_CYCLE |
  				  ATA_TIMING_UDMA,
f1bce7f80   Tejun Heo   libata: cosmetic ...
408
409
410
411
412
  
  	/* 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...
413
414
  	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 ...
415
416
417
418
  
  	ATA_ACPI_FILTER_DEFAULT	= ATA_ACPI_FILTER_SETXFER |
  				  ATA_ACPI_FILTER_LOCK |
  				  ATA_ACPI_FILTER_DIPM,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
419
  };
7dc951aef   Tejun Heo   libata: xfer_mask...
420
421
422
423
424
425
426
427
  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...
428
  enum hsm_task_states {
c56b14d2a   Albert Lee   [PATCH] libata ir...
429
  	HSM_ST_IDLE,		/* no command on going */
715276470   Albert Lee   libata: reorder H...
430
431
  	HSM_ST_FIRST,		/* (waiting the device to)
  				   write CDB or first data block */
c56b14d2a   Albert Lee   [PATCH] libata ir...
432
433
  	HSM_ST,			/* (waiting the device to) transfer data */
  	HSM_ST_LAST,		/* (waiting the device to) complete command */
c56b14d2a   Albert Lee   [PATCH] libata ir...
434
  	HSM_ST_ERR,		/* error */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
435
  };
a7dac447b   Jeff Garzik   [libata] change a...
436
  enum ata_completion_errors {
11a56d243   Tejun Heo   [PATCH] libata: a...
437
438
439
440
441
442
443
444
445
  	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...
446
  	AC_ERR_NODEV_HINT	= (1 << 9), /* polling device detection hint */
5335b7290   Tejun Heo   libata: implement...
447
  	AC_ERR_NCQ		= (1 << 10), /* marker for offending NCQ qc */
a7dac447b   Jeff Garzik   [libata] change a...
448
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
449
450
451
452
  /* forward declarations */
  struct scsi_device;
  struct ata_port_operations;
  struct ata_port;
cc0680a58   Tejun Heo   libata-link: link...
453
  struct ata_link;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
454
455
456
  struct ata_queued_cmd;
  
  /* typedefs */
77853bf2b   Tejun Heo   [PATCH] libata: m...
457
  typedef void (*ata_qc_cb_t) (struct ata_queued_cmd *qc);
cc0680a58   Tejun Heo   libata-link: link...
458
459
  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...
460
  			      unsigned long deadline);
cc0680a58   Tejun Heo   libata-link: link...
461
  typedef void (*ata_postreset_fn_t)(struct ata_link *link, unsigned int *classes);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
462

ca77329fb   Kristen Carlson Accardi   [libata] Link pow...
463
464
465
466
467
468
469
470
471
472
  /*
   * host pm policy: If you alter this, you also need to alter libata-scsi.c
   * (for the ascii descriptions)
   */
  enum link_pm {
  	NOT_AVAILABLE,
  	MIN_POWER,
  	MAX_PERFORMANCE,
  	MEDIUM_POWER,
  };
ee959b00c   Tony Jones   SCSI: convert str...
473
  extern struct device_attribute dev_attr_link_power_management_policy;
45fabbb77   Elias Oltmanns   libata: Implement...
474
  extern struct device_attribute dev_attr_unload_heads;
18f7ba4c2   Kristen Carlson Accardi   libata/ahci: encl...
475
476
477
478
479
480
481
482
483
  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...
484

127102aea   Tejun Heo   libata: make SFF ...
485
  #ifdef CONFIG_ATA_SFF
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
486
  struct ata_ioports {
0d5ff5667   Tejun Heo   libata: convert t...
487
488
489
490
491
492
493
494
495
496
497
498
499
  	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 ...
500
  #ifdef CONFIG_ATA_BMDMA
0d5ff5667   Tejun Heo   libata: convert t...
501
  	void __iomem		*bmdma_addr;
9a7780c9a   Tejun Heo   libata-sff: make ...
502
  #endif /* CONFIG_ATA_BMDMA */
0d5ff5667   Tejun Heo   libata: convert t...
503
  	void __iomem		*scr_addr;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
504
  };
127102aea   Tejun Heo   libata: make SFF ...
505
  #endif /* CONFIG_ATA_SFF */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
506

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

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
540
  	unsigned int		nbytes;
aacda3753   Tejun Heo   libata: implement...
541
  	unsigned int		extrabytes;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
542
  	unsigned int		curbytes;
872602162   Jens Axboe   libata: convert t...
543
  	struct scatterlist	*cursg;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
544
545
546
  	unsigned int		cursg_ofs;
  
  	struct scatterlist	sgent;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
547

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

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

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
589
590
591
592
  	u8			pio_mode;
  	u8			dma_mode;
  	u8			xfer_mode;
  	unsigned int		xfer_shift;	/* ATA_SHIFT_xxx */
8cbd6df1f   Albert Lee   [PATCH] libata CH...
593
594
  	unsigned int		multi_count;	/* sectors count for
  						   READ/WRITE MULTIPLE */
b00eec1d5   Tejun Heo   [PATCH] libata: a...
595
  	unsigned int		max_sectors;	/* per-device max sectors */
6e7846e9c   Tejun Heo   [PATCH] libata: m...
596
  	unsigned int		cdb_len;
8bf62ecee   Albert Lee   [libata] C/H/S su...
597

acf356b12   Tejun Heo   [PATCH] libata: a...
598
  	/* per-dev xfer mask */
7dc951aef   Tejun Heo   libata: xfer_mask...
599
600
601
  	unsigned long		pio_mask;
  	unsigned long		mwdma_mask;
  	unsigned long		udma_mask;
acf356b12   Tejun Heo   [PATCH] libata: a...
602

8bf62ecee   Albert Lee   [libata] C/H/S su...
603
604
605
606
  	/* 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...
607

f7e989301   Jeff Garzik   [libata] linux/li...
608
609
610
611
  	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...
612
613
614
615
616
  
  	/* 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
617
  };
99cf610aa   Tejun Heo   libata: clear dev...
618
619
  /* 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...
620
   */
99cf610aa   Tejun Heo   libata: clear dev...
621
622
  #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...
623

f3e81b19a   Tejun Heo   [PATCH] libata-eh...
624
625
626
627
628
  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...
629
  	unsigned int		dev_action[ATA_MAX_DEVICES]; /* dev EH action */
f3e81b19a   Tejun Heo   [PATCH] libata-eh...
630
  	unsigned int		flags;		/* ATA_EHI_* flags */
abdda7331   Tejun Heo   [PATCH] libata-hp...
631

abdda7331   Tejun Heo   [PATCH] libata-hp...
632
  	unsigned int		probe_mask;
f3e81b19a   Tejun Heo   [PATCH] libata-eh...
633
634
635
636
637
638
639
  	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...
640
641
  	int			cmd_timeout_idx[ATA_MAX_DEVICES]
  					       [ATA_EH_CMD_TIMEOUT_TABLE_SIZE];
abdda7331   Tejun Heo   [PATCH] libata-hp...
642
643
  	unsigned int		classes[ATA_MAX_DEVICES];
  	unsigned int		did_probe_mask;
45fabbb77   Elias Oltmanns   libata: Implement...
644
  	unsigned int		unloaded_mask;
00115e0f5   Tejun Heo   libata: implement...
645
646
  	unsigned int		saved_ncq_enabled;
  	u8			saved_xfer_mode[ATA_MAX_DEVICES];
0a2c0f561   Tejun Heo   libata: improve E...
647
648
  	/* timestamp for the last reset attempt or success */
  	unsigned long		last_reset;
f3e81b19a   Tejun Heo   [PATCH] libata-eh...
649
  };
64578a3de   Tejun Heo   libata-acpi: impl...
650
651
652
653
654
655
656
657
658
659
  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...
660
661
  struct ata_link {
  	struct ata_port		*ap;
8989805d6   Tejun Heo   libata-link: add ...
662
  	int			pmp;		/* port multiplier port # */
9af5c9c97   Tejun Heo   libata-link: intr...
663
664
665
  
  	unsigned int		active_tag;	/* active tag on this link */
  	u32			sactive;	/* active NCQ commands */
0c88758b5   Tejun Heo   libata-link: make...
666
  	unsigned int		flags;		/* ATA_LFLAG_xxx */
d127ea7b8   Tejun Heo   libata: restore S...
667
  	u32			saved_scontrol;	/* SControl on probe */
9af5c9c97   Tejun Heo   libata-link: intr...
668
669
670
671
672
673
674
675
676
677
678
  	unsigned int		hw_sata_spd_limit;
  	unsigned int		sata_spd_limit;
  	unsigned int		sata_spd;	/* current SATA PHY speed */
  
  	/* record runtime error info, protected by host_set lock */
  	struct ata_eh_info	eh_info;
  	/* EH context */
  	struct ata_eh_context	eh_context;
  
  	struct ata_device	device[ATA_MAX_DEVICES];
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
679
  struct ata_port {
cca3974e4   Jeff Garzik   libata: Grand ren...
680
  	struct Scsi_Host	*scsi_host; /* our co-allocated scsi host */
029cfd6b7   Tejun Heo   libata: implement...
681
  	struct ata_port_operations *ops;
ba6a13083   Jeff Garzik   [libata] Add host...
682
  	spinlock_t		*lock;
e3cf95dd6   Alan Cox   ata: Report 16/32...
683
684
  	/* Flags owned by the EH context. Only EH should touch these once the
  	   port is active */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
685
  	unsigned long		flags;	/* ATA_FLAG_xxx */
e3cf95dd6   Alan Cox   ata: Report 16/32...
686
  	/* Flags that change dynamically, protected by ap->lock */
b51e9e5db   Tejun Heo   [PATCH] libata: a...
687
  	unsigned int		pflags; /* ATA_PFLAG_xxx */
44877b4e2   Tejun Heo   libata: s/ap->id/...
688
689
  	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
690

127102aea   Tejun Heo   libata: make SFF ...
691
  #ifdef CONFIG_ATA_SFF
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
692
  	struct ata_ioports	ioaddr;	/* ATA cmd/ctl/dma register blocks */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
693
694
  	u8			ctl;	/* cache of ATA control register */
  	u8			last_ctl;	/* Cache last written value */
ea3c64506   Gwendal Grignou   libata-sff: Reena...
695
  	struct ata_link*	sff_pio_task_link; /* link currently used */
c429137a6   Tejun Heo   libata-sff: port_...
696
  	struct delayed_work	sff_pio_task;
9a7780c9a   Tejun Heo   libata-sff: make ...
697
  #ifdef CONFIG_ATA_BMDMA
f60d70113   Tejun Heo   libata-sff: prd i...
698
699
  	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 ...
700
  #endif /* CONFIG_ATA_BMDMA */
5fe7454aa   Tejun Heo   libata-sff: ap->[...
701
  #endif /* CONFIG_ATA_SFF */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
702
703
704
705
  	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
706
707
  
  	struct ata_queued_cmd	qcmd[ATA_MAX_QUEUE];
8a8bc2233   Tejun Heo   libata: revert co...
708
  	unsigned long		qc_allocated;
dedaf2b03   Tejun Heo   [PATCH] libata-nc...
709
  	unsigned int		qc_active;
da917d69d   Tejun Heo   libata-pmp-prep: ...
710
  	int			nr_active_links; /* #links with active qcs */
dedaf2b03   Tejun Heo   [PATCH] libata-nc...
711

b1c72916a   Tejun Heo   libata: implement...
712
713
  	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
714

8989805d6   Tejun Heo   libata-link: add ...
715
716
  	int			nr_pmp_links;	/* nr of available PMP links */
  	struct ata_link		*pmp_link;	/* array of PMP links */
da917d69d   Tejun Heo   libata-pmp-prep: ...
717
  	struct ata_link		*excl_link;	/* for PMP qc exclusion */
8989805d6   Tejun Heo   libata-link: add ...
718

cca3974e4   Jeff Garzik   libata: Grand ren...
719
720
  	struct ata_port_stats	stats;
  	struct ata_host		*host;
2f1f610b6   Brian King   [PATCH] libata: R...
721
  	struct device 		*dev;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
722

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

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

bfd605795   Randy Dunlap   From: Borislav Pe...
729
  	u32			msg_enable;
a72ec4ce6   Tejun Heo   [PATCH] libata: i...
730
  	struct list_head	eh_done_q;
c6cf9e99d   Tejun Heo   [PATCH] libata: i...
731
  	wait_queue_head_t	eh_wait_q;
a1e10f7e6   Tejun Heo   libata: move EH r...
732
  	int			eh_tries;
45fabbb77   Elias Oltmanns   libata: Implement...
733
  	struct completion	park_req_pending;
bfd605795   Randy Dunlap   From: Borislav Pe...
734

500530f65   Tejun Heo   [PATCH] libata: r...
735
736
  	pm_message_t		pm_mesg;
  	int			*pm_result;
ca77329fb   Kristen Carlson Accardi   [libata] Link pow...
737
  	enum link_pm		pm_policy;
500530f65   Tejun Heo   [PATCH] libata: r...
738

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

fafbae87d   Tejun Heo   libata-acpi: impl...
744
745
  #ifdef CONFIG_ATA_ACPI
  	acpi_handle		acpi_handle;
c05e6ff03   Tejun Heo   libata-acpi: impl...
746
  	struct ata_acpi_gtm	__acpi_init_gtm; /* use ata_acpi_init_gtm() */
fafbae87d   Tejun Heo   libata-acpi: impl...
747
  #endif
84bda12af   Tejun Heo   libata: align ap-...
748
749
  	/* owned by EH */
  	u8			sector_buf[ATA_SECT_SIZE] ____cacheline_aligned;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
750
  };
029cfd6b7   Tejun Heo   libata: implement...
751
752
753
754
755
756
  /* 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
757
  struct ata_port_operations {
c1bc899f5   Tejun Heo   libata: reorganiz...
758
759
760
761
762
763
764
  	/*
  	 * 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...
765
  	bool (*qc_fill_rtf)(struct ata_queued_cmd *qc);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
766

c1bc899f5   Tejun Heo   libata: reorganiz...
767
768
769
770
771
772
773
774
  	/*
  	 * 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...
775
  	unsigned int (*read_id)(struct ata_device *dev, struct ata_taskfile *tf, u16 *id);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
776

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

c1bc899f5   Tejun Heo   libata: reorganiz...
779
780
  	void (*freeze)(struct ata_port *ap);
  	void (*thaw)(struct ata_port *ap);
a1efdaba2   Tejun Heo   libata: make rese...
781
782
783
784
785
786
787
788
  	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...
789
  	void (*error_handler)(struct ata_port *ap);
c96f1732e   Alan Cox   [libata] Improve ...
790
  	void (*lost_interrupt)(struct ata_port *ap);
c1bc899f5   Tejun Heo   libata: reorganiz...
791
792
793
794
795
  	void (*post_internal_cmd)(struct ata_queued_cmd *qc);
  
  	/*
  	 * Optional features
  	 */
82ef04fb4   Tejun Heo   libata: make SCR ...
796
797
  	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...
798
799
800
801
802
803
804
805
806
807
808
809
810
  	void (*pmp_attach)(struct ata_port *ap);
  	void (*pmp_detach)(struct ata_port *ap);
  	int  (*enable_pm)(struct ata_port *ap, enum link_pm policy);
  	void (*disable_pm)(struct ata_port *ap);
  
  	/*
  	 * 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 ...
811
  #ifdef CONFIG_ATA_SFF
c1bc899f5   Tejun Heo   libata: reorganiz...
812
813
814
  	/*
  	 * SFF / taskfile oriented ops
  	 */
5682ed33a   Tejun Heo   libata: rename SF...
815
  	void (*sff_dev_select)(struct ata_port *ap, unsigned int device);
41dec29bc   Sergei Shtylyov   libata: introduce...
816
  	void (*sff_set_devctl)(struct ata_port *ap, u8 ctl);
5682ed33a   Tejun Heo   libata: rename SF...
817
818
819
820
821
822
823
824
  	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_...
825
  	void (*sff_irq_on)(struct ata_port *);
27943620c   Tejun Heo   libata: implement...
826
  	bool (*sff_irq_check)(struct ata_port *);
5682ed33a   Tejun Heo   libata: rename SF...
827
  	void (*sff_irq_clear)(struct ata_port *);
8244cd059   Tejun Heo   libata-sff: renam...
828
  	void (*sff_drain_fifo)(struct ata_queued_cmd *qc);
5682ed33a   Tejun Heo   libata: rename SF...
829

9a7780c9a   Tejun Heo   libata-sff: make ...
830
  #ifdef CONFIG_ATA_BMDMA
c1bc899f5   Tejun Heo   libata: reorganiz...
831
832
833
834
  	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 ...
835
  #endif /* CONFIG_ATA_BMDMA */
127102aea   Tejun Heo   libata: make SFF ...
836
  #endif /* CONFIG_ATA_SFF */
c1bc899f5   Tejun Heo   libata: reorganiz...
837

18f7ba4c2   Kristen Carlson Accardi   libata/ahci: encl...
838
839
840
841
842
843
  	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...
844
845
  	/*
  	 * Obsolete
9ec957f20   Tejun Heo   [PATCH] libata-eh...
846
  	 */
c1bc899f5   Tejun Heo   libata: reorganiz...
847
848
  	void (*phy_reset)(struct ata_port *ap);
  	void (*eng_timeout)(struct ata_port *ap);
029cfd6b7   Tejun Heo   libata: implement...
849
850
851
852
853
854
  
  	/*
  	 * ->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
855
856
857
  };
  
  struct ata_port_info {
cca3974e4   Jeff Garzik   libata: Grand ren...
858
  	unsigned long		flags;
0c88758b5   Tejun Heo   libata-link: make...
859
  	unsigned long		link_flags;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
860
861
862
  	unsigned long		pio_mask;
  	unsigned long		mwdma_mask;
  	unsigned long		udma_mask;
029cfd6b7   Tejun Heo   libata: implement...
863
  	struct ata_port_operations *port_ops;
e99f8b5ef   Alan Cox   [PATCH] libata: p...
864
  	void 			*private_data;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
865
  };
452503f99   Alan Cox   Add ide-timing fu...
866
867
868
869
870
871
872
873
  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...
874
  	unsigned short dmack_hold;	/* tj */
452503f99   Alan Cox   Add ide-timing fu...
875
876
877
  	unsigned short cycle;		/* t0 */
  	unsigned short udma;		/* t2CYCTYP/2 */
  };
624d5c514   Tejun Heo   libata: reorganiz...
878
879
880
  /*
   * Core layer - drivers/ata/libata-core.c
   */
e9c839142   Tejun Heo   [PATCH] libata: c...
881
882
883
  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...
884
  extern struct ata_port_operations ata_dummy_port_ops;
21b0ad4fb   Tejun Heo   libata: add init ...
885
  extern const struct ata_port_info ata_dummy_port_info;
dd5b06c49   Tejun Heo   [PATCH] libata: i...
886

e9c839142   Tejun Heo   [PATCH] libata: c...
887
888
889
890
891
892
893
894
  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...
895

dd5b06c49   Tejun Heo   [PATCH] libata: i...
896
897
898
899
  static inline int ata_port_is_dummy(struct ata_port *ap)
  {
  	return ap->ops == &ata_dummy_port_ops;
  }
936fd7328   Tejun Heo   libata-link: link...
900
  extern int sata_set_spd(struct ata_link *link);
0aa1113d5   Tejun Heo   libata: separate ...
901
  extern int ata_std_prereset(struct ata_link *link, unsigned long deadline);
aa2731ad9   Tejun Heo   libata: separate ...
902
903
  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...
904
905
906
907
  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);
cc0680a58   Tejun Heo   libata-link: link...
908
  extern int sata_link_hardreset(struct ata_link *link,
9dadd45b2   Tejun Heo   libata: move gene...
909
910
  			const unsigned long *timing, unsigned long deadline,
  			bool *online, int (*check_ready)(struct ata_link *));
57c9efdfb   Tejun Heo   libata: implement...
911
912
  extern int sata_std_hardreset(struct ata_link *link, unsigned int *class,
  			      unsigned long deadline);
203c75b82   Tejun Heo   libata: separate ...
913
  extern void ata_std_postreset(struct ata_link *link, unsigned int *classes);
2855568b1   Jeff Garzik   [libata] struct p...
914

f31871951   Tejun Heo   libata: separate ...
915
  extern struct ata_host *ata_host_alloc(struct device *dev, int max_ports);
f5cda2572   Tejun Heo   libata: implement...
916
917
  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...
918
  extern int ata_slave_link_init(struct ata_port *ap);
ecef72532   Tejun Heo   libata: separate ...
919
  extern int ata_host_start(struct ata_host *host);
f31871951   Tejun Heo   libata: separate ...
920
921
  extern int ata_host_register(struct ata_host *host,
  			     struct scsi_host_template *sht);
f5cda2572   Tejun Heo   libata: implement...
922
923
924
  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...
925
  extern void ata_host_detach(struct ata_host *host);
cca3974e4   Jeff Garzik   libata: Grand ren...
926
  extern void ata_host_init(struct ata_host *, struct device *,
029cfd6b7   Tejun Heo   libata: implement...
927
  			  unsigned long, struct ata_port_operations *);
193515d51   Jeff Garzik   [libata] eliminat...
928
  extern int ata_scsi_detect(struct scsi_host_template *sht);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
929
930
  extern int ata_scsi_ioctl(struct scsi_device *dev, int cmd, void __user *arg);
  extern int ata_scsi_queuecmd(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *));
94be9a58d   Jeff Garzik   [libata] get-iden...
931
932
  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...
933
  extern void ata_sas_port_destroy(struct ata_port *);
cca3974e4   Jeff Garzik   libata: Grand ren...
934
  extern struct ata_port *ata_sas_port_alloc(struct ata_host *,
80289167f   Brian King   [PATCH] libata: A...
935
936
937
938
939
940
941
  					   struct ata_port_info *, struct Scsi_Host *);
  extern int ata_sas_port_init(struct ata_port *);
  extern int ata_sas_port_start(struct ata_port *ap);
  extern void ata_sas_port_stop(struct ata_port *ap);
  extern int ata_sas_slave_configure(struct scsi_device *, struct ata_port *);
  extern int ata_sas_queuecmd(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *),
  			    struct ata_port *ap);
936fd7328   Tejun Heo   libata-link: link...
942
943
944
945
  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...
946
947
  extern bool ata_link_online(struct ata_link *link);
  extern bool ata_link_offline(struct ata_link *link);
6ffa01d88   Tejun Heo   libata: add CONFI...
948
  #ifdef CONFIG_PM
cca3974e4   Jeff Garzik   libata: Grand ren...
949
950
  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...
951
  #endif
67846b301   Jeff Garzik   libata: add ata_r...
952
  extern int ata_ratelimit(void);
c22daff41   Tejun Heo   [PATCH] libata: i...
953
  extern u32 ata_wait_register(void __iomem *reg, u32 mask, u32 val,
341c2c958   Tejun Heo   libata: consisten...
954
  			     unsigned long interval, unsigned long timeout);
436d34b36   Tejun Heo   libata: uninline ...
955
  extern int atapi_cmd_type(u8 opcode);
9977126c4   Tejun Heo   libata: add @is_c...
956
957
  extern void ata_tf_to_fis(const struct ata_taskfile *tf,
  			  u8 pmp, int is_cmd, u8 *fis);
057ace5e7   Jeff Garzik   libata: const-ifi...
958
  extern void ata_tf_from_fis(const u8 *fis, struct ata_taskfile *tf);
7dc951aef   Tejun Heo   libata: xfer_mask...
959
960
961
962
963
964
965
966
967
968
  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: ...
969
  extern int ata_std_qc_defer(struct ata_queued_cmd *qc);
e46834cd2   Brian King   [PATCH] libata: A...
970
  extern void ata_noop_qc_prep(struct ata_queued_cmd *qc);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
971
972
  extern void ata_sg_init(struct ata_queued_cmd *qc, struct scatterlist *sg,
  		 unsigned int n_elem);
057ace5e7   Jeff Garzik   libata: const-ifi...
973
  extern unsigned int ata_dev_classify(const struct ata_taskfile *tf);
10305f0f8   Alan Cox   Add id_to_dma_mod...
974
  extern void ata_dev_disable(struct ata_device *adev);
6a62a04d4   Tejun Heo   [PATCH] libata: r...
975
976
977
978
  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...
979
980
  extern unsigned int ata_do_dev_read_id(struct ata_device *dev,
  					struct ata_taskfile *tf, u16 *id);
f686bcb80   Tejun Heo   [PATCH] libata-eh...
981
  extern void ata_qc_complete(struct ata_queued_cmd *qc);
79f97dadf   Tejun Heo   libata: drop @fin...
982
  extern int ata_qc_complete_multiple(struct ata_port *ap, u32 qc_active);
3373efd89   Tejun Heo   [PATCH] libata: u...
983
  extern void ata_scsi_simulate(struct ata_device *dev, struct scsi_cmnd *cmd,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
984
985
986
987
  			      void (*done)(struct scsi_cmnd *));
  extern int ata_std_bios_param(struct scsi_device *sdev,
  			      struct block_device *bdev,
  			      sector_t capacity, int geom[]);
d8d9129ea   Tejun Heo   libata: implement...
988
  extern void ata_scsi_unlock_native_capacity(struct scsi_device *sdev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
989
  extern int ata_scsi_slave_config(struct scsi_device *sdev);
83c47bcb3   Tejun Heo   [PATCH] libata-hp...
990
  extern void ata_scsi_slave_destroy(struct scsi_device *sdev);
a6e6ce8e8   Tejun Heo   [PATCH] libata-nc...
991
  extern int ata_scsi_change_queue_depth(struct scsi_device *sdev,
e881a172d   Mike Christie   [SCSI] modify cha...
992
  				       int queue_depth, int reason);
3373efd89   Tejun Heo   [PATCH] libata: u...
993
  extern struct ata_device *ata_dev_pair(struct ata_device *adev);
0260731f0   Tejun Heo   libata-link: link...
994
  extern int ata_do_set_mode(struct ata_link *link, struct ata_device **r_failed_dev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
995

be0d18dff   Alan Cox   libata: cable det...
996
997
998
  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...
999
  extern int ata_cable_ignore(struct ata_port *ap);
be0d18dff   Alan Cox   libata: cable det...
1000
  extern int ata_cable_unknown(struct ata_port *ap);
624d5c514   Tejun Heo   libata: reorganiz...
1001
  /* Timing helpers */
1bc4ccfff   Alan Cox   [PATCH] libata: a...
1002
  extern unsigned int ata_pio_need_iordy(const struct ata_device *);
6357357ca   Tejun Heo   libata: export xf...
1003
  extern const struct ata_timing *ata_timing_find_mode(u8 xfer_mode);
452503f99   Alan Cox   Add ide-timing fu...
1004
1005
1006
1007
1008
  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...
1009
  extern u8 ata_timing_cycle2mode(unsigned int xfer_shift, int cycle);
452503f99   Alan Cox   Add ide-timing fu...
1010

624d5c514   Tejun Heo   libata: reorganiz...
1011
1012
1013
1014
1015
1016
1017
1018
1019
  /* 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...
1020
  };
624d5c514   Tejun Heo   libata: reorganiz...
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
  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...
1035
  #ifdef CONFIG_ATA_ACPI
c05e6ff03   Tejun Heo   libata-acpi: impl...
1036
1037
1038
1039
1040
1041
  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...
1042
1043
  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 ...
1044
1045
  unsigned long ata_acpi_gtm_xfermask(struct ata_device *dev,
  				    const struct ata_acpi_gtm *gtm);
021ee9a6d   Tejun Heo   libata: reimpleme...
1046
  int ata_acpi_cbl_80wire(struct ata_port *ap, const struct ata_acpi_gtm *gtm);
e1ddb4b6a   Alan Cox   [libata] add ACPI...
1047
  #else
c05e6ff03   Tejun Heo   libata-acpi: impl...
1048
1049
1050
1051
  static inline const struct ata_acpi_gtm *ata_acpi_init_gtm(struct ata_port *ap)
  {
  	return NULL;
  }
7c77fa4d5   Tejun Heo   libata: separate ...
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
  
  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...
1070
1071
1072
1073
1074
1075
  
  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...
1076
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1077

ece1d6361   Tejun Heo   [PATCH] libata: s...
1078
  /*
624d5c514   Tejun Heo   libata: reorganiz...
1079
   * EH - drivers/ata/libata-eh.c
ece1d6361   Tejun Heo   [PATCH] libata: s...
1080
   */
7b70fc039   Tejun Heo   [PATCH] libata-eh...
1081
  extern void ata_port_schedule_eh(struct ata_port *ap);
dbd826168   Tejun Heo   libata-link: impl...
1082
  extern int ata_link_abort(struct ata_link *link);
7b70fc039   Tejun Heo   [PATCH] libata-eh...
1083
  extern int ata_port_abort(struct ata_port *ap);
e31804994   Tejun Heo   [PATCH] libata-eh...
1084
  extern int ata_port_freeze(struct ata_port *ap);
7d77b2470   Tejun Heo   libata-pmp-prep: ...
1085
  extern int sata_async_notification(struct ata_port *ap);
e31804994   Tejun Heo   [PATCH] libata-eh...
1086
1087
1088
  
  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...
1089

ece1d6361   Tejun Heo   [PATCH] libata: s...
1090
1091
  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...
1092
  extern void ata_eh_analyze_ncq_error(struct ata_link *link);
ece1d6361   Tejun Heo   [PATCH] libata: s...
1093

f5914a461   Tejun Heo   [PATCH] libata-hp...
1094
1095
1096
  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...
1097
  extern void ata_std_error_handler(struct ata_port *ap);
022bdb075   Tejun Heo   [PATCH] libata-eh...
1098

61440db61   Tejun Heo   [PATCH] libata: i...
1099
  /*
68d1d07b5   Tejun Heo   libata: implement...
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
   * 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...
1122
  extern struct device_attribute *ata_common_sdev_attrs[];
68d1d07b5   Tejun Heo   libata: implement...
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
  
  #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...
1137
  	.bios_param		= ata_std_bios_param,		\
d8d9129ea   Tejun Heo   libata: implement...
1138
  	.unlock_native_capacity	= ata_scsi_unlock_native_capacity, \
45fabbb77   Elias Oltmanns   libata: Implement...
1139
  	.sdev_attrs		= ata_common_sdev_attrs
68d1d07b5   Tejun Heo   libata: implement...
1140

68d1d07b5   Tejun Heo   libata: implement...
1141
1142
1143
1144
1145
  #define ATA_NCQ_SHT(drv_name)					\
  	ATA_BASE_SHT(drv_name),					\
  	.change_queue_depth	= ata_scsi_change_queue_depth
  
  /*
071f44b1d   Tejun Heo   libata: implement...
1146
1147
   * PMP helpers
   */
88fcd5627   Tejun Heo   libata: make PMP ...
1148
  #ifdef CONFIG_SATA_PMP
071f44b1d   Tejun Heo   libata: implement...
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
  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...
1161
  	return link == &link->ap->link || link == link->ap->slave_link;
071f44b1d   Tejun Heo   libata: implement...
1162
  }
88fcd5627   Tejun Heo   libata: make PMP ...
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
  #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...
1179
1180
1181
1182
1183
1184
1185
1186
1187
  
  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...
1188
1189
1190
   * printk helpers
   */
  #define ata_port_printk(ap, lv, fmt, args...) \
c2e366a10   Tejun Heo   libata: update at...
1191
  	printk("%sata%u: "fmt, lv, (ap)->print_id , ##args)
61440db61   Tejun Heo   [PATCH] libata: i...
1192

8989805d6   Tejun Heo   libata-link: add ...
1193
  #define ata_link_printk(link, lv, fmt, args...) do { \
b1c72916a   Tejun Heo   libata: implement...
1194
  	if (sata_pmp_attached((link)->ap) || (link)->ap->slave_link)	\
c2e366a10   Tejun Heo   libata: update at...
1195
  		printk("%sata%u.%02u: "fmt, lv, (link)->ap->print_id,	\
8989805d6   Tejun Heo   libata-link: add ...
1196
1197
  		       (link)->pmp , ##args); \
  	else \
c2e366a10   Tejun Heo   libata: update at...
1198
  		printk("%sata%u: "fmt, lv, (link)->ap->print_id , ##args); \
8989805d6   Tejun Heo   libata-link: add ...
1199
  	} while(0)
9af5c9c97   Tejun Heo   libata-link: intr...
1200

61440db61   Tejun Heo   [PATCH] libata: i...
1201
  #define ata_dev_printk(dev, lv, fmt, args...) \
c2e366a10   Tejun Heo   libata: update at...
1202
  	printk("%sata%u.%02u: "fmt, lv, (dev)->link->ap->print_id,	\
8989805d6   Tejun Heo   libata-link: add ...
1203
  	       (dev)->link->pmp + (dev)->devno , ##args)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1204

61440db61   Tejun Heo   [PATCH] libata: i...
1205
  /*
f3e81b19a   Tejun Heo   [PATCH] libata-eh...
1206
1207
   * ata_eh_info helpers
   */
cb94c1cf5   Tejun Heo   libata: add print...
1208
1209
1210
1211
  extern void __ata_ehi_push_desc(struct ata_eh_info *ehi, const char *fmt, ...)
  	__attribute__ ((format (printf, 2, 3)));
  extern void ata_ehi_push_desc(struct ata_eh_info *ehi, const char *fmt, ...)
  	__attribute__ ((format (printf, 2, 3)));
b64bbc39f   Tejun Heo   libata: improve E...
1212
  extern void ata_ehi_clear_desc(struct ata_eh_info *ehi);
f3e81b19a   Tejun Heo   [PATCH] libata-eh...
1213

c0b6c0377   Tejun Heo   [PATCH] libata: s...
1214
1215
  static inline void ata_ehi_hotplugged(struct ata_eh_info *ehi)
  {
b558edddb   Tejun Heo   libata: kill ata_...
1216
  	ehi->probe_mask |= (1 << ATA_MAX_DEVICES) - 1;
f8f1e1cc0   Tejun Heo   libata: reorganiz...
1217
  	ehi->flags |= ATA_EHI_HOTPLUGGED;
b558edddb   Tejun Heo   libata: kill ata_...
1218
  	ehi->action |= ATA_EH_RESET | ATA_EH_ENABLE_LINK;
c0b6c0377   Tejun Heo   [PATCH] libata: s...
1219
1220
  	ehi->err_mask |= AC_ERR_ATA_BUS;
  }
f3e81b19a   Tejun Heo   [PATCH] libata-eh...
1221
  /*
cbcdd8759   Tejun Heo   libata: implement...
1222
1223
1224
1225
1226
1227
1228
1229
   * port description helpers
   */
  extern void ata_port_desc(struct ata_port *ap, const char *fmt, ...)
  	__attribute__ ((format (printf, 2, 3)));
  #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
1230
1231
1232
1233
  static inline unsigned int ata_tag_valid(unsigned int tag)
  {
  	return (tag < ATA_MAX_QUEUE) ? 1 : 0;
  }
2ab7db1ff   Tejun Heo   [PATCH] libata-eh...
1234
1235
  static inline unsigned int ata_tag_internal(unsigned int tag)
  {
83c063dd7   Yoichi Yuasa   use ATA_TAG_INTER...
1236
  	return tag == ATA_TAG_INTERNAL;
2ab7db1ff   Tejun Heo   [PATCH] libata-eh...
1237
  }
5806db22c   Tejun Heo   [PATCH] libata: i...
1238
1239
1240
  /*
   * device helpers
   */
e1211e3fa   Tejun Heo   [PATCH] libata: i...
1241
  static inline unsigned int ata_class_enabled(unsigned int class)
597afd214   Tejun Heo   [PATCH] libata: s...
1242
  {
e0a717526   Tejun Heo   libata-pmp-prep: ...
1243
1244
  	return class == ATA_DEV_ATA || class == ATA_DEV_ATAPI ||
  		class == ATA_DEV_PMP || class == ATA_DEV_SEMB;
597afd214   Tejun Heo   [PATCH] libata: s...
1245
  }
e1211e3fa   Tejun Heo   [PATCH] libata: i...
1246
  static inline unsigned int ata_class_disabled(unsigned int class)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1247
  {
e0a717526   Tejun Heo   libata-pmp-prep: ...
1248
1249
  	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...
1250
  }
002c8054f   Tejun Heo   [PATCH] libata: i...
1251
1252
1253
1254
  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...
1255
1256
1257
1258
1259
1260
1261
1262
  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
1263
  }
002c8054f   Tejun Heo   [PATCH] libata: i...
1264
1265
1266
1267
  static inline unsigned int ata_dev_absent(const struct ata_device *dev)
  {
  	return ata_class_absent(dev->class);
  }
5806db22c   Tejun Heo   [PATCH] libata: i...
1268
  /*
f58229f80   Tejun Heo   libata-link: impl...
1269
   * link helpers
5806db22c   Tejun Heo   [PATCH] libata: i...
1270
   */
f58229f80   Tejun Heo   libata-link: impl...
1271
  static inline int ata_link_max_devices(const struct ata_link *link)
5806db22c   Tejun Heo   [PATCH] libata: i...
1272
  {
8989805d6   Tejun Heo   libata-link: add ...
1273
  	if (ata_is_host_link(link) && link->ap->flags & ATA_FLAG_SLAVE_POSS)
5806db22c   Tejun Heo   [PATCH] libata: i...
1274
1275
1276
  		return 2;
  	return 1;
  }
da917d69d   Tejun Heo   libata-pmp-prep: ...
1277
1278
1279
1280
  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...
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
  /*
   * 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...
1337

6d1245bf2   Tejun Heo   libata: separate ...
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
  /**
   *	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...
1353

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1354
1355
1356
1357
  static inline void ata_qc_set_polling(struct ata_queued_cmd *qc)
  {
  	qc->tf.ctl |= ATA_NIEN;
  }
f69499f42   Tejun Heo   [PATCH] libata-eh...
1358
1359
  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
1360
1361
1362
1363
1364
  {
  	if (likely(ata_tag_valid(tag)))
  		return &ap->qcmd[tag];
  	return NULL;
  }
f69499f42   Tejun Heo   [PATCH] libata-eh...
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
  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...
1379
1380
1381
1382
  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...
1383
  static inline void ata_tf_init(struct ata_device *dev, struct ata_taskfile *tf)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1384
1385
  {
  	memset(tf, 0, sizeof(*tf));
5fe7454aa   Tejun Heo   libata-sff: ap->[...
1386
  #ifdef CONFIG_ATA_SFF
9af5c9c97   Tejun Heo   libata-link: intr...
1387
  	tf->ctl = dev->link->ap->ctl;
5fe7454aa   Tejun Heo   libata-sff: ap->[...
1388
1389
1390
  #else
  	tf->ctl = ATA_DEVCTL_OBS;
  #endif
3373efd89   Tejun Heo   [PATCH] libata: u...
1391
  	if (dev->devno == 0)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1392
1393
1394
1395
  		tf->device = ATA_DEVICE_OBS;
  	else
  		tf->device = ATA_DEVICE_OBS | ATA_DEV1;
  }
2c13b7cee   Jeff Garzik   [libata] minor fi...
1396
1397
  static inline void ata_qc_reinit(struct ata_queued_cmd *qc)
  {
501e0c500   Tejun Heo   libata: initializ...
1398
  	qc->dma_dir = DMA_NONE;
ff2aeb1eb   Tejun Heo   libata: convert t...
1399
  	qc->sg = NULL;
2c13b7cee   Jeff Garzik   [libata] minor fi...
1400
  	qc->flags = 0;
872602162   Jens Axboe   libata: convert t...
1401
1402
  	qc->cursg = NULL;
  	qc->cursg_ofs = 0;
aacda3753   Tejun Heo   libata: implement...
1403
  	qc->nbytes = qc->extrabytes = qc->curbytes = 0;
7a801184f   Brian King   libata: Fixup n_e...
1404
  	qc->n_elem = 0;
a22e2eb07   Albert Lee   [PATCH] libata: m...
1405
  	qc->err_mask = 0;
5a5dbd18a   Mark Lord   libata: add suppo...
1406
  	qc->sect_size = ATA_SECT_SIZE;
2c13b7cee   Jeff Garzik   [libata] minor fi...
1407

3373efd89   Tejun Heo   [PATCH] libata: u...
1408
  	ata_tf_init(qc->dev, &qc->tf);
e61e06722   Tejun Heo   [PATCH] libata: i...
1409
1410
1411
1412
  
  	/* 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...
1413
  }
057ace5e7   Jeff Garzik   libata: const-ifi...
1414
  static inline int ata_try_flush_cache(const struct ata_device *dev)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1415
1416
1417
1418
1419
  {
  	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...
1420
1421
  static inline unsigned int ac_err_mask(u8 status)
  {
3655d1d32   Albert Lee   [PATCH] libata: F...
1422
  	if (status & (ATA_BUSY | ATA_DRQ))
11a56d243   Tejun Heo   [PATCH] libata: a...
1423
  		return AC_ERR_HSM;
a7dac447b   Jeff Garzik   [libata] change a...
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
  	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...
1436
1437
  static inline struct ata_port *ata_shost_to_port(struct Scsi_Host *host)
  {
4911487a3   Tejun Heo   libata: allocate ...
1438
  	return *(struct ata_port **)&host->hostdata[0];
35bb94b11   Jeff Garzik   libata: Add helpe...
1439
  }
78ab88f04   Tejun Heo   libata: improve p...
1440
1441
  static inline int ata_check_ready(u8 status)
  {
005b1f749   Jeff Garzik   [libata] revert n...
1442
1443
  	if (!(status & ATA_BUSY))
  		return 1;
78ab88f04   Tejun Heo   libata: improve p...
1444
1445
1446
1447
  
  	/* 0xff indicates either no device or device not ready */
  	if (status == 0xff)
  		return -ENODEV;
005b1f749   Jeff Garzik   [libata] revert n...
1448
  	return 0;
78ab88f04   Tejun Heo   libata: improve p...
1449
  }
341c2c958   Tejun Heo   libata: consisten...
1450
1451
1452
1453
1454
  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...
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
  /* 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 ...
1477
1478
1479
1480
  
  /**************************************************************************
   * PMP - drivers/ata/libata-pmp.c
   */
88fcd5627   Tejun Heo   libata: make PMP ...
1481
  #ifdef CONFIG_SATA_PMP
48515f6c0   Tejun Heo   libata: separate ...
1482
1483
1484
1485
  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 ...
1486
1487
1488
1489
1490
1491
1492
  #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 ...
1493

624d5c514   Tejun Heo   libata: reorganiz...
1494
1495
1496
  /**************************************************************************
   * SFF - drivers/ata/libata-sff.c
   */
127102aea   Tejun Heo   libata: make SFF ...
1497
  #ifdef CONFIG_ATA_SFF
624d5c514   Tejun Heo   libata: reorganiz...
1498
  extern const struct ata_port_operations ata_sff_port_ops;
871af1210   Alan Cox   libata: Add 32bit...
1499
  extern const struct ata_port_operations ata_bmdma32_port_ops;
624d5c514   Tejun Heo   libata: reorganiz...
1500
1501
1502
1503
1504
1505
  
  /* 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...
1506
1507
  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...
1508
1509
  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...
1510
1511
  extern int ata_sff_busy_sleep(struct ata_port *ap,
  			      unsigned long timeout_pat, unsigned long timeout);
705e76beb   Tejun Heo   libata: restructu...
1512
  extern int ata_sff_wait_ready(struct ata_link *link, unsigned long deadline);
9363c3825   Tejun Heo   libata: rename SF...
1513
1514
1515
1516
1517
  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...
1518
  			unsigned char *buf, unsigned int buflen, int rw);
871af1210   Alan Cox   libata: Add 32bit...
1519
1520
  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...
1521
  extern unsigned int ata_sff_data_xfer_noirq(struct ata_device *dev,
624d5c514   Tejun Heo   libata: reorganiz...
1522
  			unsigned char *buf, unsigned int buflen, int rw);
e42a542ba   Sergei Shtylyov   libata: make sff_...
1523
  extern void ata_sff_irq_on(struct ata_port *ap);
9363c3825   Tejun Heo   libata: rename SF...
1524
1525
1526
  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);
ea3c64506   Gwendal Grignou   libata-sff: Reena...
1527
  extern void ata_sff_queue_pio_task(struct ata_link *link, unsigned long delay);
9363c3825   Tejun Heo   libata: rename SF...
1528
  extern unsigned int ata_sff_qc_issue(struct ata_queued_cmd *qc);
22183bf56   Tejun Heo   libata: add qc_fi...
1529
  extern bool ata_sff_qc_fill_rtf(struct ata_queued_cmd *qc);
c3b288942   Tejun Heo   libata-sff: separ...
1530
  extern unsigned int ata_sff_port_intr(struct ata_port *ap,
9363c3825   Tejun Heo   libata: rename SF...
1531
1532
  				      struct ata_queued_cmd *qc);
  extern irqreturn_t ata_sff_interrupt(int irq, void *dev_instance);
c96f1732e   Alan Cox   [libata] Improve ...
1533
  extern void ata_sff_lost_interrupt(struct ata_port *ap);
9363c3825   Tejun Heo   libata: rename SF...
1534
1535
1536
1537
1538
  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...
1539
1540
  extern int ata_sff_wait_after_reset(struct ata_link *link, unsigned int devmask,
  				    unsigned long deadline);
9363c3825   Tejun Heo   libata: rename SF...
1541
  extern int ata_sff_softreset(struct ata_link *link, unsigned int *classes,
624d5c514   Tejun Heo   libata: reorganiz...
1542
  			     unsigned long deadline);
9363c3825   Tejun Heo   libata: rename SF...
1543
1544
1545
  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...
1546
  extern void ata_sff_drain_fifo(struct ata_queued_cmd *qc);
9363c3825   Tejun Heo   libata: rename SF...
1547
  extern void ata_sff_error_handler(struct ata_port *ap);
9363c3825   Tejun Heo   libata: rename SF...
1548
  extern void ata_sff_std_ports(struct ata_ioports *ioaddr);
624d5c514   Tejun Heo   libata: reorganiz...
1549
  #ifdef CONFIG_PCI
9363c3825   Tejun Heo   libata: rename SF...
1550
1551
  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...
1552
1553
  				    const struct ata_port_info * const * ppi,
  				    struct ata_host **r_host);
9363c3825   Tejun Heo   libata: rename SF...
1554
  extern int ata_pci_sff_activate_host(struct ata_host *host,
624d5c514   Tejun Heo   libata: reorganiz...
1555
1556
  				     irq_handler_t irq_handler,
  				     struct scsi_host_template *sht);
9363c3825   Tejun Heo   libata: rename SF...
1557
  extern int ata_pci_sff_init_one(struct pci_dev *pdev,
16ea0fc98   Alan Cox   libata: Pass host...
1558
1559
  		const struct ata_port_info * const * ppi,
  		struct scsi_host_template *sht, void *host_priv, int hflags);
624d5c514   Tejun Heo   libata: reorganiz...
1560
  #endif /* CONFIG_PCI */
9a7780c9a   Tejun Heo   libata-sff: make ...
1561
1562
1563
1564
1565
1566
1567
1568
  #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...
1569
  extern void ata_bmdma_qc_prep(struct ata_queued_cmd *qc);
360ff7833   Tejun Heo   libata-sff: separ...
1570
  extern unsigned int ata_bmdma_qc_issue(struct ata_queued_cmd *qc);
f47451c45   Tejun Heo   libata-sff: ata_s...
1571
  extern void ata_bmdma_dumb_qc_prep(struct ata_queued_cmd *qc);
c3b288942   Tejun Heo   libata-sff: separ...
1572
1573
1574
  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...
1575
1576
  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...
1577
  extern void ata_bmdma_irq_clear(struct ata_port *ap);
9f2f72107   Tejun Heo   libata-sff: reord...
1578
1579
1580
1581
  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...
1582
1583
  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...
1584
1585
1586
  
  #ifdef CONFIG_PCI
  extern int ata_pci_bmdma_clear_simplex(struct pci_dev *pdev);
c7087652e   Tejun Heo   libata-sff: clean...
1587
  extern void ata_pci_bmdma_init(struct ata_host *host);
1c5afdf7a   Tejun Heo   libata-sff: separ...
1588
1589
1590
1591
1592
1593
1594
  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...
1595
  #endif /* CONFIG_PCI */
9a7780c9a   Tejun Heo   libata-sff: make ...
1596
  #endif /* CONFIG_ATA_BMDMA */
9f2f72107   Tejun Heo   libata-sff: reord...
1597

624d5c514   Tejun Heo   libata: reorganiz...
1598
  /**
9363c3825   Tejun Heo   libata: rename SF...
1599
   *	ata_sff_busy_wait - Wait for a port status register
624d5c514   Tejun Heo   libata: reorganiz...
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
   *	@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...
1611
1612
  static inline u8 ata_sff_busy_wait(struct ata_port *ap, unsigned int bits,
  				   unsigned int max)
624d5c514   Tejun Heo   libata: reorganiz...
1613
1614
1615
1616
1617
  {
  	u8 status;
  
  	do {
  		udelay(10);
5682ed33a   Tejun Heo   libata: rename SF...
1618
  		status = ap->ops->sff_check_status(ap);
624d5c514   Tejun Heo   libata: reorganiz...
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
  		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...
1637
  	u8 status = ata_sff_busy_wait(ap, ATA_BUSY | ATA_DRQ, 1000);
624d5c514   Tejun Heo   libata: reorganiz...
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
  
  #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 ...
1648
  #endif /* CONFIG_ATA_SFF */
624d5c514   Tejun Heo   libata: reorganiz...
1649

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