Blame view

include/linux/ata.h 32.8 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
  
  /*
af36d7f0d   Jeff Garzik   [libata] license ...
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
   *  Copyright 2003-2004 Red Hat, Inc.  All rights reserved.
   *  Copyright 2003-2004 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.*
   *
   *  Hardware documentation available from http://www.t13.org/
   *
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
27
28
29
30
   */
  
  #ifndef __LINUX_ATA_H__
  #define __LINUX_ATA_H__
0c659b82d   Matthew Wilcox   ata: Add TRIM inf...
31
32
  #include <linux/kernel.h>
  #include <linux/string.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
33
  #include <linux/types.h>
93734a234   Bartlomiej Zolnierkiewicz   ide: ide_id_to_hd...
34
  #include <asm/byteorder.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
35
36
37
38
39
40
41
42
43
44
  
  /* defines only for the constants which don't work well as enums */
  #define ATA_DMA_BOUNDARY	0xffffUL
  #define ATA_DMA_MASK		0xffffffffULL
  
  enum {
  	/* various global constants */
  	ATA_MAX_DEVICES		= 2,	/* per bus/port */
  	ATA_MAX_PRD		= 256,	/* we could make these 256/256 */
  	ATA_SECT_SIZE		= 512,
18d6e9d51   Albert Lee   libata: Limit max...
45
  	ATA_MAX_SECTORS_128	= 128,
8b881b041   Jeff Garzik   [ATA] Increase lb...
46
  	ATA_MAX_SECTORS		= 256,
af34d6376   David Milburn   libata: add ATA_H...
47
  	ATA_MAX_SECTORS_1024    = 1024,
35303d5c3   Tom Yan   ata: make lba_{28...
48
  	ATA_MAX_SECTORS_LBA48	= 65535,/* avoid count to be 0000h */
f8d8e5799   Tony Battersby   libata: increase ...
49
  	ATA_MAX_SECTORS_TAPE	= 65535,
2983860c7   Tom Yan   libata-scsi: avoi...
50
  	ATA_MAX_TRIM_RNUM	= 64,	/* 512-byte payload / (6-byte LBA + 2-byte range per entry) */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
51
52
  
  	ATA_ID_WORDS		= 256,
37014c640   Bartlomiej Zolnierkiewicz   ata: add missing ...
53
54
55
56
  	ATA_ID_CONFIG		= 0,
  	ATA_ID_CYLS		= 1,
  	ATA_ID_HEADS		= 3,
  	ATA_ID_SECTORS		= 6,
a0cf733b3   Tejun Heo   libata: straighte...
57
  	ATA_ID_SERNO		= 10,
37014c640   Bartlomiej Zolnierkiewicz   ata: add missing ...
58
  	ATA_ID_BUF_SIZE		= 21,
a0cf733b3   Tejun Heo   libata: straighte...
59
60
  	ATA_ID_FW_REV		= 23,
  	ATA_ID_PROD		= 27,
37014c640   Bartlomiej Zolnierkiewicz   ata: add missing ...
61
62
63
  	ATA_ID_MAX_MULTSECT	= 47,
  	ATA_ID_DWORD_IO		= 48,
  	ATA_ID_CAPABILITY	= 49,
11e29e215   Alan Cox   libata: handle ea...
64
  	ATA_ID_OLD_PIO_MODES	= 51,
37014c640   Bartlomiej Zolnierkiewicz   ata: add missing ...
65
  	ATA_ID_OLD_DMA_MODES	= 52,
11e29e215   Alan Cox   libata: handle ea...
66
  	ATA_ID_FIELD_VALID	= 53,
37014c640   Bartlomiej Zolnierkiewicz   ata: add missing ...
67
68
69
70
71
72
  	ATA_ID_CUR_CYLS		= 54,
  	ATA_ID_CUR_HEADS	= 55,
  	ATA_ID_CUR_SECTORS	= 56,
  	ATA_ID_MULTSECT		= 59,
  	ATA_ID_LBA_CAPACITY	= 60,
  	ATA_ID_SWDMA_MODES	= 62,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
73
  	ATA_ID_MWDMA_MODES	= 63,
11e29e215   Alan Cox   libata: handle ea...
74
75
  	ATA_ID_PIO_MODES	= 64,
  	ATA_ID_EIDE_DMA_MIN	= 65,
37014c640   Bartlomiej Zolnierkiewicz   ata: add missing ...
76
  	ATA_ID_EIDE_DMA_TIME	= 66,
11e29e215   Alan Cox   libata: handle ea...
77
78
  	ATA_ID_EIDE_PIO		= 67,
  	ATA_ID_EIDE_PIO_IORDY	= 68,
e78db4dfb   Martin K. Petersen   libata: Report ze...
79
  	ATA_ID_ADDITIONAL_SUPP	= 69,
37014c640   Bartlomiej Zolnierkiewicz   ata: add missing ...
80
  	ATA_ID_QUEUE_DEPTH	= 75,
583661a89   Shane Huang   ata: define enum ...
81
82
83
  	ATA_ID_SATA_CAPABILITY	= 76,
  	ATA_ID_SATA_CAPABILITY_2	= 77,
  	ATA_ID_FEATURE_SUPP	= 78,
11e29e215   Alan Cox   libata: handle ea...
84
  	ATA_ID_MAJOR_VER	= 80,
37014c640   Bartlomiej Zolnierkiewicz   ata: add missing ...
85
86
87
88
89
90
91
92
93
94
  	ATA_ID_COMMAND_SET_1	= 82,
  	ATA_ID_COMMAND_SET_2	= 83,
  	ATA_ID_CFSSE		= 84,
  	ATA_ID_CFS_ENABLE_1	= 85,
  	ATA_ID_CFS_ENABLE_2	= 86,
  	ATA_ID_CSF_DEFAULT	= 87,
  	ATA_ID_UDMA_MODES	= 88,
  	ATA_ID_HW_CONFIG	= 93,
  	ATA_ID_SPG		= 98,
  	ATA_ID_LBA_CAPACITY_2	= 100,
18f0f9785   Christoph Hellwig   libata: add trans...
95
  	ATA_ID_SECTOR_SIZE	= 106,
6b3b9d73e   Hannes Reinecke   libata: Include W...
96
  	ATA_ID_WWN		= 108,
295124dce   Grant Grundler   [libata] support ...
97
  	ATA_ID_LOGICAL_SECTOR_SIZE	= 117,	/* and 118 */
fe7173c20   Hannes Reinecke   libata: Implement...
98
99
  	ATA_ID_COMMAND_SET_3	= 119,
  	ATA_ID_COMMAND_SET_4	= 120,
37014c640   Bartlomiej Zolnierkiewicz   ata: add missing ...
100
101
102
103
  	ATA_ID_LAST_LUN		= 126,
  	ATA_ID_DLF		= 128,
  	ATA_ID_CSFO		= 129,
  	ATA_ID_CFA_POWER	= 160,
d42ad15b7   Sergei Shtylyov   ata: add CFA spec...
104
105
  	ATA_ID_CFA_KEY_MGMT	= 162,
  	ATA_ID_CFA_MODES	= 163,
0c659b82d   Matthew Wilcox   ata: Add TRIM inf...
106
  	ATA_ID_DATA_SET_MGMT	= 169,
7b2030942   Shaun Tancheff   libata: Add suppo...
107
  	ATA_ID_SCT_CMD_XPORT	= 206,
8bff7c6b0   Jens Axboe   libata: set queue...
108
  	ATA_ID_ROT_SPEED	= 217,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
109
  	ATA_ID_PIO4		= (1 << 1),
a0cf733b3   Tejun Heo   libata: straighte...
110
111
112
  	ATA_ID_SERNO_LEN	= 20,
  	ATA_ID_FW_REV_LEN	= 8,
  	ATA_ID_PROD_LEN		= 40,
6b3b9d73e   Hannes Reinecke   libata: Include W...
113
  	ATA_ID_WWN_LEN		= 8,
a0cf733b3   Tejun Heo   libata: straighte...
114

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
115
  	ATA_PCI_CTL_OFS		= 2,
4099d1432   Bartlomiej Zolnierkiewicz   ide: add PIO masks
116
117
118
119
120
121
122
123
  
  	ATA_PIO0		= (1 << 0),
  	ATA_PIO1		= ATA_PIO0 | (1 << 1),
  	ATA_PIO2		= ATA_PIO1 | (1 << 2),
  	ATA_PIO3		= ATA_PIO2 | (1 << 3),
  	ATA_PIO4		= ATA_PIO3 | (1 << 4),
  	ATA_PIO5		= ATA_PIO4 | (1 << 5),
  	ATA_PIO6		= ATA_PIO5 | (1 << 6),
22ddbd1e0   Erik Inge Bolsø   include/linux/ata...
124
  	ATA_PIO4_ONLY		= (1 << 4),
91a6d4ed3   Bartlomiej Zolnierkiewicz   ata: add ATA_MWDM...
125
126
127
128
129
130
131
132
133
  	ATA_SWDMA0		= (1 << 0),
  	ATA_SWDMA1		= ATA_SWDMA0 | (1 << 1),
  	ATA_SWDMA2		= ATA_SWDMA1 | (1 << 2),
  
  	ATA_SWDMA2_ONLY		= (1 << 2),
  
  	ATA_MWDMA0		= (1 << 0),
  	ATA_MWDMA1		= ATA_MWDMA0 | (1 << 1),
  	ATA_MWDMA2		= ATA_MWDMA1 | (1 << 2),
22ddbd1e0   Erik Inge Bolsø   include/linux/ata...
134
135
  	ATA_MWDMA3		= ATA_MWDMA2 | (1 << 3),
  	ATA_MWDMA4		= ATA_MWDMA3 | (1 << 4),
91a6d4ed3   Bartlomiej Zolnierkiewicz   ata: add ATA_MWDM...
136
137
138
  
  	ATA_MWDMA12_ONLY	= (1 << 1) | (1 << 2),
  	ATA_MWDMA2_ONLY		= (1 << 2),
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
139
140
141
142
143
144
145
146
147
  	ATA_UDMA0		= (1 << 0),
  	ATA_UDMA1		= ATA_UDMA0 | (1 << 1),
  	ATA_UDMA2		= ATA_UDMA1 | (1 << 2),
  	ATA_UDMA3		= ATA_UDMA2 | (1 << 3),
  	ATA_UDMA4		= ATA_UDMA3 | (1 << 4),
  	ATA_UDMA5		= ATA_UDMA4 | (1 << 5),
  	ATA_UDMA6		= ATA_UDMA5 | (1 << 6),
  	ATA_UDMA7		= ATA_UDMA6 | (1 << 7),
  	/* ATA_UDMA7 is just for completeness... doesn't exist (yet?).  */
22ddbd1e0   Erik Inge Bolsø   include/linux/ata...
148
  	ATA_UDMA24_ONLY		= (1 << 2) | (1 << 4),
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
  	ATA_UDMA_MASK_40C	= ATA_UDMA2,	/* udma0-2 */
  
  	/* DMA-related */
  	ATA_PRD_SZ		= 8,
  	ATA_PRD_TBL_SZ		= (ATA_MAX_PRD * ATA_PRD_SZ),
  	ATA_PRD_EOT		= (1 << 31),	/* end-of-table flag */
  
  	ATA_DMA_TABLE_OFS	= 4,
  	ATA_DMA_STATUS		= 2,
  	ATA_DMA_CMD		= 0,
  	ATA_DMA_WR		= (1 << 3),
  	ATA_DMA_START		= (1 << 0),
  	ATA_DMA_INTR		= (1 << 2),
  	ATA_DMA_ERR		= (1 << 1),
  	ATA_DMA_ACTIVE		= (1 << 0),
  
  	/* bits in ATA command block registers */
  	ATA_HOB			= (1 << 7),	/* LBA48 selector */
  	ATA_NIEN		= (1 << 1),	/* disable-irq flag */
  	ATA_LBA			= (1 << 6),	/* LBA28 selector */
  	ATA_DEV1		= (1 << 4),	/* Select Device 1 (slave) */
  	ATA_DEVICE_OBS		= (1 << 7) | (1 << 5), /* obs bits in dev reg */
  	ATA_DEVCTL_OBS		= (1 << 3),	/* obsolete bit in devctl reg */
  	ATA_BUSY		= (1 << 7),	/* BSY status bit */
  	ATA_DRDY		= (1 << 6),	/* device ready */
  	ATA_DF			= (1 << 5),	/* device fault */
b59116205   Bartlomiej Zolnierkiewicz   ata: add missing ...
175
  	ATA_DSC			= (1 << 4),	/* drive seek complete */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
176
  	ATA_DRQ			= (1 << 3),	/* data request i/o */
b59116205   Bartlomiej Zolnierkiewicz   ata: add missing ...
177
  	ATA_CORR		= (1 << 2),	/* corrected data error */
27f00e53a   Hannes Reinecke   ide,ata: Rename A...
178
  	ATA_SENSE		= (1 << 1),	/* sense code available */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
179
180
  	ATA_ERR			= (1 << 0),	/* have an error */
  	ATA_SRST		= (1 << 2),	/* software reset */
9be1e979f   Tejun Heo   [PATCH] libata-eh...
181
  	ATA_ICRC		= (1 << 7),	/* interface CRC error */
b59116205   Bartlomiej Zolnierkiewicz   ata: add missing ...
182
  	ATA_BBK			= ATA_ICRC,	/* pre-EIDE: block marked bad */
9be1e979f   Tejun Heo   [PATCH] libata-eh...
183
  	ATA_UNC			= (1 << 6),	/* uncorrectable media error */
b59116205   Bartlomiej Zolnierkiewicz   ata: add missing ...
184
  	ATA_MC			= (1 << 5),	/* media changed */
9be1e979f   Tejun Heo   [PATCH] libata-eh...
185
  	ATA_IDNF		= (1 << 4),	/* ID not found */
b59116205   Bartlomiej Zolnierkiewicz   ata: add missing ...
186
  	ATA_MCR			= (1 << 3),	/* media change requested */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
187
  	ATA_ABORTED		= (1 << 2),	/* command aborted */
b59116205   Bartlomiej Zolnierkiewicz   ata: add missing ...
188
189
190
191
192
193
194
  	ATA_TRK0NF		= (1 << 1),	/* track 0 not found */
  	ATA_AMNF		= (1 << 0),	/* address mark not found */
  	ATAPI_LFS		= 0xF0,		/* last failed sense */
  	ATAPI_EOM		= ATA_TRK0NF,	/* end of media */
  	ATAPI_ILI		= ATA_AMNF,	/* illegal length indication */
  	ATAPI_IO		= (1 << 1),
  	ATAPI_COD		= (1 << 0),
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
  
  	/* ATA command block registers */
  	ATA_REG_DATA		= 0x00,
  	ATA_REG_ERR		= 0x01,
  	ATA_REG_NSECT		= 0x02,
  	ATA_REG_LBAL		= 0x03,
  	ATA_REG_LBAM		= 0x04,
  	ATA_REG_LBAH		= 0x05,
  	ATA_REG_DEVICE		= 0x06,
  	ATA_REG_STATUS		= 0x07,
  
  	ATA_REG_FEATURE		= ATA_REG_ERR, /* and their aliases */
  	ATA_REG_CMD		= ATA_REG_STATUS,
  	ATA_REG_BYTEL		= ATA_REG_LBAM,
  	ATA_REG_BYTEH		= ATA_REG_LBAH,
  	ATA_REG_DEVSEL		= ATA_REG_DEVICE,
  	ATA_REG_IRQ		= ATA_REG_NSECT,
  
  	/* ATA device commands */
ab2181cf3   Jeff Garzik   [ATA] Add named c...
214
  	ATA_CMD_DEV_RESET	= 0x08, /* ATAPI device reset */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
215
  	ATA_CMD_CHK_POWER	= 0xE5, /* check power mode */
972dcafb6   Douglas Gilbert   [libata scsi] add...
216
217
  	ATA_CMD_STANDBY		= 0xE2, /* place in standby power mode */
  	ATA_CMD_IDLE		= 0xE3, /* place in idle power mode */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
218
  	ATA_CMD_EDD		= 0x90,	/* execute device diagnostic */
6521148c6   Robert Hancock   libata: add comma...
219
  	ATA_CMD_DOWNLOAD_MICRO  = 0x92,
3915c3b5b   Robert Hancock   libata: Add some ...
220
  	ATA_CMD_DOWNLOAD_MICRO_DMA = 0x93,
6521148c6   Robert Hancock   libata: add comma...
221
  	ATA_CMD_NOP		= 0x00,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
222
223
224
225
  	ATA_CMD_FLUSH		= 0xE7,
  	ATA_CMD_FLUSH_EXT	= 0xEA,
  	ATA_CMD_ID_ATA		= 0xEC,
  	ATA_CMD_ID_ATAPI	= 0xA1,
6521148c6   Robert Hancock   libata: add comma...
226
  	ATA_CMD_SERVICE		= 0xA2,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
227
228
  	ATA_CMD_READ		= 0xC8,
  	ATA_CMD_READ_EXT	= 0x25,
6521148c6   Robert Hancock   libata: add comma...
229
230
231
  	ATA_CMD_READ_QUEUED	= 0x26,
  	ATA_CMD_READ_STREAM_EXT	= 0x2B,
  	ATA_CMD_READ_STREAM_DMA_EXT = 0x2A,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
232
233
  	ATA_CMD_WRITE		= 0xCA,
  	ATA_CMD_WRITE_EXT	= 0x35,
6521148c6   Robert Hancock   libata: add comma...
234
235
236
  	ATA_CMD_WRITE_QUEUED	= 0x36,
  	ATA_CMD_WRITE_STREAM_EXT = 0x3B,
  	ATA_CMD_WRITE_STREAM_DMA_EXT = 0x3A,
9a3dccc42   Tejun Heo   [BLOCK] add FUA s...
237
  	ATA_CMD_WRITE_FUA_EXT	= 0x3D,
6521148c6   Robert Hancock   libata: add comma...
238
  	ATA_CMD_WRITE_QUEUED_FUA_EXT = 0x3E,
88e490340   Tejun Heo   [PATCH] libata-nc...
239
240
  	ATA_CMD_FPDMA_READ	= 0x60,
  	ATA_CMD_FPDMA_WRITE	= 0x61,
661ce1f0c   Hannes Reinecke   libata/libsas: De...
241
  	ATA_CMD_NCQ_NON_DATA	= 0x63,
ed36911c7   Marc Carino   libata: Add suppo...
242
243
  	ATA_CMD_FPDMA_SEND	= 0x64,
  	ATA_CMD_FPDMA_RECV	= 0x65,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
244
245
246
247
  	ATA_CMD_PIO_READ	= 0x20,
  	ATA_CMD_PIO_READ_EXT	= 0x24,
  	ATA_CMD_PIO_WRITE	= 0x30,
  	ATA_CMD_PIO_WRITE_EXT	= 0x34,
8cbd6df1f   Albert Lee   [PATCH] libata CH...
248
249
250
251
  	ATA_CMD_READ_MULTI	= 0xC4,
  	ATA_CMD_READ_MULTI_EXT	= 0x29,
  	ATA_CMD_WRITE_MULTI	= 0xC5,
  	ATA_CMD_WRITE_MULTI_EXT	= 0x39,
9a3dccc42   Tejun Heo   [BLOCK] add FUA s...
252
  	ATA_CMD_WRITE_MULTI_FUA_EXT = 0xCE,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
253
  	ATA_CMD_SET_FEATURES	= 0xEF,
2c3d2a46f   Albert Lee   libata passthru: ...
254
  	ATA_CMD_SET_MULTI	= 0xC6,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
255
256
257
  	ATA_CMD_PACKET		= 0xA0,
  	ATA_CMD_VERIFY		= 0x40,
  	ATA_CMD_VERIFY_EXT	= 0x42,
6521148c6   Robert Hancock   libata: add comma...
258
  	ATA_CMD_WRITE_UNCORR_EXT = 0x45,
2dcb407e6   Jeff Garzik   [libata] checkpat...
259
260
  	ATA_CMD_STANDBYNOW1	= 0xE0,
  	ATA_CMD_IDLEIMMEDIATE	= 0xE1,
054a5fbac   Tejun Heo   libata: track SLE...
261
  	ATA_CMD_SLEEP		= 0xE6,
8bf62ecee   Albert Lee   [libata] C/H/S su...
262
  	ATA_CMD_INIT_DEV_PARAMS	= 0x91,
b6782728d   Alan Cox   [PATCH] libata: A...
263
264
  	ATA_CMD_READ_NATIVE_MAX	= 0xF8,
  	ATA_CMD_READ_NATIVE_MAX_EXT = 0x27,
1e999736c   Alan Cox   libata: HPA support
265
266
  	ATA_CMD_SET_MAX		= 0xF9,
  	ATA_CMD_SET_MAX_EXT	= 0x37,
6521148c6   Robert Hancock   libata: add comma...
267
268
269
270
  	ATA_CMD_READ_LOG_EXT	= 0x2F,
  	ATA_CMD_WRITE_LOG_EXT	= 0x3F,
  	ATA_CMD_READ_LOG_DMA_EXT = 0x47,
  	ATA_CMD_WRITE_LOG_DMA_EXT = 0x57,
3915c3b5b   Robert Hancock   libata: Add some ...
271
  	ATA_CMD_TRUSTED_NONDATA	= 0x5B,
6521148c6   Robert Hancock   libata: add comma...
272
273
274
275
  	ATA_CMD_TRUSTED_RCV	= 0x5C,
  	ATA_CMD_TRUSTED_RCV_DMA = 0x5D,
  	ATA_CMD_TRUSTED_SND	= 0x5E,
  	ATA_CMD_TRUSTED_SND_DMA = 0x5F,
814600ee1   Tejun Heo   libata-link: add ...
276
  	ATA_CMD_PMP_READ	= 0xE4,
3915c3b5b   Robert Hancock   libata: Add some ...
277
  	ATA_CMD_PMP_READ_DMA	= 0xE9,
814600ee1   Tejun Heo   libata-link: add ...
278
  	ATA_CMD_PMP_WRITE	= 0xE8,
3915c3b5b   Robert Hancock   libata: Add some ...
279
  	ATA_CMD_PMP_WRITE_DMA	= 0xEB,
ce2e0abbd   Tejun Heo   libata: add more ...
280
  	ATA_CMD_CONF_OVERLAY	= 0xB1,
6521148c6   Robert Hancock   libata: add comma...
281
282
283
284
  	ATA_CMD_SEC_SET_PASS	= 0xF1,
  	ATA_CMD_SEC_UNLOCK	= 0xF2,
  	ATA_CMD_SEC_ERASE_PREP	= 0xF3,
  	ATA_CMD_SEC_ERASE_UNIT	= 0xF4,
ce2e0abbd   Tejun Heo   libata: add more ...
285
  	ATA_CMD_SEC_FREEZE_LOCK	= 0xF5,
6521148c6   Robert Hancock   libata: add comma...
286
287
  	ATA_CMD_SEC_DISABLE_PASS = 0xF6,
  	ATA_CMD_CONFIG_STREAM	= 0x51,
476d9894d   Bartlomiej Zolnierkiewicz   ata: add missing ...
288
289
290
  	ATA_CMD_SMART		= 0xB0,
  	ATA_CMD_MEDIA_LOCK	= 0xDE,
  	ATA_CMD_MEDIA_UNLOCK	= 0xDF,
0c659b82d   Matthew Wilcox   ata: Add TRIM inf...
291
  	ATA_CMD_DSM		= 0x06,
6521148c6   Robert Hancock   libata: add comma...
292
293
294
295
296
297
  	ATA_CMD_CHK_MED_CRD_TYP = 0xD1,
  	ATA_CMD_CFA_REQ_EXT_ERR = 0x03,
  	ATA_CMD_CFA_WRITE_NE	= 0x38,
  	ATA_CMD_CFA_TRANS_SECT	= 0x87,
  	ATA_CMD_CFA_ERASE	= 0xC0,
  	ATA_CMD_CFA_WRITE_MULT_NE = 0xCD,
3915c3b5b   Robert Hancock   libata: Add some ...
298
299
  	ATA_CMD_REQ_SENSE_DATA  = 0x0B,
  	ATA_CMD_SANITIZE_DEVICE = 0xB4,
28a3fc229   Hannes Reinecke   libata: implement...
300
  	ATA_CMD_ZAC_MGMT_IN	= 0x4A,
27708a957   Hannes Reinecke   libata: Implement...
301
  	ATA_CMD_ZAC_MGMT_OUT	= 0x9F,
3915c3b5b   Robert Hancock   libata: Add some ...
302

476d9894d   Bartlomiej Zolnierkiewicz   ata: add missing ...
303
304
  	/* marked obsolete in the ATA/ATAPI-7 spec */
  	ATA_CMD_RESTORE		= 0x10,
88e490340   Tejun Heo   [PATCH] libata-nc...
305

5c65d8bb3   Hannes Reinecke   libata: Add comma...
306
307
  	/* Subcmds for ATA_CMD_FPDMA_RECV */
  	ATA_SUBCMD_FPDMA_RECV_RD_LOG_DMA_EXT = 0x01,
28a3fc229   Hannes Reinecke   libata: implement...
308
  	ATA_SUBCMD_FPDMA_RECV_ZAC_MGMT_IN    = 0x02,
5c65d8bb3   Hannes Reinecke   libata: Add comma...
309

ed36911c7   Marc Carino   libata: Add suppo...
310
311
312
  	/* Subcmds for ATA_CMD_FPDMA_SEND */
  	ATA_SUBCMD_FPDMA_SEND_DSM            = 0x00,
  	ATA_SUBCMD_FPDMA_SEND_WR_LOG_DMA_EXT = 0x02,
a57038496   Hannes Reinecke   libata-trace: dec...
313
314
315
316
  	/* Subcmds for ATA_CMD_NCQ_NON_DATA */
  	ATA_SUBCMD_NCQ_NON_DATA_ABORT_QUEUE  = 0x00,
  	ATA_SUBCMD_NCQ_NON_DATA_SET_FEATURES = 0x05,
  	ATA_SUBCMD_NCQ_NON_DATA_ZERO_EXT     = 0x06,
284b3b77e   Hannes Reinecke   libata: NCQ encap...
317
  	ATA_SUBCMD_NCQ_NON_DATA_ZAC_MGMT_OUT = 0x07,
a57038496   Hannes Reinecke   libata-trace: dec...
318

28a3fc229   Hannes Reinecke   libata: implement...
319
320
  	/* Subcmds for ATA_CMD_ZAC_MGMT_IN */
  	ATA_SUBCMD_ZAC_MGMT_IN_REPORT_ZONES = 0x00,
27708a957   Hannes Reinecke   libata: Implement...
321
322
323
324
325
  	/* Subcmds for ATA_CMD_ZAC_MGMT_OUT */
  	ATA_SUBCMD_ZAC_MGMT_OUT_CLOSE_ZONE = 0x01,
  	ATA_SUBCMD_ZAC_MGMT_OUT_FINISH_ZONE = 0x02,
  	ATA_SUBCMD_ZAC_MGMT_OUT_OPEN_ZONE = 0x03,
  	ATA_SUBCMD_ZAC_MGMT_OUT_RESET_WRITE_POINTER = 0x04,
88e490340   Tejun Heo   [PATCH] libata-nc...
326
  	/* READ_LOG_EXT pages */
fe5af0cc3   Hannes Reinecke   libata: Check log...
327
  	ATA_LOG_DIRECTORY	= 0x0,
88e490340   Tejun Heo   [PATCH] libata-nc...
328
  	ATA_LOG_SATA_NCQ	= 0x10,
284b3b77e   Hannes Reinecke   libata: NCQ encap...
329
  	ATA_LOG_NCQ_NON_DATA	  = 0x12,
ed36911c7   Marc Carino   libata: Add suppo...
330
  	ATA_LOG_NCQ_SEND_RECV	  = 0x13,
65fe1f0f6   Shane Huang   ahci: implement a...
331
332
  	ATA_LOG_SATA_ID_DEV_DATA  = 0x30,
  	ATA_LOG_SATA_SETTINGS	  = 0x08,
6d1003ae8   Hannes Reinecke   libata: support h...
333
  	ATA_LOG_ZONED_INFORMATION = 0x09,
803739d25   Shane Huang   [libata] replace ...
334
335
336
  	ATA_LOG_DEVSLP_OFFSET	  = 0x30,
  	ATA_LOG_DEVSLP_SIZE	  = 0x08,
  	ATA_LOG_DEVSLP_MDAT	  = 0x00,
65fe1f0f6   Shane Huang   ahci: implement a...
337
  	ATA_LOG_DEVSLP_MDAT_MASK  = 0x1F,
803739d25   Shane Huang   [libata] replace ...
338
339
  	ATA_LOG_DEVSLP_DETO	  = 0x01,
  	ATA_LOG_DEVSLP_VALID	  = 0x07,
65fe1f0f6   Shane Huang   ahci: implement a...
340
  	ATA_LOG_DEVSLP_VALID_MASK = 0x80,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
341

ed36911c7   Marc Carino   libata: Add suppo...
342
343
344
345
346
347
  	/* NCQ send and receive log */
  	ATA_LOG_NCQ_SEND_RECV_SUBCMDS_OFFSET	= 0x00,
  	ATA_LOG_NCQ_SEND_RECV_SUBCMDS_DSM	= (1 << 0),
  	ATA_LOG_NCQ_SEND_RECV_DSM_OFFSET	= 0x04,
  	ATA_LOG_NCQ_SEND_RECV_DSM_TRIM		= (1 << 0),
  	ATA_LOG_NCQ_SEND_RECV_RD_LOG_OFFSET	= 0x08,
5c65d8bb3   Hannes Reinecke   libata: Add comma...
348
  	ATA_LOG_NCQ_SEND_RECV_RD_LOG_SUPPORTED  = (1 << 0),
ed36911c7   Marc Carino   libata: Add suppo...
349
  	ATA_LOG_NCQ_SEND_RECV_WR_LOG_OFFSET	= 0x0C,
5c65d8bb3   Hannes Reinecke   libata: Add comma...
350
  	ATA_LOG_NCQ_SEND_RECV_WR_LOG_SUPPORTED  = (1 << 0),
28a3fc229   Hannes Reinecke   libata: implement...
351
352
353
354
  	ATA_LOG_NCQ_SEND_RECV_ZAC_MGMT_OFFSET	= 0x10,
  	ATA_LOG_NCQ_SEND_RECV_ZAC_MGMT_OUT_SUPPORTED = (1 << 0),
  	ATA_LOG_NCQ_SEND_RECV_ZAC_MGMT_IN_SUPPORTED = (1 << 1),
  	ATA_LOG_NCQ_SEND_RECV_SIZE		= 0x14,
ed36911c7   Marc Carino   libata: Add suppo...
355

a57038496   Hannes Reinecke   libata-trace: dec...
356
357
358
359
360
361
362
363
364
365
366
  	/* NCQ Non-Data log */
  	ATA_LOG_NCQ_NON_DATA_SUBCMDS_OFFSET	= 0x00,
  	ATA_LOG_NCQ_NON_DATA_ABORT_OFFSET	= 0x00,
  	ATA_LOG_NCQ_NON_DATA_ABORT_NCQ		= (1 << 0),
  	ATA_LOG_NCQ_NON_DATA_ABORT_ALL		= (1 << 1),
  	ATA_LOG_NCQ_NON_DATA_ABORT_STREAMING	= (1 << 2),
  	ATA_LOG_NCQ_NON_DATA_ABORT_NON_STREAMING = (1 << 3),
  	ATA_LOG_NCQ_NON_DATA_ABORT_SELECTED	= (1 << 4),
  	ATA_LOG_NCQ_NON_DATA_ZAC_MGMT_OFFSET	= 0x1C,
  	ATA_LOG_NCQ_NON_DATA_ZAC_MGMT_OUT	= (1 << 0),
  	ATA_LOG_NCQ_NON_DATA_SIZE		= 0x40,
ed36911c7   Marc Carino   libata: Add suppo...
367

5a5dbd18a   Mark Lord   libata: add suppo...
368
369
370
371
372
  	/* READ/WRITE LONG (obsolete) */
  	ATA_CMD_READ_LONG	= 0x22,
  	ATA_CMD_READ_LONG_ONCE	= 0x23,
  	ATA_CMD_WRITE_LONG	= 0x32,
  	ATA_CMD_WRITE_LONG_ONCE	= 0x33,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
373
374
375
376
377
378
379
380
381
382
  	/* SETFEATURES stuff */
  	SETFEATURES_XFER	= 0x03,
  	XFER_UDMA_7		= 0x47,
  	XFER_UDMA_6		= 0x46,
  	XFER_UDMA_5		= 0x45,
  	XFER_UDMA_4		= 0x44,
  	XFER_UDMA_3		= 0x43,
  	XFER_UDMA_2		= 0x42,
  	XFER_UDMA_1		= 0x41,
  	XFER_UDMA_0		= 0x40,
b352e57dc   Alan Cox   [PATCH] libata: A...
383
384
  	XFER_MW_DMA_4		= 0x24,	/* CFA only */
  	XFER_MW_DMA_3		= 0x23,	/* CFA only */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
385
386
387
  	XFER_MW_DMA_2		= 0x22,
  	XFER_MW_DMA_1		= 0x21,
  	XFER_MW_DMA_0		= 0x20,
b4b52db71   Alan Cox   [PATCH] ata: re-o...
388
389
390
  	XFER_SW_DMA_2		= 0x12,
  	XFER_SW_DMA_1		= 0x11,
  	XFER_SW_DMA_0		= 0x10,
b352e57dc   Alan Cox   [PATCH] libata: A...
391
392
  	XFER_PIO_6		= 0x0E,	/* CFA only */
  	XFER_PIO_5		= 0x0D,	/* CFA only */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
393
394
395
396
397
  	XFER_PIO_4		= 0x0C,
  	XFER_PIO_3		= 0x0B,
  	XFER_PIO_2		= 0x0A,
  	XFER_PIO_1		= 0x09,
  	XFER_PIO_0		= 0x08,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
398
  	XFER_PIO_SLOW		= 0x00,
3057ac3c1   zhao, forrest   [PATCH] Snoop SET...
399
400
  	SETFEATURES_WC_ON	= 0x02, /* Enable write cache */
  	SETFEATURES_WC_OFF	= 0x82, /* Disable write cache */
0c12735e8   Tom Yan   libata-scsi: fix ...
401
402
  	SETFEATURES_RA_ON	= 0xaa, /* Enable read look-ahead */
  	SETFEATURES_RA_OFF	= 0x55, /* Disable read look-ahead */
476d9894d   Bartlomiej Zolnierkiewicz   ata: add missing ...
403
404
405
  	/* Enable/Disable Automatic Acoustic Management */
  	SETFEATURES_AAM_ON	= 0x42,
  	SETFEATURES_AAM_OFF	= 0xC2,
974e0a453   Damien Le Moal   libata-core: Allo...
406
407
  	SETFEATURES_SPINUP		= 0x07, /* Spin-up drive */
  	SETFEATURES_SPINUP_TIMEOUT	= 30000, /* 30s timeout for drive spin-up from PUIS */
169439c2e   Mark Lord   libata: Handle dr...
408

9f45cbd3f   Kristen Carlson Accardi   [libata] check fo...
409
410
411
412
  	SETFEATURES_SATA_ENABLE = 0x10, /* Enable use of SATA feature */
  	SETFEATURES_SATA_DISABLE = 0x90, /* Disable use of SATA feature */
  
  	/* SETFEATURE Sector counts for SATA features */
fa5b561c4   Tejun Heo   libata: implement...
413
  	SATA_FPDMA_OFFSET	= 0x01,	/* FPDMA non-zero buffer offsets */
f1bce7f80   Tejun Heo   libata: cosmetic ...
414
415
  	SATA_FPDMA_AA		= 0x02, /* FPDMA Setup FIS Auto-Activate */
  	SATA_DIPM		= 0x03,	/* Device Initiated Power Management */
fa5b561c4   Tejun Heo   libata: implement...
416
  	SATA_FPDMA_IN_ORDER	= 0x04,	/* FPDMA in-order data delivery */
f1bce7f80   Tejun Heo   libata: cosmetic ...
417
  	SATA_AN			= 0x05,	/* Asynchronous Notification */
fa5b561c4   Tejun Heo   libata: implement...
418
  	SATA_SSP		= 0x06,	/* Software Settings Preservation */
65fe1f0f6   Shane Huang   ahci: implement a...
419
  	SATA_DEVSLP		= 0x09,	/* Device Sleep */
9f45cbd3f   Kristen Carlson Accardi   [libata] check fo...
420

e87fd28cf   Hannes Reinecke   libata: Implement...
421
  	SETFEATURE_SENSE_DATA	= 0xC3, /* Sense Data Reporting feature */
ce2e0abbd   Tejun Heo   libata: add more ...
422
423
424
425
426
427
428
429
430
431
432
433
  	/* feature values for SET_MAX */
  	ATA_SET_MAX_ADDR	= 0x00,
  	ATA_SET_MAX_PASSWD	= 0x01,
  	ATA_SET_MAX_LOCK	= 0x02,
  	ATA_SET_MAX_UNLOCK	= 0x03,
  	ATA_SET_MAX_FREEZE_LOCK	= 0x04,
  
  	/* feature values for DEVICE CONFIGURATION OVERLAY */
  	ATA_DCO_RESTORE		= 0xC0,
  	ATA_DCO_FREEZE_LOCK	= 0xC1,
  	ATA_DCO_IDENTIFY	= 0xC2,
  	ATA_DCO_SET		= 0xC3,
476d9894d   Bartlomiej Zolnierkiewicz   ata: add missing ...
434
435
436
437
  	/* feature values for SMART */
  	ATA_SMART_ENABLE	= 0xD8,
  	ATA_SMART_READ_VALUES	= 0xD0,
  	ATA_SMART_READ_THRESHOLDS = 0xD1,
0c659b82d   Matthew Wilcox   ata: Add TRIM inf...
438
439
  	/* feature values for Data Set Management */
  	ATA_DSM_TRIM		= 0x01,
476d9894d   Bartlomiej Zolnierkiewicz   ata: add missing ...
440
441
442
  	/* password used in LBA Mid / LBA High for executing SMART commands */
  	ATA_SMART_LBAM_PASS	= 0x4F,
  	ATA_SMART_LBAH_PASS	= 0xC2,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
443
444
445
446
447
  	/* ATAPI stuff */
  	ATAPI_PKT_DMA		= (1 << 0),
  	ATAPI_DMADIR		= (1 << 2),	/* ATAPI data dir:
  						   0=to device, 1=to host */
  	ATAPI_CDB_LEN		= 16,
814600ee1   Tejun Heo   libata-link: add ...
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
  	/* PMP stuff */
  	SATA_PMP_MAX_PORTS	= 15,
  	SATA_PMP_CTRL_PORT	= 15,
  
  	SATA_PMP_GSCR_DWORDS	= 128,
  	SATA_PMP_GSCR_PROD_ID	= 0,
  	SATA_PMP_GSCR_REV	= 1,
  	SATA_PMP_GSCR_PORT_INFO	= 2,
  	SATA_PMP_GSCR_ERROR	= 32,
  	SATA_PMP_GSCR_ERROR_EN	= 33,
  	SATA_PMP_GSCR_FEAT	= 64,
  	SATA_PMP_GSCR_FEAT_EN	= 96,
  
  	SATA_PMP_PSCR_STATUS	= 0,
  	SATA_PMP_PSCR_ERROR	= 1,
  	SATA_PMP_PSCR_CONTROL	= 2,
  
  	SATA_PMP_FEAT_BIST	= (1 << 0),
  	SATA_PMP_FEAT_PMREQ	= (1 << 1),
  	SATA_PMP_FEAT_DYNSSC	= (1 << 2),
  	SATA_PMP_FEAT_NOTIFY	= (1 << 3),
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
469
470
471
472
  	/* cable types */
  	ATA_CBL_NONE		= 0,
  	ATA_CBL_PATA40		= 1,
  	ATA_CBL_PATA80		= 2,
c88f90c37   Tejun Heo   libata: add ATA_C...
473
474
475
476
  	ATA_CBL_PATA40_SHORT	= 3,	/* 40 wire cable to high UDMA spec */
  	ATA_CBL_PATA_UNK	= 4,	/* don't know, maybe 80c? */
  	ATA_CBL_PATA_IGN	= 5,	/* don't know, ignore cable handling */
  	ATA_CBL_SATA		= 6,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
477
478
479
480
481
482
483
  
  	/* SATA Status and Control Registers */
  	SCR_STATUS		= 0,
  	SCR_ERROR		= 1,
  	SCR_CONTROL		= 2,
  	SCR_ACTIVE		= 3,
  	SCR_NOTIFICATION	= 4,
9be1e979f   Tejun Heo   [PATCH] libata-eh...
484
485
486
487
488
489
490
491
  	/* SError bits */
  	SERR_DATA_RECOVERED	= (1 << 0), /* recovered data error */
  	SERR_COMM_RECOVERED	= (1 << 1), /* recovered comm failure */
  	SERR_DATA		= (1 << 8), /* unrecovered data error */
  	SERR_PERSISTENT		= (1 << 9), /* persistent data/comm error */
  	SERR_PROTOCOL		= (1 << 10), /* protocol violation */
  	SERR_INTERNAL		= (1 << 11), /* host internal error */
  	SERR_PHYRDY_CHG		= (1 << 16), /* PHY RDY changed */
1333e1943   Robert Hancock   libata: add human...
492
493
494
495
496
497
498
499
500
  	SERR_PHY_INT_ERR	= (1 << 17), /* PHY internal error */
  	SERR_COMM_WAKE		= (1 << 18), /* Comm wake */
  	SERR_10B_8B_ERR		= (1 << 19), /* 10b to 8b decode error */
  	SERR_DISPARITY		= (1 << 20), /* Disparity */
  	SERR_CRC		= (1 << 21), /* CRC error */
  	SERR_HANDSHAKE		= (1 << 22), /* Handshake error */
  	SERR_LINK_SEQ_ERR	= (1 << 23), /* Link sequence error */
  	SERR_TRANS_ST_ERROR	= (1 << 24), /* Transport state trans. error */
  	SERR_UNRECOG_FIS	= (1 << 25), /* Unrecognized FIS */
9be1e979f   Tejun Heo   [PATCH] libata-eh...
501
  	SERR_DEV_XCHG		= (1 << 26), /* device exchanged */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
502
  };
37f92d77d   Christoph Hellwig   ata: define ATA_P...
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
  enum ata_prot_flags {
  	/* protocol flags */
  	ATA_PROT_FLAG_PIO	= (1 << 0), /* is PIO */
  	ATA_PROT_FLAG_DMA	= (1 << 1), /* is DMA */
  	ATA_PROT_FLAG_NCQ	= (1 << 2), /* is NCQ */
  	ATA_PROT_FLAG_ATAPI	= (1 << 3), /* is ATAPI */
  
  	/* taskfile protocols */
  	ATA_PROT_UNKNOWN	= (u8)-1,
  	ATA_PROT_NODATA		= 0,
  	ATA_PROT_PIO		= ATA_PROT_FLAG_PIO,
  	ATA_PROT_DMA		= ATA_PROT_FLAG_DMA,
  	ATA_PROT_NCQ_NODATA	= ATA_PROT_FLAG_NCQ,
  	ATA_PROT_NCQ		= ATA_PROT_FLAG_DMA | ATA_PROT_FLAG_NCQ,
  	ATAPI_PROT_NODATA	= ATA_PROT_FLAG_ATAPI,
  	ATAPI_PROT_PIO		= ATA_PROT_FLAG_ATAPI | ATA_PROT_FLAG_PIO,
  	ATAPI_PROT_DMA		= ATA_PROT_FLAG_ATAPI | ATA_PROT_FLAG_DMA,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
520
521
522
  };
  
  enum ata_ioctls {
287e6611a   Arnd Bergmann   libata: fix HDIO_...
523
524
  	ATA_IOC_GET_IO32	= 0x309, /* HDIO_GET_32BIT */
  	ATA_IOC_SET_IO32	= 0x324, /* HDIO_SET_32BIT */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
525
526
527
  };
  
  /* core structures */
f60d70113   Tejun Heo   libata-sff: prd i...
528
  struct ata_bmdma_prd {
4ca4e4396   Al Viro   libata annotation...
529
530
  	__le32			addr;
  	__le32			flags_len;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
531
  };
405e66b38   Tejun Heo   libata: implement...
532
533
534
  /*
   * id tests
   */
37014c640   Bartlomiej Zolnierkiewicz   ata: add missing ...
535
536
537
  #define ata_id_is_ata(id)	(((id)[ATA_ID_CONFIG] & (1 << 15)) == 0)
  #define ata_id_has_lba(id)	((id)[ATA_ID_CAPABILITY] & (1 << 9))
  #define ata_id_has_dma(id)	((id)[ATA_ID_CAPABILITY] & (1 << 8))
583661a89   Shane Huang   ata: define enum ...
538
  #define ata_id_has_ncq(id)	((id)[ATA_ID_SATA_CAPABILITY] & (1 << 8))
37014c640   Bartlomiej Zolnierkiewicz   ata: add missing ...
539
  #define ata_id_queue_depth(id)	(((id)[ATA_ID_QUEUE_DEPTH] & 0x1f) + 1)
0628ee7c8   Nicholas Krause   libata: s/ata_id_...
540
  #define ata_id_removable(id)	((id)[ATA_ID_CONFIG] & (1 << 7))
854c73a2f   Tejun Heo   libata: misc upda...
541
  #define ata_id_has_atapi_AN(id)	\
583661a89   Shane Huang   ata: define enum ...
542
543
544
  	((((id)[ATA_ID_SATA_CAPABILITY] != 0x0000) && \
  	  ((id)[ATA_ID_SATA_CAPABILITY] != 0xffff)) && \
  	 ((id)[ATA_ID_FEATURE_SUPP] & (1 << 5)))
388539f3f   Shaohua Li   [libata] add DMA ...
545
  #define ata_id_has_fpdma_aa(id)	\
583661a89   Shane Huang   ata: define enum ...
546
547
548
  	((((id)[ATA_ID_SATA_CAPABILITY] != 0x0000) && \
  	  ((id)[ATA_ID_SATA_CAPABILITY] != 0xffff)) && \
  	 ((id)[ATA_ID_FEATURE_SUPP] & (1 << 2)))
37014c640   Bartlomiej Zolnierkiewicz   ata: add missing ...
549
550
  #define ata_id_iordy_disable(id) ((id)[ATA_ID_CAPABILITY] & (1 << 10))
  #define ata_id_has_iordy(id) ((id)[ATA_ID_CAPABILITY] & (1 << 11))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
551
552
553
554
555
556
557
  #define ata_id_u32(id,n)	\
  	(((u32) (id)[(n) + 1] << 16) | ((u32) (id)[(n)]))
  #define ata_id_u64(id,n)	\
  	( ((u64) (id)[(n) + 3] << 48) |	\
  	  ((u64) (id)[(n) + 2] << 32) |	\
  	  ((u64) (id)[(n) + 1] << 16) |	\
  	  ((u64) (id)[(n) + 0]) )
37014c640   Bartlomiej Zolnierkiewicz   ata: add missing ...
558
  #define ata_id_cdb_intr(id)	(((id)[ATA_ID_CONFIG] & 0x60) == 0x20)
583661a89   Shane Huang   ata: define enum ...
559
  #define ata_id_has_da(id)	((id)[ATA_ID_SATA_CAPABILITY_2] & (1 << 4))
65fe1f0f6   Shane Huang   ahci: implement a...
560
  #define ata_id_has_devslp(id)	((id)[ATA_ID_FEATURE_SUPP] & (1 << 8))
5b01e4b9e   Hannes Reinecke   libata: Implement...
561
562
  #define ata_id_has_ncq_autosense(id) \
  				((id)[ATA_ID_FEATURE_SUPP] & (1 << 7))
312f7da28   Albert Lee   [PATCH] libata: i...
563

ca77329fb   Kristen Carlson Accardi   [libata] Link pow...
564
565
  static inline bool ata_id_has_hipm(const u16 *id)
  {
583661a89   Shane Huang   ata: define enum ...
566
  	u16 val = id[ATA_ID_SATA_CAPABILITY];
ca77329fb   Kristen Carlson Accardi   [libata] Link pow...
567
568
569
570
571
572
573
574
575
  
  	if (val == 0 || val == 0xffff)
  		return false;
  
  	return val & (1 << 9);
  }
  
  static inline bool ata_id_has_dipm(const u16 *id)
  {
583661a89   Shane Huang   ata: define enum ...
576
  	u16 val = id[ATA_ID_FEATURE_SUPP];
ca77329fb   Kristen Carlson Accardi   [libata] Link pow...
577
578
579
580
581
582
  
  	if (val == 0 || val == 0xffff)
  		return false;
  
  	return val & (1 << 3);
  }
ae8d4ee7f   Alan Cox   libata: Disable A...
583

4dce8ba94   Hannes Reinecke   libata: Use 'bool...
584
  static inline bool ata_id_has_fua(const u16 *id)
c7293870a   Alan Cox   libata: Strict ch...
585
  {
37014c640   Bartlomiej Zolnierkiewicz   ata: add missing ...
586
  	if ((id[ATA_ID_CFSSE] & 0xC000) != 0x4000)
4dce8ba94   Hannes Reinecke   libata: Use 'bool...
587
  		return false;
37014c640   Bartlomiej Zolnierkiewicz   ata: add missing ...
588
  	return id[ATA_ID_CFSSE] & (1 << 6);
c7293870a   Alan Cox   libata: Strict ch...
589
  }
4dce8ba94   Hannes Reinecke   libata: Use 'bool...
590
  static inline bool ata_id_has_flush(const u16 *id)
c7293870a   Alan Cox   libata: Strict ch...
591
  {
37014c640   Bartlomiej Zolnierkiewicz   ata: add missing ...
592
  	if ((id[ATA_ID_COMMAND_SET_2] & 0xC000) != 0x4000)
4dce8ba94   Hannes Reinecke   libata: Use 'bool...
593
  		return false;
37014c640   Bartlomiej Zolnierkiewicz   ata: add missing ...
594
  	return id[ATA_ID_COMMAND_SET_2] & (1 << 12);
c7293870a   Alan Cox   libata: Strict ch...
595
  }
4dce8ba94   Hannes Reinecke   libata: Use 'bool...
596
  static inline bool ata_id_flush_enabled(const u16 *id)
4b58f17d7   Bartlomiej Zolnierkiewicz   ide: ide_id_has_f...
597
598
  {
  	if (ata_id_has_flush(id) == 0)
4dce8ba94   Hannes Reinecke   libata: Use 'bool...
599
  		return false;
4b58f17d7   Bartlomiej Zolnierkiewicz   ide: ide_id_has_f...
600
  	if ((id[ATA_ID_CSF_DEFAULT] & 0xC000) != 0x4000)
4dce8ba94   Hannes Reinecke   libata: Use 'bool...
601
  		return false;
4b58f17d7   Bartlomiej Zolnierkiewicz   ide: ide_id_has_f...
602
603
  	return id[ATA_ID_CFS_ENABLE_2] & (1 << 12);
  }
4dce8ba94   Hannes Reinecke   libata: Use 'bool...
604
  static inline bool ata_id_has_flush_ext(const u16 *id)
c7293870a   Alan Cox   libata: Strict ch...
605
  {
37014c640   Bartlomiej Zolnierkiewicz   ata: add missing ...
606
  	if ((id[ATA_ID_COMMAND_SET_2] & 0xC000) != 0x4000)
4dce8ba94   Hannes Reinecke   libata: Use 'bool...
607
  		return false;
37014c640   Bartlomiej Zolnierkiewicz   ata: add missing ...
608
  	return id[ATA_ID_COMMAND_SET_2] & (1 << 13);
c7293870a   Alan Cox   libata: Strict ch...
609
  }
4dce8ba94   Hannes Reinecke   libata: Use 'bool...
610
  static inline bool ata_id_flush_ext_enabled(const u16 *id)
ff2779b56   Bartlomiej Zolnierkiewicz   ide: ide_id_has_f...
611
612
  {
  	if (ata_id_has_flush_ext(id) == 0)
4dce8ba94   Hannes Reinecke   libata: Use 'bool...
613
  		return false;
ff2779b56   Bartlomiej Zolnierkiewicz   ide: ide_id_has_f...
614
  	if ((id[ATA_ID_CSF_DEFAULT] & 0xC000) != 0x4000)
4dce8ba94   Hannes Reinecke   libata: Use 'bool...
615
  		return false;
ff2779b56   Bartlomiej Zolnierkiewicz   ide: ide_id_has_f...
616
617
618
619
620
621
  	/*
  	 * some Maxtor disks have bit 13 defined incorrectly
  	 * so check bit 10 too
  	 */
  	return (id[ATA_ID_CFS_ENABLE_2] & 0x2400) == 0x2400;
  }
295124dce   Grant Grundler   [libata] support ...
622
  static inline u32 ata_id_logical_sector_size(const u16 *id)
18f0f9785   Christoph Hellwig   libata: add trans...
623
  {
295124dce   Grant Grundler   [libata] support ...
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
  	/* T13/1699-D Revision 6a, Sep 6, 2008. Page 128.
  	 * IDENTIFY DEVICE data, word 117-118.
  	 * 0xd000 ignores bit 13 (logical:physical > 1)
  	 */
  	if ((id[ATA_ID_SECTOR_SIZE] & 0xd000) == 0x5000)
  		return (((id[ATA_ID_LOGICAL_SECTOR_SIZE+1] << 16)
  			 + id[ATA_ID_LOGICAL_SECTOR_SIZE]) * sizeof(u16)) ;
  	return ATA_SECT_SIZE;
  }
  
  static inline u8 ata_id_log2_per_physical_sector(const u16 *id)
  {
  	/* T13/1699-D Revision 6a, Sep 6, 2008. Page 128.
  	 * IDENTIFY DEVICE data, word 106.
  	 * 0xe000 ignores bit 12 (logical sector > 512 bytes)
  	 */
  	if ((id[ATA_ID_SECTOR_SIZE] & 0xe000) == 0x6000)
  		return (id[ATA_ID_SECTOR_SIZE] & 0xf);
  	return 0;
18f0f9785   Christoph Hellwig   libata: add trans...
643
  }
295124dce   Grant Grundler   [libata] support ...
644
645
646
647
648
649
650
651
652
653
654
  /* Offset of logical sectors relative to physical sectors.
   *
   * If device has more than one logical sector per physical sector
   * (aka 512 byte emulation), vendors might offset the "sector 0" address
   * so sector 63 is "naturally aligned" - e.g. FAT partition table.
   * This avoids Read/Mod/Write penalties when using FAT partition table
   * and updating "well aligned" (FS perspective) physical sectors on every
   * transaction.
   */
  static inline u16 ata_id_logical_sector_offset(const u16 *id,
  	 u8 log2_per_phys)
18f0f9785   Christoph Hellwig   libata: add trans...
655
  {
295124dce   Grant Grundler   [libata] support ...
656
657
658
659
660
661
662
663
  	u16 word_209 = id[209];
  
  	if ((log2_per_phys > 1) && (word_209 & 0xc000) == 0x4000) {
  		u16 first = word_209 & 0x3fff;
  		if (first > 0)
  			return (1 << log2_per_phys) - first;
  	}
  	return 0;
18f0f9785   Christoph Hellwig   libata: add trans...
664
  }
4dce8ba94   Hannes Reinecke   libata: Use 'bool...
665
  static inline bool ata_id_has_lba48(const u16 *id)
c7293870a   Alan Cox   libata: Strict ch...
666
  {
37014c640   Bartlomiej Zolnierkiewicz   ata: add missing ...
667
  	if ((id[ATA_ID_COMMAND_SET_2] & 0xC000) != 0x4000)
4dce8ba94   Hannes Reinecke   libata: Use 'bool...
668
  		return false;
37014c640   Bartlomiej Zolnierkiewicz   ata: add missing ...
669
  	if (!ata_id_u64(id, ATA_ID_LBA_CAPACITY_2))
4dce8ba94   Hannes Reinecke   libata: Use 'bool...
670
  		return false;
37014c640   Bartlomiej Zolnierkiewicz   ata: add missing ...
671
  	return id[ATA_ID_COMMAND_SET_2] & (1 << 10);
c7293870a   Alan Cox   libata: Strict ch...
672
  }
4dce8ba94   Hannes Reinecke   libata: Use 'bool...
673
  static inline bool ata_id_lba48_enabled(const u16 *id)
942dcd85b   Bartlomiej Zolnierkiewicz   ide: idedisk_supp...
674
675
  {
  	if (ata_id_has_lba48(id) == 0)
4dce8ba94   Hannes Reinecke   libata: Use 'bool...
676
  		return false;
942dcd85b   Bartlomiej Zolnierkiewicz   ide: idedisk_supp...
677
  	if ((id[ATA_ID_CSF_DEFAULT] & 0xC000) != 0x4000)
4dce8ba94   Hannes Reinecke   libata: Use 'bool...
678
  		return false;
942dcd85b   Bartlomiej Zolnierkiewicz   ide: idedisk_supp...
679
680
  	return id[ATA_ID_CFS_ENABLE_2] & (1 << 10);
  }
4dce8ba94   Hannes Reinecke   libata: Use 'bool...
681
  static inline bool ata_id_hpa_enabled(const u16 *id)
c7293870a   Alan Cox   libata: Strict ch...
682
683
  {
  	/* Yes children, word 83 valid bits cover word 82 data */
37014c640   Bartlomiej Zolnierkiewicz   ata: add missing ...
684
  	if ((id[ATA_ID_COMMAND_SET_2] & 0xC000) != 0x4000)
4dce8ba94   Hannes Reinecke   libata: Use 'bool...
685
  		return false;
c7293870a   Alan Cox   libata: Strict ch...
686
  	/* And 87 covers 85-87 */
37014c640   Bartlomiej Zolnierkiewicz   ata: add missing ...
687
  	if ((id[ATA_ID_CSF_DEFAULT] & 0xC000) != 0x4000)
4dce8ba94   Hannes Reinecke   libata: Use 'bool...
688
  		return false;
c7293870a   Alan Cox   libata: Strict ch...
689
  	/* Check command sets enabled as well as supported */
37014c640   Bartlomiej Zolnierkiewicz   ata: add missing ...
690
  	if ((id[ATA_ID_CFS_ENABLE_1] & (1 << 10)) == 0)
4dce8ba94   Hannes Reinecke   libata: Use 'bool...
691
  		return false;
37014c640   Bartlomiej Zolnierkiewicz   ata: add missing ...
692
  	return id[ATA_ID_COMMAND_SET_1] & (1 << 10);
c7293870a   Alan Cox   libata: Strict ch...
693
  }
4dce8ba94   Hannes Reinecke   libata: Use 'bool...
694
  static inline bool ata_id_has_wcache(const u16 *id)
c7293870a   Alan Cox   libata: Strict ch...
695
696
  {
  	/* Yes children, word 83 valid bits cover word 82 data */
37014c640   Bartlomiej Zolnierkiewicz   ata: add missing ...
697
  	if ((id[ATA_ID_COMMAND_SET_2] & 0xC000) != 0x4000)
4dce8ba94   Hannes Reinecke   libata: Use 'bool...
698
  		return false;
37014c640   Bartlomiej Zolnierkiewicz   ata: add missing ...
699
  	return id[ATA_ID_COMMAND_SET_1] & (1 << 5);
c7293870a   Alan Cox   libata: Strict ch...
700
  }
4dce8ba94   Hannes Reinecke   libata: Use 'bool...
701
  static inline bool ata_id_has_pm(const u16 *id)
c7293870a   Alan Cox   libata: Strict ch...
702
  {
37014c640   Bartlomiej Zolnierkiewicz   ata: add missing ...
703
  	if ((id[ATA_ID_COMMAND_SET_2] & 0xC000) != 0x4000)
4dce8ba94   Hannes Reinecke   libata: Use 'bool...
704
  		return false;
37014c640   Bartlomiej Zolnierkiewicz   ata: add missing ...
705
  	return id[ATA_ID_COMMAND_SET_1] & (1 << 3);
c7293870a   Alan Cox   libata: Strict ch...
706
  }
4dce8ba94   Hannes Reinecke   libata: Use 'bool...
707
  static inline bool ata_id_rahead_enabled(const u16 *id)
c7293870a   Alan Cox   libata: Strict ch...
708
  {
37014c640   Bartlomiej Zolnierkiewicz   ata: add missing ...
709
  	if ((id[ATA_ID_CSF_DEFAULT] & 0xC000) != 0x4000)
4dce8ba94   Hannes Reinecke   libata: Use 'bool...
710
  		return false;
37014c640   Bartlomiej Zolnierkiewicz   ata: add missing ...
711
  	return id[ATA_ID_CFS_ENABLE_1] & (1 << 6);
c7293870a   Alan Cox   libata: Strict ch...
712
  }
4dce8ba94   Hannes Reinecke   libata: Use 'bool...
713
  static inline bool ata_id_wcache_enabled(const u16 *id)
c7293870a   Alan Cox   libata: Strict ch...
714
  {
37014c640   Bartlomiej Zolnierkiewicz   ata: add missing ...
715
  	if ((id[ATA_ID_CSF_DEFAULT] & 0xC000) != 0x4000)
4dce8ba94   Hannes Reinecke   libata: Use 'bool...
716
  		return false;
37014c640   Bartlomiej Zolnierkiewicz   ata: add missing ...
717
  	return id[ATA_ID_CFS_ENABLE_1] & (1 << 5);
c7293870a   Alan Cox   libata: Strict ch...
718
  }
9faa64385   Hannes Reinecke   libata: use READ_...
719
720
  static inline bool ata_id_has_read_log_dma_ext(const u16 *id)
  {
406c057c4   Martin K. Petersen   libata: READ LOG ...
721
  	/* Word 86 must have bit 15 set */
9faa64385   Hannes Reinecke   libata: use READ_...
722
723
  	if (!(id[ATA_ID_CFS_ENABLE_2] & (1 << 15)))
  		return false;
406c057c4   Martin K. Petersen   libata: READ LOG ...
724
725
726
727
728
729
730
731
732
733
  
  	/* READ LOG DMA EXT support can be signaled either from word 119
  	 * or from word 120. The format is the same for both words: Bit
  	 * 15 must be cleared, bit 14 set and bit 3 set.
  	 */
  	if ((id[ATA_ID_COMMAND_SET_3] & 0xC008) == 0x4008 ||
  	    (id[ATA_ID_COMMAND_SET_4] & 0xC008) == 0x4008)
  		return true;
  
  	return false;
9faa64385   Hannes Reinecke   libata: use READ_...
734
  }
e87fd28cf   Hannes Reinecke   libata: Implement...
735
736
737
738
739
740
741
742
743
744
745
746
747
  static inline bool ata_id_has_sense_reporting(const u16 *id)
  {
  	if (!(id[ATA_ID_CFS_ENABLE_2] & (1 << 15)))
  		return false;
  	return id[ATA_ID_COMMAND_SET_3] & (1 << 6);
  }
  
  static inline bool ata_id_sense_reporting_enabled(const u16 *id)
  {
  	if (!(id[ATA_ID_CFS_ENABLE_2] & (1 << 15)))
  		return false;
  	return id[ATA_ID_COMMAND_SET_4] & (1 << 6);
  }
c7293870a   Alan Cox   libata: Strict ch...
748
  /**
7b2030942   Shaun Tancheff   libata: Add suppo...
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
   *
   * Word: 206 - SCT Command Transport
   *    15:12 - Vendor Specific
   *     11:6 - Reserved
   *        5 - SCT Command Transport Data Tables supported
   *        4 - SCT Command Transport Features Control supported
   *        3 - SCT Command Transport Error Recovery Control supported
   *        2 - SCT Command Transport Write Same supported
   *        1 - SCT Command Transport Long Sector Access supported
   *        0 - SCT Command Transport supported
   */
  static inline bool ata_id_sct_data_tables(const u16 *id)
  {
  	return id[ATA_ID_SCT_CMD_XPORT] & (1 << 5) ? true : false;
  }
  
  static inline bool ata_id_sct_features_ctrl(const u16 *id)
  {
  	return id[ATA_ID_SCT_CMD_XPORT] & (1 << 4) ? true : false;
  }
  
  static inline bool ata_id_sct_error_recovery_ctrl(const u16 *id)
  {
  	return id[ATA_ID_SCT_CMD_XPORT] & (1 << 3) ? true : false;
  }
  
  static inline bool ata_id_sct_write_same(const u16 *id)
  {
  	return id[ATA_ID_SCT_CMD_XPORT] & (1 << 2) ? true : false;
  }
  
  static inline bool ata_id_sct_long_sector_access(const u16 *id)
  {
  	return id[ATA_ID_SCT_CMD_XPORT] & (1 << 1) ? true : false;
  }
  
  static inline bool ata_id_sct_supported(const u16 *id)
  {
  	return id[ATA_ID_SCT_CMD_XPORT] & (1 << 0) ? true : false;
  }
  
  /**
c7293870a   Alan Cox   libata: Strict ch...
791
792
793
794
795
796
797
798
799
   *	ata_id_major_version	-	get ATA level of drive
   *	@id: Identify data
   *
   *	Caveats:
   *		ATA-1 considers identify optional
   *		ATA-2 introduces mandatory identify
   *		ATA-3 introduces word 80 and accurate reporting
   *
   *	The practical impact of this is that ata_id_major_version cannot
2dcb407e6   Jeff Garzik   [libata] checkpat...
800
   *	reliably report on drives below ATA3.
c7293870a   Alan Cox   libata: Strict ch...
801
   */
3d2ca9109   Tejun Heo   [PATCH] libata: s...
802
803
804
  static inline unsigned int ata_id_major_version(const u16 *id)
  {
  	unsigned int mver;
b352e57dc   Alan Cox   [PATCH] libata: A...
805
806
  	if (id[ATA_ID_MAJOR_VER] == 0xFFFF)
  		return 0;
3d2ca9109   Tejun Heo   [PATCH] libata: s...
807
808
809
810
811
  	for (mver = 14; mver >= 1; mver--)
  		if (id[ATA_ID_MAJOR_VER] & (1 << mver))
  			break;
  	return mver;
  }
4dce8ba94   Hannes Reinecke   libata: Use 'bool...
812
  static inline bool ata_id_is_sata(const u16 *id)
32d909115   Tejun Heo   libata: test majo...
813
  {
367d7e78d   Bartlomiej Zolnierkiewicz   ide: ide_dev_is_s...
814
815
816
817
818
819
820
  	/*
  	 * See if word 93 is 0 AND drive is at least ATA-5 compatible
  	 * verifying that word 80 by casting it to a signed type --
  	 * this trick allows us to filter out the reserved values of
  	 * 0x0000 and 0xffff along with the earlier ATA revisions...
  	 */
  	if (id[ATA_ID_HW_CONFIG] == 0 && (short)id[ATA_ID_MAJOR_VER] >= 0x0020)
4dce8ba94   Hannes Reinecke   libata: Use 'bool...
821
822
  		return true;
  	return false;
32d909115   Tejun Heo   libata: test majo...
823
  }
4dce8ba94   Hannes Reinecke   libata: Use 'bool...
824
  static inline bool ata_id_has_tpm(const u16 *id)
ae8d4ee7f   Alan Cox   libata: Disable A...
825
826
827
  {
  	/* The TPM bits are only valid on ATA8 */
  	if (ata_id_major_version(id) < 8)
4dce8ba94   Hannes Reinecke   libata: Use 'bool...
828
  		return false;
ae8d4ee7f   Alan Cox   libata: Disable A...
829
  	if ((id[48] & 0xC000) != 0x4000)
4dce8ba94   Hannes Reinecke   libata: Use 'bool...
830
  		return false;
ae8d4ee7f   Alan Cox   libata: Disable A...
831
832
  	return id[48] & (1 << 0);
  }
4dce8ba94   Hannes Reinecke   libata: Use 'bool...
833
  static inline bool ata_id_has_dword_io(const u16 *id)
ae8d4ee7f   Alan Cox   libata: Disable A...
834
835
836
  {
  	/* ATA 8 reuses this flag for "trusted" computing */
  	if (ata_id_major_version(id) > 7)
4dce8ba94   Hannes Reinecke   libata: Use 'bool...
837
838
  		return false;
  	return id[ATA_ID_DWORD_IO] & (1 << 0);
ae8d4ee7f   Alan Cox   libata: Disable A...
839
  }
4dce8ba94   Hannes Reinecke   libata: Use 'bool...
840
  static inline bool ata_id_has_unload(const u16 *id)
ea6ce53cd   Elias Oltmanns   [libata] Introduc...
841
842
843
844
  {
  	if (ata_id_major_version(id) >= 7 &&
  	    (id[ATA_ID_CFSSE] & 0xC000) == 0x4000 &&
  	    id[ATA_ID_CFSSE] & (1 << 13))
4dce8ba94   Hannes Reinecke   libata: Use 'bool...
845
846
  		return true;
  	return false;
ea6ce53cd   Elias Oltmanns   [libata] Introduc...
847
  }
6b3b9d73e   Hannes Reinecke   libata: Include W...
848
849
850
851
  static inline bool ata_id_has_wwn(const u16 *id)
  {
  	return (id[ATA_ID_CSF_DEFAULT] & 0xC100) == 0x4100;
  }
4bca32864   Martin K. Petersen   libata: Media rot...
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
  static inline int ata_id_form_factor(const u16 *id)
  {
  	u16 val = id[168];
  
  	if (ata_id_major_version(id) < 7 || val == 0 || val == 0xffff)
  		return 0;
  
  	val &= 0xf;
  
  	if (val > 5)
  		return 0;
  
  	return val;
  }
  
  static inline int ata_id_rotation_rate(const u16 *id)
  {
  	u16 val = id[217];
  
  	if (ata_id_major_version(id) < 7 || val == 0 || val == 0xffff)
  		return 0;
  
  	if (val > 1 && val < 0x401)
  		return 0;
  
  	return val;
  }
ed36911c7   Marc Carino   libata: Add suppo...
879
880
881
882
  static inline bool ata_id_has_ncq_send_and_recv(const u16 *id)
  {
  	return id[ATA_ID_SATA_CAPABILITY_2] & BIT(6);
  }
284b3b77e   Hannes Reinecke   libata: NCQ encap...
883
884
885
886
  static inline bool ata_id_has_ncq_non_data(const u16 *id)
  {
  	return id[ATA_ID_SATA_CAPABILITY_2] & BIT(5);
  }
4dce8ba94   Hannes Reinecke   libata: Use 'bool...
887
  static inline bool ata_id_has_trim(const u16 *id)
0c659b82d   Matthew Wilcox   ata: Add TRIM inf...
888
889
890
  {
  	if (ata_id_major_version(id) >= 7 &&
  	    (id[ATA_ID_DATA_SET_MGMT] & 1))
4dce8ba94   Hannes Reinecke   libata: Use 'bool...
891
892
  		return true;
  	return false;
0c659b82d   Matthew Wilcox   ata: Add TRIM inf...
893
  }
4dce8ba94   Hannes Reinecke   libata: Use 'bool...
894
  static inline bool ata_id_has_zero_after_trim(const u16 *id)
e78db4dfb   Martin K. Petersen   libata: Report ze...
895
896
897
898
  {
  	/* DSM supported, deterministic read, and read zero after trim set */
  	if (ata_id_has_trim(id) &&
  	    (id[ATA_ID_ADDITIONAL_SUPP] & 0x4020) == 0x4020)
4dce8ba94   Hannes Reinecke   libata: Use 'bool...
899
  		return true;
e78db4dfb   Martin K. Petersen   libata: Report ze...
900

4dce8ba94   Hannes Reinecke   libata: Use 'bool...
901
  	return false;
e78db4dfb   Martin K. Petersen   libata: Report ze...
902
  }
4dce8ba94   Hannes Reinecke   libata: Use 'bool...
903
  static inline bool ata_id_current_chs_valid(const u16 *id)
8bf62ecee   Albert Lee   [libata] C/H/S su...
904
  {
9bec2e385   Jeff Garzik   [libata] Trim tra...
905
906
  	/* For ATA-1 devices, if the INITIALIZE DEVICE PARAMETERS command
  	   has not been issued to the device then the values of
37014c640   Bartlomiej Zolnierkiewicz   ata: add missing ...
907
908
909
910
911
912
  	   id[ATA_ID_CUR_CYLS] to id[ATA_ID_CUR_SECTORS] are vendor specific. */
  	return (id[ATA_ID_FIELD_VALID] & 1) && /* Current translation valid */
  		id[ATA_ID_CUR_CYLS] &&  /* cylinders in current translation */
  		id[ATA_ID_CUR_HEADS] &&  /* heads in current translation */
  		id[ATA_ID_CUR_HEADS] <= 16 &&
  		id[ATA_ID_CUR_SECTORS];    /* sectors in current translation */
8bf62ecee   Albert Lee   [libata] C/H/S su...
913
  }
4dce8ba94   Hannes Reinecke   libata: Use 'bool...
914
  static inline bool ata_id_is_cfa(const u16 *id)
b352e57dc   Alan Cox   [PATCH] libata: A...
915
  {
4b7d1c050   Ben Gardner   ata: Detect Delki...
916
917
  	if ((id[ATA_ID_CONFIG] == 0x848A) ||	/* Traditional CF */
  	    (id[ATA_ID_CONFIG] == 0x844A))	/* Delkin Devices CF */
4dce8ba94   Hannes Reinecke   libata: Use 'bool...
918
  		return true;
2999b58b7   Sergei Shtylyov   ide/libata: fix a...
919
920
921
922
923
924
925
926
  	/*
  	 * CF specs don't require specific value in the word 0 anymore and yet
  	 * they forbid to report the ATA version in the word 80 and require the
  	 * CFA feature set support to be indicated in the word 83 in this case.
  	 * Unfortunately, some cards only follow either of this requirements,
  	 * and while those that don't indicate CFA feature support need some
  	 * sort of quirk list, it seems impractical for the ones that do...
  	 */
4dce8ba94   Hannes Reinecke   libata: Use 'bool...
927
  	return (id[ATA_ID_COMMAND_SET_2] & 0xC004) == 0x4004;
b352e57dc   Alan Cox   [PATCH] libata: A...
928
  }
4dce8ba94   Hannes Reinecke   libata: Use 'bool...
929
  static inline bool ata_id_is_ssd(const u16 *id)
8bff7c6b0   Jens Axboe   libata: set queue...
930
931
932
  {
  	return id[ATA_ID_ROT_SPEED] == 0x01;
  }
856c46639   Hannes Reinecke   libata: support d...
933
934
935
936
  static inline u8 ata_id_zoned_cap(const u16 *id)
  {
  	return (id[ATA_ID_ADDITIONAL_SUPP] & 0x3);
  }
4dce8ba94   Hannes Reinecke   libata: Use 'bool...
937
  static inline bool ata_id_pio_need_iordy(const u16 *id, const u8 pio)
6dae44f9a   Bartlomiej Zolnierkiewicz   ata: add ata_id_p...
938
939
940
  {
  	/* CF spec. r4.1 Table 22 says no IORDY on PIO5 and PIO6. */
  	if (pio > 4 && ata_id_is_cfa(id))
4dce8ba94   Hannes Reinecke   libata: Use 'bool...
941
  		return false;
6dae44f9a   Bartlomiej Zolnierkiewicz   ata: add ata_id_p...
942
943
  	/* For PIO3 and higher it is mandatory. */
  	if (pio > 2)
4dce8ba94   Hannes Reinecke   libata: Use 'bool...
944
  		return true;
6dae44f9a   Bartlomiej Zolnierkiewicz   ata: add ata_id_p...
945
  	/* Turn it on when possible. */
4dce8ba94   Hannes Reinecke   libata: Use 'bool...
946
  	return ata_id_has_iordy(id);
6dae44f9a   Bartlomiej Zolnierkiewicz   ata: add ata_id_p...
947
  }
4dce8ba94   Hannes Reinecke   libata: Use 'bool...
948
  static inline bool ata_drive_40wire(const u16 *dev_id)
fc085150b   Alan Cox   [PATCH] libata: a...
949
  {
32d909115   Tejun Heo   libata: test majo...
950
  	if (ata_id_is_sata(dev_id))
4dce8ba94   Hannes Reinecke   libata: Use 'bool...
951
  		return false;	/* SATA */
37014c640   Bartlomiej Zolnierkiewicz   ata: add missing ...
952
  	if ((dev_id[ATA_ID_HW_CONFIG] & 0xE000) == 0x6000)
4dce8ba94   Hannes Reinecke   libata: Use 'bool...
953
954
  		return false;	/* 80 wire */
  	return true;
fc085150b   Alan Cox   [PATCH] libata: a...
955
  }
4dce8ba94   Hannes Reinecke   libata: Use 'bool...
956
  static inline bool ata_drive_40wire_relaxed(const u16 *dev_id)
6bbfd53d4   Alan Cox   libata: handle br...
957
  {
37014c640   Bartlomiej Zolnierkiewicz   ata: add missing ...
958
  	if ((dev_id[ATA_ID_HW_CONFIG] & 0x2000) == 0x2000)
4dce8ba94   Hannes Reinecke   libata: Use 'bool...
959
960
  		return false;	/* 80 wire */
  	return true;
6bbfd53d4   Alan Cox   libata: handle br...
961
  }
057ace5e7   Jeff Garzik   libata: const-ifi...
962
  static inline int atapi_cdb_len(const u16 *dev_id)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
963
  {
37014c640   Bartlomiej Zolnierkiewicz   ata: add missing ...
964
  	u16 tmp = dev_id[ATA_ID_CONFIG] & 0x3;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
965
966
967
968
969
970
  	switch (tmp) {
  	case 0:		return 12;
  	case 1:		return 16;
  	default:	return -1;
  	}
  }
d8668fcb0   Shan Hai   libata: Use integ...
971
  static inline int atapi_command_packet_set(const u16 *dev_id)
f8d8e5799   Tony Battersby   libata: increase ...
972
  {
37014c640   Bartlomiej Zolnierkiewicz   ata: add missing ...
973
  	return (dev_id[ATA_ID_CONFIG] >> 8) & 0x1f;
f8d8e5799   Tony Battersby   libata: increase ...
974
  }
4dce8ba94   Hannes Reinecke   libata: Use 'bool...
975
  static inline bool atapi_id_dmadir(const u16 *dev_id)
911630063   Tejun Heo   libata: automatic...
976
977
978
  {
  	return ata_id_major_version(dev_id) >= 7 && (dev_id[62] & 0x8000);
  }
a02227c97   Bartlomiej Zolnierkiewicz   ide: lba_capacity...
979
980
981
982
983
984
985
986
  /*
   * ata_id_is_lba_capacity_ok() performs a sanity check on
   * the claimed LBA capacity value for the device.
   *
   * Returns 1 if LBA capacity looks sensible, 0 otherwise.
   *
   * It is called only once for each device.
   */
4dce8ba94   Hannes Reinecke   libata: Use 'bool...
987
  static inline bool ata_id_is_lba_capacity_ok(u16 *id)
a02227c97   Bartlomiej Zolnierkiewicz   ide: lba_capacity...
988
989
990
991
992
  {
  	unsigned long lba_sects, chs_sects, head, tail;
  
  	/* No non-LBA info .. so valid! */
  	if (id[ATA_ID_CYLS] == 0)
4dce8ba94   Hannes Reinecke   libata: Use 'bool...
993
  		return true;
a02227c97   Bartlomiej Zolnierkiewicz   ide: lba_capacity...
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
  
  	lba_sects = ata_id_u32(id, ATA_ID_LBA_CAPACITY);
  
  	/*
  	 * The ATA spec tells large drives to return
  	 * C/H/S = 16383/16/63 independent of their size.
  	 * Some drives can be jumpered to use 15 heads instead of 16.
  	 * Some drives can be jumpered to use 4092 cyls instead of 16383.
  	 */
  	if ((id[ATA_ID_CYLS] == 16383 ||
  	     (id[ATA_ID_CYLS] == 4092 && id[ATA_ID_CUR_CYLS] == 16383)) &&
  	    id[ATA_ID_SECTORS] == 63 &&
  	    (id[ATA_ID_HEADS] == 15 || id[ATA_ID_HEADS] == 16) &&
  	    (lba_sects >= 16383 * 63 * id[ATA_ID_HEADS]))
4dce8ba94   Hannes Reinecke   libata: Use 'bool...
1008
  		return true;
a02227c97   Bartlomiej Zolnierkiewicz   ide: lba_capacity...
1009
1010
1011
1012
1013
  
  	chs_sects = id[ATA_ID_CYLS] * id[ATA_ID_HEADS] * id[ATA_ID_SECTORS];
  
  	/* perform a rough sanity check on lba_sects: within 10% is OK */
  	if (lba_sects - chs_sects < chs_sects/10)
4dce8ba94   Hannes Reinecke   libata: Use 'bool...
1014
  		return true;
a02227c97   Bartlomiej Zolnierkiewicz   ide: lba_capacity...
1015
1016
1017
1018
1019
1020
1021
1022
  
  	/* some drives have the word order reversed */
  	head = (lba_sects >> 16) & 0xffff;
  	tail = lba_sects & 0xffff;
  	lba_sects = head | (tail << 16);
  
  	if (lba_sects - chs_sects < chs_sects/10) {
  		*(__le32 *)&id[ATA_ID_LBA_CAPACITY] = __cpu_to_le32(lba_sects);
4dce8ba94   Hannes Reinecke   libata: Use 'bool...
1023
  		return true;	/* LBA capacity is (now) good */
a02227c97   Bartlomiej Zolnierkiewicz   ide: lba_capacity...
1024
  	}
4dce8ba94   Hannes Reinecke   libata: Use 'bool...
1025
  	return false;	/* LBA capacity value may be bad */
a02227c97   Bartlomiej Zolnierkiewicz   ide: lba_capacity...
1026
  }
93734a234   Bartlomiej Zolnierkiewicz   ide: ide_id_to_hd...
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
  static inline void ata_id_to_hd_driveid(u16 *id)
  {
  #ifdef __BIG_ENDIAN
  	/* accessed in struct hd_driveid as 8-bit values */
  	id[ATA_ID_MAX_MULTSECT]	 = __cpu_to_le16(id[ATA_ID_MAX_MULTSECT]);
  	id[ATA_ID_CAPABILITY]	 = __cpu_to_le16(id[ATA_ID_CAPABILITY]);
  	id[ATA_ID_OLD_PIO_MODES] = __cpu_to_le16(id[ATA_ID_OLD_PIO_MODES]);
  	id[ATA_ID_OLD_DMA_MODES] = __cpu_to_le16(id[ATA_ID_OLD_DMA_MODES]);
  	id[ATA_ID_MULTSECT]	 = __cpu_to_le16(id[ATA_ID_MULTSECT]);
  
  	/* as 32-bit values */
  	*(u32 *)&id[ATA_ID_LBA_CAPACITY] = ata_id_u32(id, ATA_ID_LBA_CAPACITY);
  	*(u32 *)&id[ATA_ID_SPG]		 = ata_id_u32(id, ATA_ID_SPG);
  
  	/* as 64-bit value */
  	*(u64 *)&id[ATA_ID_LBA_CAPACITY_2] =
  		ata_id_u64(id, ATA_ID_LBA_CAPACITY_2);
  #endif
  }
4dce8ba94   Hannes Reinecke   libata: Use 'bool...
1046
  static inline bool ata_ok(u8 status)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1047
1048
1049
1050
  {
  	return ((status & (ATA_BUSY | ATA_DRDY | ATA_DF | ATA_DRQ | ATA_ERR))
  			== ATA_DRDY);
  }
4dce8ba94   Hannes Reinecke   libata: Use 'bool...
1051
  static inline bool lba_28_ok(u64 block, u32 n_block)
c6a33e246   Albert Lee   [PATCH] libata CH...
1052
  {
45c4d015a   Mark Lord   libata: Fix acces...
1053
  	/* check the ending block number: must be LESS THAN 0x0fffffff */
35303d5c3   Tom Yan   ata: make lba_{28...
1054
  	return ((block + n_block) < ((1 << 28) - 1)) && (n_block <= ATA_MAX_SECTORS);
c6a33e246   Albert Lee   [PATCH] libata CH...
1055
  }
4dce8ba94   Hannes Reinecke   libata: Use 'bool...
1056
  static inline bool lba_48_ok(u64 block, u32 n_block)
c6a33e246   Albert Lee   [PATCH] libata CH...
1057
1058
  {
  	/* check the ending block number */
35303d5c3   Tom Yan   ata: make lba_{28...
1059
  	return ((block + n_block - 1) < ((u64)1 << 48)) && (n_block <= ATA_MAX_SECTORS_LBA48);
c6a33e246   Albert Lee   [PATCH] libata CH...
1060
  }
814600ee1   Tejun Heo   libata-link: add ...
1061
1062
1063
1064
  #define sata_pmp_gscr_vendor(gscr)	((gscr)[SATA_PMP_GSCR_PROD_ID] & 0xffff)
  #define sata_pmp_gscr_devid(gscr)	((gscr)[SATA_PMP_GSCR_PROD_ID] >> 16)
  #define sata_pmp_gscr_rev(gscr)		(((gscr)[SATA_PMP_GSCR_REV] >> 8) & 0xff)
  #define sata_pmp_gscr_ports(gscr)	((gscr)[SATA_PMP_GSCR_PORT_INFO] & 0xf)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1065
  #endif /* __LINUX_ATA_H__ */