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

Last change on this file since 82 was 82, checked in by chris, 14 years ago

Version 1.09
============

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