source: trunk/src/os2ahci/ata.h@ 76

Last change on this file since 76 was 76, checked in by chris, 15 years ago
  • APM support
  • Generic IOCTL interface for adapter passthrough commands (ATA and ATAPI)
  • Fixes to ATAPI sense data handling
  • Cosmetic changes to debug reporting
  • Fixed missing interrupt enable flag for PIO transfer completions
  • Added command line switch /I to ignore specific adapters
File size: 22.2 KB
Line 
1/******************************************************************************
2 * ata.h - ATA structures and macros for os2ahci driver
3 *
4 * Copyright (c) 2010 Christian Mueller. Parts copied from/inspired by the
5 * Linux AHCI driver; those parts are (c) Linux AHCI/ATA maintainers
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 */
21
22/* -------------------------- macros and constants ------------------------- */
23
24/******************************************************************************
25 * Macros to access geometry values in the ATA ID buffer
26 */
27#define ATA_CYLS(id_buf) *((u16 *) (id_buf + ATA_ID_CYLS))
28#define ATA_HEADS(id_buf) *((u16 *) (id_buf + ATA_ID_HEADS))
29#define ATA_SECTORS(id_buf) *((u16 *) (id_buf + ATA_ID_SECTORS))
30#define ATA_CAPACITY(id_buf) *((u32 *) (id_buf + ATA_ID_LBA_CAPACITY))
31
32#define ATA_CAPACITY48_L(id_buf) *((u32 *) (id_buf + ATA_ID_LBA_CAPACITY_2))
33#define ATA_CAPACITY48_H(id_buf) *((u32 *) (id_buf + ATA_ID_LBA_CAPACITY_2 + 2))
34
35#define CUR_CYLS(id_buf) *((u16 *) (id_buf + ATA_ID_CUR_CYLS))
36#define CUR_HEADS(id_buf) *((u16 *) (id_buf + ATA_ID_CUR_HEADS))
37#define CUR_SECTORS(id_buf) *((u16 *) (id_buf + ATA_ID_CUR_SECTORS))
38#define CUR_CAPACITY(id_buf) *((u32 *) (id_buf + ATA_ID_CUR_CAPACITY))
39
40
41/******************************************************************************
42 * ATA IDENTIFY offsets and constants. The ATA IDENTIFY response is a bit of a
43 * mess and after struggling to put this into some structure, I discovered the
44 * Linux folks simply defined offsets and constants to those fields which are
45 * actually needed. Thus, I copied the relevant bits from ata.h, replacing
46 * the enum with precompiler definitions because our enums are signed 16 bits.
47 *
48 * Please note that strings such as the product name are stored using byte-
49 * swapped 16-bit words.
50 */
51#define ATA_ID_WORDS 256
52#define ATA_ID_CONFIG 0
53#define ATA_ID_CYLS 1
54#define ATA_ID_HEADS 3
55#define ATA_ID_SECTORS 6
56#define ATA_ID_SERNO 10
57#define ATA_ID_BUF_SIZE 21
58#define ATA_ID_FW_REV 23
59#define ATA_ID_PROD 27
60#define ATA_ID_MAX_MULTSECT 47
61#define ATA_ID_DWORD_IO 48
62#define ATA_ID_CAPABILITY 49
63#define ATA_ID_OLD_PIO_MODES 51
64#define ATA_ID_OLD_DMA_MODES 52
65#define ATA_ID_FIELD_VALID 53
66#define ATA_ID_CUR_CYLS 54
67#define ATA_ID_CUR_HEADS 55
68#define ATA_ID_CUR_SECTORS 56
69#define ATA_ID_CUR_CAPACITY 57
70#define ATA_ID_MULTSECT 59
71#define ATA_ID_LBA_CAPACITY 60
72#define ATA_ID_SWDMA_MODES 62
73#define ATA_ID_MWDMA_MODES 63
74#define ATA_ID_PIO_MODES 64
75#define ATA_ID_EIDE_DMA_MIN 65
76#define ATA_ID_EIDE_DMA_TIME 66
77#define ATA_ID_EIDE_PIO 67
78#define ATA_ID_EIDE_PIO_IORDY 68
79#define ATA_ID_ADDITIONAL_SUPP 69
80#define ATA_ID_QUEUE_DEPTH 75
81#define ATA_ID_MAJOR_VER 80
82#define ATA_ID_COMMAND_SET_1 82
83#define ATA_ID_COMMAND_SET_2 83
84#define ATA_ID_CFSSE 84
85#define ATA_ID_CFSSE 84
86#define ATA_ID_CFS_ENABLE_1 85
87#define ATA_ID_CFS_ENABLE_2 86
88#define ATA_ID_CSF_DEFAULT 87
89#define ATA_ID_UDMA_MODES 88
90#define ATA_ID_HW_CONFIG 93
91#define ATA_ID_SPG 98
92#define ATA_ID_LBA_CAPACITY_2 100
93#define ATA_ID_SECTOR_SIZE 106
94#define ATA_ID_LAST_LUN 126
95#define ATA_ID_DLF 128
96#define ATA_ID_CSFO 129
97#define ATA_ID_CFA_POWER 160
98#define ATA_ID_CFA_KEY_MGMT 162
99#define ATA_ID_CFA_MODES 163
100#define ATA_ID_DATA_SET_MGMT 169
101#define ATA_ID_ROT_SPEED 217
102#define ATA_ID_PIO4 (1U << 1)
103
104#define ATA_ID_SERNO_LEN 20
105#define ATA_ID_FW_REV_LEN 8
106#define ATA_ID_PROD_LEN 40
107
108#define ATA_PCI_CTL_OFS 2
109
110#define ATA_PIO0 (1U << 0)
111#define ATA_PIO1 ATA_PIO0 | (1U << 1)
112#define ATA_PIO2 ATA_PIO1 | (1U << 2)
113#define ATA_PIO3 ATA_PIO2 | (1U << 3)
114#define ATA_PIO4 ATA_PIO3 | (1U << 4)
115#define ATA_PIO5 ATA_PIO4 | (1U << 5)
116#define ATA_PIO6 ATA_PIO5 | (1U << 6)
117
118#define ATA_PIO4_ONLY (1U << 4)
119
120#define ATA_SWDMA0 (1U << 0)
121#define ATA_SWDMA1 ATA_SWDMA0 | (1U << 1)
122#define ATA_SWDMA2 ATA_SWDMA1 | (1U << 2)
123
124#define ATA_SWDMA2_ONLY (1U << 2)
125
126#define ATA_MWDMA0 (1U << 0)
127#define ATA_MWDMA1 ATA_MWDMA0 | (1U << 1)
128#define ATA_MWDMA2 ATA_MWDMA1 | (1U << 2)
129#define ATA_MWDMA3 ATA_MWDMA2 | (1U << 3)
130#define ATA_MWDMA4 ATA_MWDMA3 | (1U << 4)
131
132#define ATA_MWDMA12_ONLY (1U << 1) | (1U << 2)
133#define ATA_MWDMA2_ONLY (1U << 2)
134
135#define ATA_UDMA0 (1U << 0)
136#define ATA_UDMA1 ATA_UDMA0 | (1U << 1)
137#define ATA_UDMA2 ATA_UDMA1 | (1U << 2)
138#define ATA_UDMA3 ATA_UDMA2 | (1U << 3)
139#define ATA_UDMA4 ATA_UDMA3 | (1U << 4)
140#define ATA_UDMA5 ATA_UDMA4 | (1U << 5)
141#define ATA_UDMA6 ATA_UDMA5 | (1U << 6)
142
143/******************************************************************************
144 * Miscellanous constants copied from the Linux LIBATA code. Again, the enums
145 * have been converted to preprocessor definitions to avoid problems with
146 * signed 16-bit integers.
147 *
148 * Please note that Linux supports all kinds of IDE/EIDE/ATA/SATA/... devices
149 * in LIBATA while we only need the ATA-8 bits, and those only as far as they
150 * are relevant to AHCI.
151 */
152
153/* bits in ATA command block registers */
154#define ATA_HOB (1U << 7) /* LBA48 selector */
155#define ATA_NIEN (1U << 1) /* disable-irq flag */
156#define ATA_LBA (1U << 6) /* LBA28 selector */
157#define ATA_DEV1 (1U << 4) /* Select Device 1 (slave) */
158#define ATA_DEVICE_OBS (1U << 7) | (1U << 5) /* obs bits in dev reg */
159#define ATA_DEVCTL_OBS (1U << 3) /* obsolete bit in devctl reg */
160#define ATA_BUSY (1U << 7) /* BSY status bit */
161#define ATA_DRDY (1U << 6) /* device ready */
162#define ATA_DF (1U << 5) /* device fault */
163#define ATA_DSC (1U << 4) /* drive seek complete */
164#define ATA_DRQ (1U << 3) /* data request i/o */
165#define ATA_CORR (1U << 2) /* corrected data error */
166#define ATA_IDX (1U << 1) /* index */
167#define ATA_ERR (1U << 0) /* have an error */
168#define ATA_SRST (1U << 2) /* software reset */
169#define ATA_ICRC (1U << 7) /* interface CRC error */
170#define ATA_BBK ATA_ICRC /* pre-EIDE: block marked bad */
171#define ATA_UNC (1U << 6) /* uncorrectable media error */
172#define ATA_MC (1U << 5) /* media changed */
173#define ATA_IDNF (1U << 4) /* ID not found */
174#define ATA_MCR (1U << 3) /* media change requested */
175#define ATA_ABORTED (1U << 2) /* command aborted */
176#define ATA_TRK0NF (1U << 1) /* track 0 not found */
177#define ATA_AMNF (1U << 0) /* address mark not found */
178#define ATAPI_LFS 0xF0U /* last failed sense */
179#define ATAPI_EOM ATA_TRK0NF /* end of media */
180#define ATAPI_ILI ATA_AMNF /* illegal length indication */
181#define ATAPI_IO (1U << 1)
182#define ATAPI_COD (1U << 0)
183
184/* ATA device commands */
185#define ATA_CMD_DEV_RESET 0x08 /* ATAPI device reset */
186#define ATA_CMD_CHK_POWER 0xE5 /* check power mode */
187#define ATA_CMD_STANDBY 0xE2 /* place in standby power mode */
188#define ATA_CMD_IDLE 0xE3 /* place in idle power mode */
189#define ATA_CMD_EDD 0x90 /* execute device diagnostic */
190#define ATA_CMD_DOWNLOAD_MICRO 0x92
191#define ATA_CMD_NOP 0x00
192#define ATA_CMD_FLUSH 0xE7
193#define ATA_CMD_FLUSH_EXT 0xEA
194#define ATA_CMD_ID_ATA 0xEC
195#define ATA_CMD_ID_ATAPI 0xA1
196#define ATA_CMD_SERVICE 0xA2
197#define ATA_CMD_READ 0xC8
198#define ATA_CMD_READ_EXT 0x25
199#define ATA_CMD_READ_QUEUED 0x26
200#define ATA_CMD_READ_STREAM_EXT 0x2B
201#define ATA_CMD_READ_STREAM_DMA_EXT 0x2A
202#define ATA_CMD_WRITE 0xCA
203#define ATA_CMD_WRITE_EXT 0x35
204#define ATA_CMD_WRITE_QUEUED 0x36
205#define ATA_CMD_WRITE_STREAM_EXT 0x3B
206#define ATA_CMD_WRITE_STREAM_DMA_EXT 0x3A
207#define ATA_CMD_WRITE_FUA_EXT 0x3D
208#define ATA_CMD_WRITE_QUEUED_FUA_EXT 0x3E
209#define ATA_CMD_FPDMA_READ 0x60
210#define ATA_CMD_FPDMA_WRITE 0x61
211#define ATA_CMD_PIO_READ 0x20
212#define ATA_CMD_PIO_READ_EXT 0x24
213#define ATA_CMD_PIO_WRITE 0x30
214#define ATA_CMD_PIO_WRITE_EXT 0x34
215#define ATA_CMD_READ_MULTI 0xC4
216#define ATA_CMD_READ_MULTI_EXT 0x29
217#define ATA_CMD_WRITE_MULTI 0xC5
218#define ATA_CMD_WRITE_MULTI_EXT 0x39
219#define ATA_CMD_WRITE_MULTI_FUA_EXT 0xCE
220#define ATA_CMD_SET_FEATURES 0xEF
221#define ATA_CMD_SET_MULTI 0xC6
222#define ATA_CMD_PACKET 0xA0
223#define ATA_CMD_VERIFY 0x40
224#define ATA_CMD_VERIFY_EXT 0x42
225#define ATA_CMD_WRITE_UNCORR_EXT 0x45
226#define ATA_CMD_STANDBYNOW1 0xE0
227#define ATA_CMD_IDLEIMMEDIATE 0xE1
228#define ATA_CMD_SLEEP 0xE6
229#define ATA_CMD_INIT_DEV_PARAMS 0x91
230#define ATA_CMD_READ_NATIVE_MAX 0xF8
231#define ATA_CMD_READ_NATIVE_MAX_EXT 0x27
232#define ATA_CMD_SET_MAX 0xF9
233#define ATA_CMD_SET_MAX_EXT 0x37
234#define ATA_CMD_READ_LOG_EXT 0x2F
235#define ATA_CMD_WRITE_LOG_EXT 0x3F
236#define ATA_CMD_READ_LOG_DMA_EXT 0x47
237#define ATA_CMD_WRITE_LOG_DMA_EXT 0x57
238#define ATA_CMD_TRUSTED_RCV 0x5C
239#define ATA_CMD_TRUSTED_RCV_DMA 0x5D
240#define ATA_CMD_TRUSTED_SND 0x5E
241#define ATA_CMD_TRUSTED_SND_DMA 0x5F
242#define ATA_CMD_PMP_READ 0xE4
243#define ATA_CMD_PMP_WRITE 0xE8
244#define ATA_CMD_CONF_OVERLAY 0xB1
245#define ATA_CMD_SEC_SET_PASS 0xF1
246#define ATA_CMD_SEC_UNLOCK 0xF2
247#define ATA_CMD_SEC_ERASE_PREP 0xF3
248#define ATA_CMD_SEC_ERASE_UNIT 0xF4
249#define ATA_CMD_SEC_FREEZE_LOCK 0xF5
250#define ATA_CMD_SEC_DISABLE_PASS 0xF6
251#define ATA_CMD_CONFIG_STREAM 0x51
252#define ATA_CMD_SMART 0xB0
253#define ATA_CMD_MEDIA_LOCK 0xDE
254#define ATA_CMD_MEDIA_UNLOCK 0xDF
255#define ATA_CMD_DSM 0x06
256#define ATA_CMD_CHK_MED_CRD_TYP 0xD1
257#define ATA_CMD_CFA_REQ_EXT_ERR 0x03
258#define ATA_CMD_CFA_WRITE_NE 0x38
259#define ATA_CMD_CFA_TRANS_SECT 0x87
260#define ATA_CMD_CFA_ERASE 0xC0
261#define ATA_CMD_CFA_WRITE_MULT_NE 0xCD
262/* marked obsolete in the ATA/ATAPI-7 spec */
263#define ATA_CMD_RESTORE 0x10
264
265/* READ_LOG_EXT pages */
266#define ATA_LOG_SATA_NCQ 0x10
267
268/* READ/WRITE LONG (obsolete) */
269#define ATA_CMD_READ_LONG 0x22
270#define ATA_CMD_READ_LONG_ONCE 0x23
271#define ATA_CMD_WRITE_LONG 0x32
272#define ATA_CMD_WRITE_LONG_ONCE 0x33
273
274/* SETFEATURES stuff */
275#define SETFEATURES_XFER 0x03
276#define XFER_UDMA_7 0x47
277#define XFER_UDMA_6 0x46
278#define XFER_UDMA_5 0x45
279#define XFER_UDMA_4 0x44
280#define XFER_UDMA_3 0x43
281#define XFER_UDMA_2 0x42
282#define XFER_UDMA_1 0x41
283#define XFER_UDMA_0 0x40
284#define XFER_MW_DMA_4 0x24 /* CFA only */
285#define XFER_MW_DMA_3 0x23 /* CFA only */
286#define XFER_MW_DMA_2 0x22
287#define XFER_MW_DMA_1 0x21
288#define XFER_MW_DMA_0 0x20
289#define XFER_SW_DMA_2 0x12
290#define XFER_SW_DMA_1 0x11
291#define XFER_SW_DMA_0 0x10
292#define XFER_PIO_6 0x0E /* CFA only */
293#define XFER_PIO_5 0x0D /* CFA only */
294#define XFER_PIO_4 0x0C
295#define XFER_PIO_3 0x0B
296#define XFER_PIO_2 0x0A
297#define XFER_PIO_1 0x09
298#define XFER_PIO_0 0x08
299#define XFER_PIO_SLOW 0x00
300
301#define SETFEATURES_WC_ON 0x02 /* Enable write cache */
302#define SETFEATURES_WC_OFF 0x82 /* Disable write cache */
303
304/* Enable/Disable Automatic Acoustic Management */
305#define SETFEATURES_AAM_ON 0x42
306#define SETFEATURES_AAM_OFF 0xC2
307
308#define SETFEATURES_SPINUP 0x07 /* Spin-up drive */
309
310#define SETFEATURES_SATA_ENABLE 0x10 /* Enable use of SATA feature */
311#define SETFEATURES_SATA_DISABLE 0x90 /* Disable use of SATA feature */
312
313/* SETFEATURE Sector counts for SATA features */
314#define SATA_FPDMA_OFFSET 0x01 /* FPDMA non-zero buffer offsets */
315#define SATA_FPDMA_AA 0x02 /* FPDMA Setup FIS Auto-Activate */
316#define SATA_DIPM 0x03 /* Device Initiated Power Management */
317#define SATA_FPDMA_IN_ORDER 0x04 /* FPDMA in-order data delivery */
318#define SATA_AN 0x05 /* Asynchronous Notification */
319#define SATA_SSP 0x06 /* Software Settings Preservation */
320
321/* feature values for SET_MAX */
322#define ATA_SET_MAX_ADDR 0x00
323#define ATA_SET_MAX_PASSWD 0x01
324#define ATA_SET_MAX_LOCK 0x02
325#define ATA_SET_MAX_UNLOCK 0x03
326#define ATA_SET_MAX_FREEZE_LOCK 0x04
327
328/* feature values for DEVICE CONFIGURATION OVERLAY */
329#define ATA_DCO_RESTORE 0xC0
330#define ATA_DCO_FREEZE_LOCK 0xC1
331#define ATA_DCO_IDENTIFY 0xC2
332#define ATA_DCO_SET 0xC3
333
334/* feature values for SMART */
335#define ATA_SMART_ENABLE 0xD8
336#define ATA_SMART_READ_VALUES 0xD0
337#define ATA_SMART_READ_THRESHOLDS 0xD1
338
339/* feature values for Data Set Management */
340#define ATA_DSM_TRIM 0x01
341
342/* password used in LBA Mid / LBA High for executing SMART commands */
343#define ATA_SMART_LBAM_PASS 0x4F
344#define ATA_SMART_LBAH_PASS 0xC2
345
346/* ATAPI stuff */
347#define ATAPI_PKT_DMA (1U << 0)
348#define ATAPI_DMADIR (1U << 2) /* ATAPI data dir:
349 0=to device, 1=to host */
350#define ATAPI_CDB_LEN 16
351
352/* PMP stuff */
353#define SATA_PMP_MAX_PORTS 15
354#define SATA_PMP_CTRL_PORT 15
355
356#define SATA_PMP_GSCR_DWORDS 128
357#define SATA_PMP_GSCR_PROD_ID 0
358#define SATA_PMP_GSCR_REV 1
359#define SATA_PMP_GSCR_PORT_INFO 2
360#define SATA_PMP_GSCR_ERROR 32
361#define SATA_PMP_GSCR_ERROR_EN 33
362#define SATA_PMP_GSCR_FEAT 64
363#define SATA_PMP_GSCR_FEAT_EN 96
364
365#define SATA_PMP_PSCR_STATUS 0
366#define SATA_PMP_PSCR_ERROR 1
367#define SATA_PMP_PSCR_CONTROL 2
368
369#define SATA_PMP_FEAT_BIST (1U << 0)
370#define SATA_PMP_FEAT_PMREQ (1U << 1)
371#define SATA_PMP_FEAT_DYNSSC (1U << 2)
372#define SATA_PMP_FEAT_NOTIFY (1U << 3)
373
374/* SATA Status and Control Registers */
375#define SCR_STATUS 0
376#define SCR_ERROR 1
377#define SCR_CONTROL 2
378#define SCR_ACTIVE 3
379#define SCR_NOTIFICATION 4
380
381/* SError bits */
382#define SERR_DATA_RECOVERED (1UL << 0) /* recovered data error */
383#define SERR_COMM_RECOVERED (1UL << 1) /* recovered comm failure */
384#define SERR_DATA (1UL << 8) /* unrecovered data error */
385#define SERR_PERSISTENT (1UL << 9) /* persistent data/comm error */
386#define SERR_PROTOCOL (1UL << 10) /* protocol violation */
387#define SERR_INTERNAL (1UL << 11) /* host internal error */
388#define SERR_PHYRDY_CHG (1UL << 16) /* PHY RDY changed */
389#define SERR_PHY_INT_ERR (1UL << 17) /* PHY internal error */
390#define SERR_COMM_WAKE (1UL << 18) /* Comm wake */
391#define SERR_10B_8B_ERR (1UL << 19) /* 10b to 8b decode error */
392#define SERR_DISPARITY (1UL << 20) /* Disparity */
393#define SERR_CRC (1UL << 21) /* CRC error */
394#define SERR_HANDSHAKE (1UL << 22) /* Handshake error */
395#define SERR_LINK_SEQ_ERR (1UL << 23) /* Link sequence error */
396#define SERR_TRANS_ST_ERROR (1UL << 24) /* Transport state trans. error */
397#define SERR_UNRECOG_FIS (1UL << 25) /* Unrecognized FIS */
398#define SERR_DEV_XCHG (1UL << 26) /* device exchanged */
399
400/******************************************************************************
401 * Parameters for ATA commands. Those parameters are passed in a variable
402 * argument list in the format:
403 *
404 * AP_xxx, [val, ...], AP_xxx, [val, ...]
405 *
406 * The values expected by each parameter are indicated within square brackets.
407 */
408typedef enum {
409 AP_FEATURES, /* [u16] ATA command features (read: flags) */
410 AP_COUNT, /* [u16] number of sectors (0 = 65536) */
411 AP_SECTOR_28, /* [u32] 28-bit sector address */
412 AP_SECTOR_48, /* [u32, u16] 48-bit sector address */
413 AP_DEVICE, /* [u16] ATA cmd "device" field (LSB masked) */
414 AP_SGLIST, /* [void _far *, u16] buffer S/G (SCATGATENTRY/count) */
415 AP_VADDR, /* [void _far *, u16] buffer virtual address (buf/len) */
416 AP_WRITE, /* [u16] if != 0, data is written to device */
417 AP_AHCI_FLAGS, /* [u16] AHCI command header flags */
418 AP_ATAPI_CMD, /* [void _far *, u16] ATAPI command (CDB) and length */
419 AP_ATA_CMD, /* [void _far *] ATA command (fixed len) */
420 AP_END /* [] end of variable argument list */
421} ATA_PARM;
422
423/* ------------------------ typedefs and structures ------------------------ */
424
425/******************************************************************************
426 * Generic ATA-8 command structure. This is loosely based on ATA-8, i.e. we
427 * don't have to deal with shadow registers and map them to the low bytes of
428 * adjecent words, etc. but there are still some oddities which need to be
429 * taken into consideration. For example, ATA-8 says LBA-28 sector addresses
430 * are simply the lower 28 bits in the LBA field. However, the underlying
431 * transport (SATA in our case) only looks at the three lower bytes of the
432 * LBA field, much like an IDE device would do. This means that only 3 bytes
433 * of the LBA field are processed and this yields only 24 bits. The remaining
434 * 4 bits need to be stored in the "device" register....
435 *
436 * Everything else seems to behave normally, as far as this term can be
437 * applied to IDE/ATA. Further details can be found in section 7.1.5.1 of the
438 * ATA-8 spec (Inputs for 28-bit Read/Write Commands).
439 */
440typedef struct {
441 u16 features; /* feature bits */
442 u16 count; /* count register (e.g. number of sectors) */
443 u32 lba_l; /* low 24 bits of LBA-28 (32 bits for 48-bit devices) */
444 u16 lba_h; /* high 16 bits of LBA for 48-bit devices */
445 u8 cmd; /* ATA command field */
446 u8 device; /* ATA device field and upper 4 bits of LBA-28 */
447} ATA_CMD;
448
449/* generic ATA-8 response structure */
450typedef struct {
451 u16 error; /* error code, if any */
452 u16 count; /* count register (e.g. number of sectors) */
453 u32 lba_l; /* low 28 bits of LBA (32 bits for 48-bit devices) */
454 u16 lba_h; /* high 16 bits of LBA for 48-bit devices */
455 u16 status; /* response status bits */
456} ATA_RSP;
457
458/******************************************************************************
459 * Command-specific ATA-8 structures.
460 */
461
462/* -------------------------- function prototypes -------------------------- */
463
464extern int ata_cmd (AD_INFO *ai, int port, int device,
465 int slot, int cmd, ...);
466extern int v_ata_cmd (AD_INFO *ai, int port, int device,
467 int slot, int cmd, va_list va);
468extern void ata_cmd_to_fis (u8 _far *fis, ATA_CMD _far *cmd,
469 int device);
470extern USHORT ata_get_sg_indx (IORB_EXECUTEIO _far *io);
471extern void ata_max_sg_cnt (IORB_EXECUTEIO _far *io, USHORT sg_indx,
472 USHORT sg_max, USHORT _far *sg_cnt,
473 USHORT _far *sector_cnt);
474
475extern int ata_get_geometry (IORBH _far *iorb, int slot);
476extern void ata_get_geometry_pp (IORBH _far *iorb);
477extern int ata_unit_ready (IORBH _far *iorb, int slot);
478extern int ata_read (IORBH _far *iorb, int slot);
479extern void ata_read_pp (IORBH _far *iorb);
480extern int ata_verify (IORBH _far *iorb, int slot);
481extern int ata_write (IORBH _far *iorb, int slot);
482extern void ata_write_pp (IORBH _far *iorb);
483extern int ata_execute_ata (IORBH _far *iorb, int slot);
484extern int ata_req_sense (IORBH _far *iorb, int slot);
485
486extern char *ata_dev_name (u16 *id_buf);
487
Note: See TracBrowser for help on using the repository browser.