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

Last change on this file since 211 was 211, checked in by David Azarewicz, 2 years ago

Added workaround to help with VirtualBox issues.
Improved diagnostic messages.
Changed how timeouts are reset and how ctx hooks are triggered.
Added quirk for devices with issues executing some standard commands.
Changed to make /N the default.

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