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

Last change on this file since 110 was 110, checked in by Markus Thielen, 14 years ago

contains CMs changes for unaligned buffers; removed unused stack var; let driver continue boot on unknown command line switch

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