source: trunk/src/os2ahci/ata.c@ 121

Last change on this file since 121 was 121, checked in by cjm, 14 years ago

OS2AHCI Version 1.19
====================

  • Added retry counters to all commands (IORBs) in order to prevent infinite retry loops. This was necessary because Virtualbox 4.x doesn't seem to set the "current command index" in specific ATAPI error situations, causing the failing command to be retried indefinitely instead of asking for a sense buffer
  • Minor changes to debug logging
File size: 38.4 KB
Line 
1/******************************************************************************
2 * ata.c - ATA command processing
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#include "os2ahci.h"
28#include "ata.h"
29
30/* -------------------------- macros and constants ------------------------- */
31
32/* ------------------------ typedefs and structures ------------------------ */
33
34/* -------------------------- function prototypes -------------------------- */
35
36static int ata_cmd_read (IORBH _far *iorb, AD_INFO *ai, int p, int d, int slot,
37 ULONG sector, ULONG count, SCATGATENTRY _far *sg_list,
38 ULONG sg_cnt);
39
40static int ata_cmd_write(IORBH _far *iorb, AD_INFO *ai, int p, int d, int slot,
41 ULONG sector, ULONG count, SCATGATENTRY _far *sg_list,
42 ULONG sg_cnt, int write_through);
43
44/* ------------------------ global/static variables ------------------------ */
45
46/* ----------------------------- start of code ----------------------------- */
47
48/******************************************************************************
49 * Initialize AHCI command slot, FIS and S/G list for the specified ATA
50 * command. The command parameters are passed as a variable argument list
51 * of type and value(s). The list is terminated by AP_END.
52 *
53 * Notes:
54 *
55 * - The specified command slot is expected to be idle; no checks are
56 * performed to prevent messing with a busy port.
57 *
58 * - Port multipliers are not supported, yet, thus 'd' should always
59 * be 0 for the time being.
60 *
61 * - 'cmd' is passed as 16-bit integer because the compiler would push
62 * a 'u8' as 16-bit value (it's a fixed argument) and the stdarg
63 * macros would screw up the address of the first variable argument
64 * if the size of the last fixed argument wouldn't match what the
65 * compiler pushed on the stack.
66 *
67 * Return values:
68 * 0 : success
69 * > 0 : could not map all S/G entries; the return value is the number of
70 * S/G entries that could be mapped.
71 * < 0 : other error
72 */
73int ata_cmd(AD_INFO *ai, int p, int d, int slot, int cmd, ...)
74{
75 va_list va;
76 va_start(va, cmd);
77 return(v_ata_cmd(ai, p, d, slot, cmd, va));
78}
79
80int v_ata_cmd(AD_INFO *ai, int p, int d, int slot, int cmd, va_list va)
81{
82 AHCI_PORT_DMA _far *dma_base_virt;
83 AHCI_CMD_HDR _far *cmd_hdr;
84 AHCI_CMD_TBL _far *cmd_tbl;
85 SCATGATENTRY _far *sg_list = NULL;
86 SCATGATENTRY sg_single;
87 ATA_PARM ap;
88 ATA_CMD ata_cmd;
89 void _far *atapi_cmd = NULL;
90 u32 dma_base_phys;
91 u16 atapi_cmd_len = 0;
92 u16 ahci_flags = 0;
93 u16 sg_cnt = 0;
94 int i;
95 int n;
96
97 /* --------------------------------------------------------------------------
98 * Initialize ATA command. The ATA command is set up with the main command
99 * value and a variable list of additional parameters such as the sector
100 * address, transfer count, ...
101 */
102 memset(&ata_cmd, 0x00, sizeof(ata_cmd));
103 ata_cmd.cmd = (u8) cmd;
104
105 /* parse variable arguments */
106 do {
107 switch ((ap = va_arg(va, ATA_PARM))) {
108
109 case AP_AHCI_FLAGS:
110 ahci_flags |= va_arg(va, u16);
111 break;
112
113 case AP_WRITE:
114 if (va_arg(va, u16) != 0) {
115 ahci_flags |= AHCI_CMD_WRITE;
116 }
117 break;
118
119 case AP_FEATURES:
120 /* ATA features word */
121 ata_cmd.features |= va_arg(va, u16);
122 break;
123
124 case AP_COUNT:
125 /* transfer count */
126 ata_cmd.count = va_arg(va, u16);
127 break;
128
129 case AP_SECTOR_28:
130 /* 28-bit sector address */
131 ata_cmd.lba_l = va_arg(va, u32);
132 if (ata_cmd.lba_l & 0xf0000000UL) {
133 dprintf("error: LBA-28 address %ld has more than 28 bits\n", ata_cmd.lba_l);
134 return(ATA_CMD_INVALID_PARM);
135 }
136 /* add upper 4 bits to device field */
137 ata_cmd.device |= (ata_cmd.lba_l >> 24) & 0x0fU;
138 /* only lower 24 bits come into lba_l */
139 ata_cmd.lba_l &= 0x00ffffffUL;
140 break;
141
142 case AP_SECTOR_48:
143 /* 48-bit sector address */
144 ata_cmd.lba_l = va_arg(va, u32);
145 ata_cmd.lba_h = va_arg(va, u16);
146 break;
147
148 case AP_DEVICE:
149 /* ATA device byte; note that this byte contains the highest
150 * 4 bits of LBA-28 address; we have to leave them alone here. */
151 ata_cmd.device |= va_arg(va, u16) & 0xf0U;
152 break;
153
154 case AP_SGLIST:
155 /* scatter/gather list in SCATGATENTRY/count format */
156 sg_list = va_arg(va, void _far *);
157 sg_cnt = va_arg(va, u16);
158 break;
159
160 case AP_VADDR:
161 /* virtual buffer address in addr/len format (up to 4K) */
162 sg_single.ppXferBuf = virt_to_phys(va_arg(va, void _far *));
163 sg_single.XferBufLen = va_arg(va, u16);
164 sg_list = &sg_single;
165 sg_cnt = 1;
166 break;
167
168 case AP_ATAPI_CMD:
169 /* ATAPI command */
170 atapi_cmd = va_arg(va, void _far *);
171 atapi_cmd_len = va_arg(va, u16);
172 ahci_flags |= AHCI_CMD_ATAPI;
173 break;
174
175 case AP_ATA_CMD:
176 /* ATA command "pass-through" */
177 memcpy(&ata_cmd, va_arg(va, void _far *), sizeof(ATA_CMD));
178 break;
179
180 case AP_END:
181 break;
182
183 default:
184 dprintf("error: v_ata_cmd() called with invalid parameter type (%d)\n", (int) ap);
185 return(ATA_CMD_INVALID_PARM);
186 }
187
188 } while (ap != AP_END);
189
190 /* --------------------------------------------------------------------------
191 * Fill in AHCI ATA command information. This includes the port command slot,
192 * the corresponding command FIS and the S/G list. The layout of the AHCI
193 * port DMA region is based on the Linux AHCI driver and looks like this:
194 *
195 * - 32 AHCI command headers (AHCI_CMD_HDR) with 32 bytes, each
196 * - 1 FIS receive area with 256 bytes (AHCI_RX_FIS_SZ)
197 * - 32 AHCI command tables, each consisting of
198 * - 64 bytes for command FIS
199 * - 16 bytes for ATAPI comands
200 * - 48 bytes reserved
201 * - 48 S/G entries (AHCI_SG) with 32 bytes, each
202 *
203 * Since the whole DMA buffer for all ports is larger than 64KB and we need
204 * multiple segments to address all of them, there are no virtual pointers
205 * to the individual elements in AD_INFO. Instead, we're relying on macros
206 * for getting the base address of a particular port's DMA region, then
207 * map a structure on top of that for convenience (AHCI_PORT_DMA).
208 */
209 dma_base_virt = port_dma_base(ai, p);
210 dma_base_phys = port_dma_base_phys(ai, p);
211
212 /* AHCI command header */
213 cmd_hdr = dma_base_virt->cmd_hdr + slot;
214 memset(cmd_hdr, 0x00, sizeof(*cmd_hdr));
215 cmd_hdr->options = ((d & 0x0f) << 12);
216 cmd_hdr->options |= ahci_flags; /* AHCI command flags */
217 cmd_hdr->options |= 5; /* length of command FIS in 32-bit words */
218 cmd_hdr->tbl_addr = dma_base_phys + offsetof(AHCI_PORT_DMA, cmd_tbl[slot]);
219
220 /* AHCI command table */
221 cmd_tbl = dma_base_virt->cmd_tbl + slot;
222 memset(cmd_tbl, 0x00, sizeof(*cmd_tbl));
223 ata_cmd_to_fis(cmd_tbl->cmd_fis, &ata_cmd, d);
224
225 if (atapi_cmd != NULL) {
226 /* copy ATAPI command */
227 memcpy(cmd_tbl->atapi_cmd, atapi_cmd, atapi_cmd_len);
228 }
229
230 /* PRDT (S/G list)
231 *
232 * - The S/G list for AHCI adapters is limited to 22 bits for the transfer
233 * size of each element, thus we need to split S/G elements larger than
234 * 22 bits into 2 AHCI_SG elements.
235 *
236 * - The S/G element size for AHCI is what the spec calls "'0' based"
237 * (i.e. 0 means 1 bytes). On top of that, the spec requires S/G transfer
238 * sizes to be even in the context of 16-bit transfers, thus bit '1'
239 * always needs to be set.
240 *
241 * - AHCI_MAX_SG_ELEMENT_LEN defines the maximum size of an AHCI S/G
242 * element in bytes, ignoring the '0'-based methodology (i.e. 1 << 22).
243 *
244 * - There's a limit on the maximum number of S/G elements in the port DMA
245 * buffer (AHCI_MAX_SG) which is lower than the HW maximum. It's beyond
246 * the control of this function to split commands which require more
247 * than AHCI_MAX_SG entries. In order to help the caller, the return value
248 * of this function will indicate how many OS/2 S/G entries were
249 * successfully mapped.
250 *
251 */
252 for (i = n = 0; i < sg_cnt; i++) {
253 u32 sg_addr = sg_list[i].ppXferBuf;
254 u32 sg_size = sg_list[i].XferBufLen;
255
256 do {
257 u32 chunk = (sg_size > AHCI_MAX_SG_ELEMENT_LEN) ? AHCI_MAX_SG_ELEMENT_LEN
258 : sg_size;
259 if (n >= AHCI_MAX_SG) {
260 /* couldn't store all S/G elements in our DMA buffer */
261 ddprintf("ata_cmd(): too many S/G elements\n");
262 return(i - 1);
263 }
264 if ((sg_addr & 1) || (chunk & 1)) {
265 ddprintf("error: ata_cmd() called with unaligned S/G element(s)\n");
266 return(ATA_CMD_UNALIGNED_ADDR);
267 }
268 cmd_tbl->sg_list[n].addr = sg_addr;
269 cmd_tbl->sg_list[n].size = chunk - 1;
270 sg_addr += chunk;
271 sg_size -= chunk;
272 n++;
273 } while (sg_size > 0);
274 }
275
276 /* set final S/G count in AHCI command header */
277 cmd_hdr->options |= (u32) n << 16;
278
279 if (debug >= 2) {
280 printf("ATA command for %d.%d.%d, slot %d:\n", ad_no(ai), p, d, slot);
281 phex(cmd_hdr, offsetof(AHCI_CMD_HDR, reserved), "cmd_hdr: ");
282 phex(&ata_cmd, sizeof(ata_cmd), "ata_cmd: ");
283 if (atapi_cmd != NULL) {
284 phex(atapi_cmd, atapi_cmd_len, "atapi_cmd: ");
285 }
286 if (n > 0) {
287 phex(cmd_tbl->sg_list, sizeof(*cmd_tbl->sg_list) * n, "sg_list: ");
288 }
289 }
290
291 return(ATA_CMD_SUCCESS);
292}
293
294/******************************************************************************
295 * Fill SATA command FIS with values extracted from an ATA command structure.
296 * The command FIS buffer (fis) is expected to be initialized to 0s. The
297 * structure of the FIS maps to the ATA shadow register block, including
298 * registers which can be written twice to store 16 bits (called 'exp').
299 *
300 * The FIS structure looks like this (using LSB notation):
301 *
302 * +----------------+----------------+----------------+----------------+
303 * 00 | FIS type (27h) | C|R|R|R|PMP | Command | Features |
304 * +----------------+----------------+----------------+----------------+
305 * 04 | LBA 7:0 | LBA 15:8 | LBA 23:16 | R|R|R|D|Head |
306 * +----------------+----------------+----------------+----------------+
307 * 08 | LBA 31:24 | LBA 40:32 | LBA 47:40 | Features exp |
308 * +----------------+----------------+----------------+----------------+
309 * 12 | Count 7:0 | Count 15:8 | Reserved | Control |
310 * +----------------+----------------+----------------+----------------+
311 * 16 | Reserved | Reserved | Reserved | Reserved |
312 * +----------------+----------------+----------------+----------------+
313 */
314void ata_cmd_to_fis(u8 _far *fis, ATA_CMD _far *ata_cmd, int d)
315{
316 fis[0] = 0x27; /* register - host to device FIS */
317 fis[1] = (u8) (d & 0xf); /* port multiplier number */
318 fis[1] |= 0x80; /* bit 7 indicates Command FIS */
319 fis[2] = (u8) ata_cmd->cmd;
320 fis[3] = (u8) ata_cmd->features;
321
322 fis[4] = (u8) ata_cmd->lba_l;
323 fis[5] = (u8) (ata_cmd->lba_l >> 8);
324 fis[6] = (u8) (ata_cmd->lba_l >> 16);
325 fis[7] = (u8) ata_cmd->device;
326
327 fis[8] = (u8) (ata_cmd->lba_l >> 24);
328 fis[9] = (u8) ata_cmd->lba_h;
329 fis[10] = (u8) (ata_cmd->lba_h >> 8);
330 fis[11] = (u8) (ata_cmd->features >> 8);
331
332 fis[12] = (u8) ata_cmd->count;
333 fis[13] = (u8) (ata_cmd->count >> 8);
334}
335
336/******************************************************************************
337 * Get index in S/G list for the number of transferred sectors in the IORB.
338 *
339 * Returning io->cSGList indicates an error.
340 *
341 * NOTE: OS/2 makes sure S/G lists are set up such that entries at the HW
342 * limit will never cross sector boundaries. This means that splitting
343 * S/G lists into multiple commands can be done without editing the S/G
344 * lists.
345 */
346u16 ata_get_sg_indx(IORB_EXECUTEIO _far *io)
347{
348 ULONG offset = io->BlocksXferred * io->BlockSize;
349 USHORT i;
350
351 for (i = 0; i < io->cSGList && offset > 0; i++) {
352 offset -= io->pSGList[i].XferBufLen;
353 }
354
355 return(i);
356}
357
358/******************************************************************************
359 * Get max S/G count which will fit into our HW S/G buffers. This function is
360 * called when the S/G list is too long and we need to split the IORB into
361 * multiple commands. It returns both the number of sectors and S/G list
362 * elements that we can handle in a single command.
363 *
364 * The parameter 'sg_indx' indicates the current start index in the S/G list
365 * (0 if this is the first command iteration).
366 *
367 * The parameter 'sg_max' is the return value of v_ata_cmd() and indicates
368 * how many S/G elements were successfully mapped. Whatever we return needs to
369 * be less or equal to this value.
370 *
371 * Returning 0 in *sg_cnt indicates an error.
372 *
373 * NOTE: OS/2 makes sure S/G lists are set up such that entries at HW limits
374 * will never cross sector boundaries. This means that splitting S/G
375 * lists into multiple commands can be done without editing S/G list
376 * elements. Since AHCI only allows 22 bits for each S/G element, the
377 * hardware limits are reported as AHCI_MAX_SG / 2 but will vary based
378 * on the actual length of S/G elements. This function looks for the
379 * maximum number of S/G elements that can be mapped on sector
380 * boundaries which will still fit into our HW S/G list.
381 */
382void ata_max_sg_cnt(IORB_EXECUTEIO _far *io, USHORT sg_indx, USHORT sg_max,
383 USHORT _far *sg_cnt, USHORT _far *sector_cnt)
384{
385 ULONG max_sector_cnt = 0;
386 USHORT max_sg_cnt = 0;
387 ULONG offset = 0;
388 USHORT i;
389
390 for (i = sg_indx; i < io->cSGList; i++) {
391 if (i - sg_indx >= sg_max) {
392 /* we're beyond the number of S/G elements we can map */
393 break;
394 }
395
396 offset += io->pSGList[i].XferBufLen;
397 if (offset % io->BlockSize == 0) {
398 /* this S/G element ends on a sector boundary */
399 max_sector_cnt = offset / io->BlockSize;
400 max_sg_cnt = i + 1;
401 }
402 }
403
404 /* return the best match we found (0 indicating failure) */
405 *sector_cnt = max_sector_cnt;
406 *sg_cnt = max_sg_cnt;
407}
408
409
410/******************************************************************************
411 * Get device or media geometry. Device and media geometry are expected to be
412 * the same for non-removable devices, which will always be the case for the
413 * ATA devices we're dealing with (hard disks). ATAPI is a different story
414 * and handled by atapi_get_geometry().
415 */
416int ata_get_geometry(IORBH _far *iorb, int slot)
417{
418 ADD_WORKSPACE _far *aws = add_workspace(iorb);
419 int rc;
420
421 /* allocate buffer for ATA identify information */
422 if ((aws->buf = malloc(ATA_ID_WORDS * sizeof(u16))) == NULL) {
423 iorb_seterr(iorb, IOERR_CMD_SW_RESOURCE);
424 return(-1);
425 }
426
427 /* request ATA identify information */
428 aws->ppfunc = ata_get_geometry_pp;
429 rc = ata_cmd(ad_infos + iorb_unit_adapter(iorb),
430 iorb_unit_port(iorb),
431 iorb_unit_device(iorb),
432 slot,
433 ATA_CMD_ID_ATA,
434 AP_VADDR, (void _far *) aws->buf, ATA_ID_WORDS * sizeof(u16),
435 AP_END);
436
437 if (rc != 0) {
438 iorb_seterr(iorb, IOERR_CMD_ADD_SOFTWARE_FAILURE);
439 }
440
441 return(rc);
442}
443
444/******************************************************************************
445 * Post processing function for ata_get_geometry(): convert the ATA identify
446 * information to OS/2 IOCC_GEOMETRY information.
447 */
448void ata_get_geometry_pp(IORBH _far *iorb)
449{
450 GEOMETRY _far *geometry = ((IORB_GEOMETRY _far *) iorb)->pGeometry;
451 USHORT geometry_len = ((IORB_GEOMETRY _far *) iorb)->GeometryLen;
452 u16 *id_buf = add_workspace(iorb)->buf;
453 int a = iorb_unit_adapter(iorb);
454 int p = iorb_unit_port(iorb);
455
456 /* Fill-in geometry information; the ATA-8 spec declares the geometry
457 * fields in the ATA ID buffer as obsolete but it's still the best
458 * guess in most cases. If the information stored in the geometry
459 * fields is apparently incorrect, we'll use the algorithm typically
460 * used by SCSI adapters and modern PC BIOS versions:
461 *
462 * - 512 bytes per sector
463 * - 255 heads
464 * - 63 sectors per track (or 56 with the parameter "/4")
465 * - x cylinders (calculated)
466 *
467 * Please note that os2ahci currently does not natively support ATA sectors
468 * larger than 512 bytes, therefore relies on the translation logic built
469 * into the corresponding ATA disks. In order to prevent file systems that
470 * use block sizes larger than 512 bytes (FAT, JFS, ...) from ending up on
471 * incorrectly aligned physical sector accesses, hence using more physical
472 * I/Os than necessary, the command line parameter "/4" can be used to force
473 * a track size of 56 sectors. This way, partitions will start on 4K
474 * boundaries.
475 *
476 * Another limitation is that OS/2 has a 32-bit variable for the total number
477 * of sectors, limiting the maximum capacity to roughly 2TB. This is another
478 * issue that needs to be addressed sooner or later; large sectors could
479 * raise this limit to something like 8TB but this is not really much of a
480 * difference. Maybe there's something in later DDKs that allows more than
481 * 32 bits?
482 */
483 memset(geometry, 0x00, geometry_len);
484 geometry->BytesPerSector = ATA_SECTOR_SIZE;
485
486 /* extract total number of sectors */
487 if (id_buf[ATA_ID_CFS_ENABLE_2] & 0x400) {
488 /* 48-bit LBA supported */
489 if (ATA_CAPACITY48_H(id_buf) != 0) {
490 /* more than 32 bits for number of sectors */
491 dprintf("warning: limiting disk %d.%d.%d to 2TB\n",
492 iorb_unit_adapter(iorb), iorb_unit_port(iorb),
493 iorb_unit_device(iorb));
494 geometry->TotalSectors = 0xffffffffUL;
495 } else {
496 geometry->TotalSectors = ATA_CAPACITY48_L(id_buf);
497 }
498 } else {
499 /* 28-bit LBA */
500 geometry->TotalSectors = ATA_CAPACITY(id_buf) & 0x0fffffffUL;
501 }
502
503 /* fabricate the remaining geometry fields */
504 if (track_size[a][p] != 0) {
505 /* A specific track size has been requested for this port; this is
506 * typically done for disks with 4K sectors to make sure partitions
507 * start on 8-sector boundaries (parameter "/4").
508 */
509 geometry->NumHeads = 255;
510 geometry->SectorsPerTrack = track_size[a][p];
511 geometry->TotalCylinders = geometry->TotalSectors /
512 ((u32) geometry->NumHeads *
513 (u32) geometry->SectorsPerTrack);
514
515 } else if (CUR_HEADS(id_buf) > 0 && CUR_CYLS(id_buf) > 0 &&
516 CUR_SECTORS(id_buf) > 0 &&
517 CUR_CAPACITY(id_buf) == (u32) CUR_HEADS(id_buf) *
518 (u32) CUR_CYLS(id_buf) *
519 (u32) CUR_SECTORS(id_buf)) {
520 /* BIOS-supplied (aka "current") geometry values look valid */
521 geometry->NumHeads = CUR_HEADS(id_buf);
522 geometry->SectorsPerTrack = CUR_SECTORS(id_buf);
523 geometry->TotalCylinders = CUR_CYLS(id_buf);
524
525 } else if (ATA_HEADS(id_buf) > 0 && ATA_CYLS(id_buf) > 0 &&
526 ATA_SECTORS(id_buf) > 0) {
527 /* ATA-supplied values for geometry look valid */
528 geometry->NumHeads = ATA_HEADS(id_buf);
529 geometry->SectorsPerTrack = ATA_SECTORS(id_buf);
530 geometry->TotalCylinders = ATA_CYLS(id_buf);
531
532 } else {
533 /* use typical SCSI geometry */
534 geometry->NumHeads = 255;
535 geometry->SectorsPerTrack = 63;
536 geometry->TotalCylinders = geometry->TotalSectors /
537 ((u32) geometry->NumHeads *
538 (u32) geometry->SectorsPerTrack);
539 }
540
541 if (debug) {
542 printf("geometry information:\n");
543 printf(" heads: %d\n", (u16) geometry->NumHeads);
544 printf(" sectors: %d\n", (u16) geometry->SectorsPerTrack);
545 printf(" cylinders: %d\n", (u16) geometry->TotalCylinders);
546 printf(" capacity: %ldMB\n", (u32) (geometry->TotalSectors / 2048));
547 }
548
549 /* tell interrupt handler that this IORB is complete */
550 add_workspace(iorb)->complete = 1;
551}
552
553/******************************************************************************
554 * Test whether unit is ready.
555 */
556int ata_unit_ready(IORBH _far *iorb, int slot)
557{
558 /* This is a NOP for ATA devices (at least right now); returning an error
559 * without setting an error code means ahci_exec_iorb() will not queue any
560 * HW command and the IORB will complete successfully.
561 */
562 ((IORB_UNIT_STATUS _far *) iorb)->UnitStatus = US_READY | US_POWER;
563 return(-1);
564}
565
566/******************************************************************************
567 * Read sectors from AHCI device.
568 */
569int ata_read(IORBH _far *iorb, int slot)
570{
571 IORB_EXECUTEIO _far *io = (IORB_EXECUTEIO _far *) iorb;
572 AD_INFO *ai = ad_infos + iorb_unit_adapter(iorb);
573 ULONG sector = io->RBA + io->BlocksXferred;
574 USHORT count = io->BlockCount - io->BlocksXferred;
575 USHORT sg_indx;
576 USHORT sg_cnt;
577 int p = iorb_unit_port(iorb);
578 int d = iorb_unit_device(iorb);
579 int rc;
580
581 if (io->BlockCount == 0) {
582 /* NOP; return -1 without error in IORB to indicate success */
583 return(-1);
584 }
585
586 if (add_workspace(iorb)->unaligned) {
587 /* unaligned S/G addresses present; need to use double buffers */
588 return(ata_read_unaligned(iorb, slot));
589 }
590
591 /* Kludge: some I/O commands during boot use excessive S/G buffer lengths
592 * which cause NCQ commands to lock up. If there's only one S/G element
593 * and this element is already larger than what we can derive from the sector
594 * count, we'll adjust that element.
595 */
596 if (io->BlocksXferred == 0 && io->cSGList == 1 &&
597 io->pSGList[0].XferBufLen > (ULONG) io->BlockCount * io->BlockSize) {
598 io->pSGList[0].XferBufLen = (ULONG) io->BlockCount * io->BlockSize;
599 }
600
601 /* prepare read command while keeping an eye on S/G count limitations */
602 do {
603 sg_indx = ata_get_sg_indx(io);
604 sg_cnt = io->cSGList - sg_indx;
605 if ((rc = ata_cmd_read(iorb, ai, p, d, slot, sector, count,
606 io->pSGList + sg_indx, sg_cnt)) > 0) {
607 /* couldn't map all S/G elements */
608 ata_max_sg_cnt(io, sg_indx, (USHORT) rc, &sg_cnt, &count);
609 }
610 } while (rc > 0 && sg_cnt > 0);
611
612 if (rc == 0) {
613 add_workspace(iorb)->blocks = count;
614 add_workspace(iorb)->ppfunc = ata_read_pp;
615
616 } else if (rc > 0) {
617 iorb_seterr(iorb, IOERR_CMD_SGLIST_BAD);
618
619 } else if (rc == ATA_CMD_UNALIGNED_ADDR) {
620 /* unaligned S/G addresses detected; need to use double buffers */
621 add_workspace(iorb)->unaligned = 1;
622 return(ata_read_unaligned(iorb, slot));
623
624 } else {
625 iorb_seterr(iorb, IOERR_CMD_ADD_SOFTWARE_FAILURE);
626 }
627
628 return(rc);
629}
630
631/******************************************************************************
632 * Read sectors from AHCI device with unaligned S/G element addresses. AHCI
633 * only allows aligned S/G addresses while OS/2 doesn't have these kind of
634 * restrictions. This doesn't happen very often but when it does, we need to
635 * use a transfer buffer and copy the data manually.
636 */
637int ata_read_unaligned(IORBH _far *iorb, int slot)
638{
639 IORB_EXECUTEIO _far *io = (IORB_EXECUTEIO _far *) iorb;
640 ADD_WORKSPACE _far *aws = add_workspace(iorb);
641 AD_INFO *ai = ad_infos + iorb_unit_adapter(iorb);
642 ULONG sector = io->RBA + io->BlocksXferred;
643 SCATGATENTRY sg_single;
644 int p = iorb_unit_port(iorb);
645 int d = iorb_unit_device(iorb);
646 int rc;
647
648 ddprintf("ata_read_unaligned(%d.%d.%d, %ld)\n", ad_no(ai), p, d, sector);
649
650 /* allocate transfer buffer */
651 if ((aws->buf = malloc(io->BlockSize)) == NULL) {
652 iorb_seterr(iorb, IOERR_CMD_SW_RESOURCE);
653 return(-1);
654 }
655
656 /* prepare read command using transfer buffer */
657 sg_single.ppXferBuf = virt_to_phys(aws->buf);
658 sg_single.XferBufLen = io->BlockSize;
659 rc = ata_cmd_read(iorb, ai, p, d, slot, sector, 1, &sg_single, 1);
660
661 if (rc == 0) {
662 add_workspace(iorb)->blocks = 1;
663 add_workspace(iorb)->ppfunc = ata_read_pp;
664
665 } else if (rc > 0) {
666 iorb_seterr(iorb, IOERR_CMD_SGLIST_BAD);
667
668 } else {
669 iorb_seterr(iorb, IOERR_CMD_ADD_SOFTWARE_FAILURE);
670 }
671
672 return(rc);
673}
674
675/******************************************************************************
676 * Post processing function for ata_read(); this function updates the
677 * BlocksXferred counter in the IORB and, if not all blocks have been
678 * transferred, requeues the IORB to process the remaining sectors. It also
679 * takes care of copying data from the transfer buffer for unaligned reads.
680 */
681void ata_read_pp(IORBH _far *iorb)
682{
683 IORB_EXECUTEIO _far *io = (IORB_EXECUTEIO _far *) iorb;
684 ADD_WORKSPACE _far *aws = add_workspace(iorb);
685
686 if (aws->unaligned) {
687 /* copy transfer buffer to corresponding physical address in S/G list */
688 sg_memcpy(io->pSGList, io->cSGList,
689 (ULONG) io->BlocksXferred * (ULONG) io->BlockSize,
690 aws->buf, io->BlockSize, BUF_TO_SG);
691 }
692
693 io->BlocksXferred += add_workspace(iorb)->blocks;
694 dprintf("ata_read_pp(): blocks transferred = %d\n", (int) io->BlocksXferred);
695
696 if (io->BlocksXferred >= io->BlockCount) {
697 /* we're done; tell IRQ handler the IORB is complete */
698 add_workspace(iorb)->complete = 1;
699 } else {
700 /* requeue this IORB for next iteration */
701 iorb_requeue(iorb);
702 }
703}
704
705/******************************************************************************
706 * Verify readability of sectors on ATA device.
707 */
708int ata_verify(IORBH _far *iorb, int slot)
709{
710 IORB_EXECUTEIO _far *io = (IORB_EXECUTEIO _far *) iorb;
711 AD_INFO *ai = ad_infos + iorb_unit_adapter(iorb);
712 int p = iorb_unit_port(iorb);
713 int d = iorb_unit_device(iorb);
714 int rc;
715
716 if (io->BlockCount == 0) {
717 /* NOP; return -1 without error in IORB to indicate success */
718 return(-1);
719 }
720
721 /* prepare verify command */
722 if (io->RBA >= (1UL << 28) || io->BlockCount > 256) {
723 /* need LBA48 for this command */
724 if (!ai->ports[p].devs[d].lba48) {
725 iorb_seterr(iorb, IOERR_RBA_LIMIT);
726 return(-1);
727 }
728 rc = ata_cmd(ai, p, d, slot, ATA_CMD_VERIFY_EXT,
729 AP_SECTOR_48, (u32) io->RBA, (u16) 0,
730 AP_COUNT, (u16) io->BlockCount,
731 AP_DEVICE, 0x40,
732 AP_END);
733 } else {
734 rc = ata_cmd(ai, p, d, slot, ATA_CMD_VERIFY,
735 AP_SECTOR_28, (u32) io->RBA,
736 AP_COUNT, (u16) io->BlockCount & 0xffU,
737 AP_END);
738 }
739
740 return(rc);
741}
742
743/******************************************************************************
744 * Write sectors to AHCI device.
745 */
746int ata_write(IORBH _far *iorb, int slot)
747{
748 IORB_EXECUTEIO _far *io = (IORB_EXECUTEIO _far *) iorb;
749 AD_INFO *ai = ad_infos + iorb_unit_adapter(iorb);
750 ULONG sector = io->RBA + io->BlocksXferred;
751 USHORT count = io->BlockCount - io->BlocksXferred;
752 USHORT sg_indx;
753 USHORT sg_cnt;
754 int p = iorb_unit_port(iorb);
755 int d = iorb_unit_device(iorb);
756 int rc;
757
758 if (io->BlockCount == 0) {
759 /* NOP; return -1 without error in IORB to indicate success */
760 return(-1);
761 }
762
763 if (add_workspace(iorb)->unaligned) {
764 /* unaligned S/G addresses present; need to use double buffers */
765 return(ata_write_unaligned(iorb, slot));
766 }
767
768 /* prepare write command while keeping an eye on S/G count limitations */
769 do {
770 sg_indx = ata_get_sg_indx(io);
771 sg_cnt = io->cSGList - sg_indx;
772 if ((rc = ata_cmd_write(iorb, ai, p, d, slot, sector, count,
773 io->pSGList + sg_indx, sg_cnt,
774 io->Flags & XIO_DISABLE_HW_WRITE_CACHE)) > 0) {
775 /* couldn't map all S/G elements */
776 ata_max_sg_cnt(io, sg_indx, (USHORT) rc, &sg_cnt, &count);
777 }
778 } while (rc > 0 && sg_cnt > 0);
779
780 if (rc == 0) {
781 add_workspace(iorb)->blocks = count;
782 add_workspace(iorb)->ppfunc = ata_write_pp;
783
784 } else if (rc > 0) {
785 iorb_seterr(iorb, IOERR_CMD_SGLIST_BAD);
786
787 } else if (rc == ATA_CMD_UNALIGNED_ADDR) {
788 /* unaligned S/G addresses detected; need to use double buffers */
789 add_workspace(iorb)->unaligned = 1;
790 return(ata_write_unaligned(iorb, slot));
791
792 } else {
793 iorb_seterr(iorb, IOERR_CMD_ADD_SOFTWARE_FAILURE);
794 }
795
796 return(rc);
797}
798
799/******************************************************************************
800 * Write sectors from AHCI device with unaligned S/G element addresses. AHCI
801 * only allows aligned S/G addresses while OS/2 doesn't have these kind of
802 * restrictions. This doesn't happen very often but when it does, we need to
803 * use a transfer buffer and copy the data manually.
804 */
805int ata_write_unaligned(IORBH _far *iorb, int slot)
806{
807 IORB_EXECUTEIO _far *io = (IORB_EXECUTEIO _far *) iorb;
808 ADD_WORKSPACE _far *aws = add_workspace(iorb);
809 AD_INFO *ai = ad_infos + iorb_unit_adapter(iorb);
810 ULONG sector = io->RBA + io->BlocksXferred;
811 SCATGATENTRY sg_single;
812 int p = iorb_unit_port(iorb);
813 int d = iorb_unit_device(iorb);
814 int rc;
815
816 ddprintf("ata_write_unaligned(%d.%d.%d, %ld)\n", ad_no(ai), p, d, sector);
817
818 /* allocate transfer buffer */
819 if ((aws->buf = malloc(io->BlockSize)) == NULL) {
820 iorb_seterr(iorb, IOERR_CMD_SW_RESOURCE);
821 return(-1);
822 }
823
824 /* copy next sector from S/G list to transfer buffer */
825 sg_memcpy(io->pSGList, io->cSGList,
826 (ULONG) io->BlocksXferred * (ULONG) io->BlockSize,
827 aws->buf, io->BlockSize, SG_TO_BUF);
828
829 /* prepare write command using transfer buffer */
830 sg_single.ppXferBuf = virt_to_phys(aws->buf);
831 sg_single.XferBufLen = io->BlockSize;
832 rc = ata_cmd_write(iorb, ai, p, d, slot, sector, 1, &sg_single, 1,
833 io->Flags & XIO_DISABLE_HW_WRITE_CACHE);
834
835 if (rc == 0) {
836 add_workspace(iorb)->blocks = 1;
837 add_workspace(iorb)->ppfunc = ata_write_pp;
838
839 } else if (rc > 0) {
840 iorb_seterr(iorb, IOERR_CMD_SGLIST_BAD);
841
842 } else {
843 iorb_seterr(iorb, IOERR_CMD_ADD_SOFTWARE_FAILURE);
844 }
845
846 return(rc);
847}
848
849
850/******************************************************************************
851 * Post processing function for ata_write(); this function updates the
852 * BlocksXferred counter in the IORB and, if not all blocks have been
853 * transferred, requeues the IORB to process the remaining sectors.
854 */
855void ata_write_pp(IORBH _far *iorb)
856{
857 IORB_EXECUTEIO _far *io = (IORB_EXECUTEIO _far *) iorb;
858
859 io->BlocksXferred += add_workspace(iorb)->blocks;
860 dprintf("ata_write_pp(): blocks transferred = %d\n", (int) io->BlocksXferred);
861
862 if (io->BlocksXferred >= io->BlockCount) {
863 /* we're done; tell IRQ handler the IORB is complete */
864 add_workspace(iorb)->complete = 1;
865 } else {
866 /* requeue this IORB for next iteration */
867 iorb_requeue(iorb);
868 }
869}
870
871/******************************************************************************
872 * Execute ATA command.
873 */
874int ata_execute_ata(IORBH _far *iorb, int slot)
875{
876 IORB_ADAPTER_PASSTHRU _far *apt = (IORB_ADAPTER_PASSTHRU _far *) iorb;
877 AD_INFO *ai = ad_infos + iorb_unit_adapter(iorb);
878 int p = iorb_unit_port(iorb);
879 int d = iorb_unit_device(iorb);
880 int rc;
881
882 if (apt->ControllerCmdLen != sizeof(ATA_CMD)) {
883 iorb_seterr(iorb, IOERR_CMD_SYNTAX);
884 return(-1);
885 }
886
887 rc = ata_cmd(ai, p, d, slot, 0,
888 AP_SGLIST, apt->pSGList, apt->cSGList,
889 AP_ATA_CMD, apt->pControllerCmd,
890 AP_WRITE, !(apt->Flags & PT_DIRECTION_IN),
891 AP_END);
892
893 return(rc);
894}
895
896/******************************************************************************
897 * Request sense information for a failed command. Since there is no "request
898 * sense" command for ATA devices, we need to read the current error code from
899 * the AHCI task file register and fabricate the sense information.
900 *
901 * NOTES:
902 *
903 * - This function must be called right after an ATA command has failed and
904 * before any other commands are queued on the corresponding port. This
905 * function is typically called in the port restart context hook which is
906 * triggered by an AHCI error interrupt.
907 *
908 * - The ATA error bits are a complete mess. We'll try and catch the most
909 * interesting error codes (such as medium errors) and report everything
910 * else with a generic error code.
911 */
912int ata_req_sense(IORBH _far *iorb, int slot)
913{
914 AD_INFO *ai = ad_infos + iorb_unit_adapter(iorb);
915 u8 _far *port_mmio = port_base(ai, iorb_unit_port(iorb));
916 u32 tf_data = readl(port_mmio + PORT_TFDATA);
917 u8 err = (u8) (tf_data >> 8);
918 u8 sts = (u8) (tf_data);
919
920 if (sts & ATA_ERR) {
921 if (sts & ATA_DF) {
922 /* there is a device-specific error condition */
923 if (err & ATA_ICRC) {
924 iorb_seterr(iorb, IOERR_ADAPTER_DEVICEBUSCHECK);
925 } else if (err & ATA_UNC) {
926 iorb_seterr(iorb, IOERR_MEDIA);
927 } else if (err & ATA_IDNF) {
928 iorb_seterr(iorb, IOERR_RBA_ADDRESSING_ERROR);
929 } else {
930 iorb_seterr(iorb, IOERR_DEVICE_NONSPECIFIC);
931 }
932
933 } else {
934 iorb_seterr(iorb, IOERR_DEVICE_NONSPECIFIC);
935 }
936 } else {
937 /* this function only gets called when we received an error interrupt */
938 iorb_seterr(iorb, IOERR_DEVICE_NONSPECIFIC);
939 }
940
941 /* Return an error to indicate there's no HW command to be submitted and
942 * that the IORB can be completed "as is" (the upstream code expects the
943 * IORB error code, if any, to be set when this happens and this is exactly
944 * what this function is all about).
945 */
946 return(-1);
947}
948
949/******************************************************************************
950 * Extract vendor and device name from an ATA INDENTIFY buffer. Since strings
951 * in the indentify buffer are byte-swapped, we need to swap them back.
952 */
953char *ata_dev_name(u16 *id_buf)
954{
955 static char dev_name[ATA_ID_PROD_LEN + 1];
956 char *t = dev_name;
957 char *s = (char *) (id_buf + ATA_ID_PROD);
958 int i;
959
960 dev_name[sizeof(dev_name)-1] = '\0';
961
962 for (i = 0; i < ATA_ID_PROD_LEN / 2; i++) {
963 *(t++) = s[1];
964 *(t++) = s[0];
965 s += 2;
966 }
967
968 return(dev_name);
969}
970
971/******************************************************************************
972 * Fabricate ATA READ command based on the capabilities of the corresponding
973 * device and the paramters set from above (NCQ, etc).
974 */
975static int ata_cmd_read(IORBH _far *iorb, AD_INFO *ai, int p, int d, int slot,
976 ULONG sector, ULONG count, SCATGATENTRY _far *sg_list,
977 ULONG sg_cnt)
978{
979 int rc;
980
981 if (sector >= (1UL << 28) || count > 256 || add_workspace(iorb)->is_ncq) {
982 /* need LBA48 for this command */
983 if (!ai->ports[p].devs[d].lba48) {
984 iorb_seterr(iorb, IOERR_RBA_LIMIT);
985 return(-1);
986 }
987 if (add_workspace(iorb)->is_ncq) {
988 /* use NCQ read; count goes into feature register, tag into count! */
989 rc = ata_cmd(ai, p, d, slot, ATA_CMD_FPDMA_READ,
990 AP_SECTOR_48, (u32) sector, (u16) 0,
991 AP_FEATURES, (u16) count,
992 AP_COUNT, (u16) (slot << 3), /* tag == slot */
993 AP_SGLIST, sg_list, (u16) sg_cnt,
994 AP_DEVICE, 0x40,
995 AP_END);
996 } else {
997 rc = ata_cmd(ai, p, d, slot, ATA_CMD_READ_EXT,
998 AP_SECTOR_48, (u32) sector, (u16) 0,
999 AP_COUNT, (u16) count,
1000 AP_SGLIST, sg_list, (u16) sg_cnt,
1001 AP_DEVICE, 0x40,
1002 AP_END);
1003 }
1004
1005 } else {
1006 rc = ata_cmd(ai, p, d, slot, ATA_CMD_READ,
1007 AP_SECTOR_28, (u32) sector,
1008 AP_COUNT, (u16) count & 0xffU,
1009 AP_SGLIST, sg_list, (u16) sg_cnt,
1010 AP_DEVICE, 0x40,
1011 AP_END);
1012 }
1013
1014 return(rc);
1015}
1016
1017/******************************************************************************
1018 * Fabricate ATA WRITE command based on the capabilities of the corresponding
1019 * device and the paramters set from above (NCQ, etc)
1020 */
1021static int ata_cmd_write(IORBH _far *iorb, AD_INFO *ai, int p, int d, int slot,
1022 ULONG sector, ULONG count, SCATGATENTRY _far *sg_list,
1023 ULONG sg_cnt, int write_through)
1024{
1025 int rc;
1026
1027 if (sector >= (1UL << 28) || count > 256 || add_workspace(iorb)->is_ncq) {
1028 /* need LBA48 for this command */
1029 if (!ai->ports[p].devs[d].lba48) {
1030 iorb_seterr(iorb, IOERR_RBA_LIMIT);
1031 return(-1);
1032 }
1033 if (add_workspace(iorb)->is_ncq) {
1034 /* use NCQ write; count goes into feature register, tag into count! */
1035 rc = ata_cmd(ai, p, d, slot, ATA_CMD_FPDMA_WRITE,
1036 AP_SECTOR_48, (u32) sector, (u16) 0,
1037 AP_FEATURES, (u16) count,
1038 AP_COUNT, (u16) (slot << 3), /* tag = slot */
1039 AP_SGLIST, sg_list, (u16) sg_cnt,
1040 AP_DEVICE, 0x40,
1041 AP_DEVICE, (write_through) ? 0x80 : 0, /* force unit access */
1042 AP_WRITE, 1,
1043 AP_END);
1044 } else {
1045 rc = ata_cmd(ai, p, d, slot, ATA_CMD_WRITE_EXT,
1046 AP_SECTOR_48, (u32) sector, (u16) 0,
1047 AP_COUNT, (u16) count,
1048 AP_SGLIST, sg_list, (u16) sg_cnt,
1049 AP_DEVICE, 0x40,
1050 AP_WRITE, 1,
1051 AP_END);
1052 }
1053
1054 } else {
1055 rc = ata_cmd(ai, p, d, slot, ATA_CMD_WRITE,
1056 AP_SECTOR_28, (u32) sector,
1057 AP_COUNT, (u16) count & 0xffU,
1058 AP_SGLIST, sg_list, (u16) sg_cnt,
1059 AP_DEVICE, 0x40,
1060 AP_WRITE, 1,
1061 AP_END);
1062 }
1063
1064 return(rc);
1065}
Note: See TracBrowser for help on using the repository browser.