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

Last change on this file since 162 was 162, checked in by David Azarewicz, 12 years ago

driver info updates, misc cleanup, add comments
This is version 1.28

File size: 42.8 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 for (i = n = 0; i < sg_cnt; i++) {
252 u32 sg_addr = sg_list[i].ppXferBuf;
253 u32 sg_size = sg_list[i].XferBufLen;
254
255 do {
256 u32 chunk = (sg_size > AHCI_MAX_SG_ELEMENT_LEN) ? AHCI_MAX_SG_ELEMENT_LEN
257 : sg_size;
258 if (n >= AHCI_MAX_SG) {
259 /* couldn't store all S/G elements in our DMA buffer */
260 ddprintf("ata_cmd(): too many S/G elements\n");
261 return(i - 1);
262 }
263 if ((sg_addr & 1) || (chunk & 1)) {
264 ddprintf("error: ata_cmd() called with unaligned S/G element(s)\n");
265 return(ATA_CMD_UNALIGNED_ADDR);
266 }
267 cmd_tbl->sg_list[n].addr = sg_addr;
268 cmd_tbl->sg_list[n].size = chunk - 1;
269 sg_addr += chunk;
270 sg_size -= chunk;
271 n++;
272 } while (sg_size > 0);
273 }
274
275 /* set final S/G count in AHCI command header */
276 cmd_hdr->options |= (u32) n << 16;
277
278 if (debug >= 2) {
279 aprintf("ATA command for %d.%d.%d, slot %d:\n", ad_no(ai), p, d, slot);
280 phex(cmd_hdr, offsetof(AHCI_CMD_HDR, reserved), "cmd_hdr: ");
281 phex(&ata_cmd, sizeof(ata_cmd), "ata_cmd: ");
282 if (atapi_cmd != NULL) {
283 phex(atapi_cmd, atapi_cmd_len, "atapi_cmd: ");
284 }
285 if (n > 0) {
286 phex(cmd_tbl->sg_list, sizeof(*cmd_tbl->sg_list) * n, "sg_list: ");
287 }
288 }
289
290 return(ATA_CMD_SUCCESS);
291}
292
293/******************************************************************************
294 * Fill SATA command FIS with values extracted from an ATA command structure.
295 * The command FIS buffer (fis) is expected to be initialized to 0s. The
296 * structure of the FIS maps to the ATA shadow register block, including
297 * registers which can be written twice to store 16 bits (called 'exp').
298 *
299 * The FIS structure looks like this (using LSB notation):
300 *
301 * +----------------+----------------+----------------+----------------+
302 * 00 | FIS type (27h) | C|R|R|R|PMP | Command | Features |
303 * +----------------+----------------+----------------+----------------+
304 * 04 | LBA 7:0 | LBA 15:8 | LBA 23:16 | R|R|R|D|Head |
305 * +----------------+----------------+----------------+----------------+
306 * 08 | LBA 31:24 | LBA 40:32 | LBA 47:40 | Features exp |
307 * +----------------+----------------+----------------+----------------+
308 * 12 | Count 7:0 | Count 15:8 | Reserved | Control |
309 * +----------------+----------------+----------------+----------------+
310 * 16 | Reserved | Reserved | Reserved | Reserved |
311 * +----------------+----------------+----------------+----------------+
312 */
313void ata_cmd_to_fis(u8 _far *fis, ATA_CMD _far *ata_cmd, int d)
314{
315 fis[0] = 0x27; /* register - host to device FIS */
316 fis[1] = (u8) (d & 0xf); /* port multiplier number */
317 fis[1] |= 0x80; /* bit 7 indicates Command FIS */
318 fis[2] = (u8) ata_cmd->cmd;
319 fis[3] = (u8) ata_cmd->features;
320
321 fis[4] = (u8) ata_cmd->lba_l;
322 fis[5] = (u8) (ata_cmd->lba_l >> 8);
323 fis[6] = (u8) (ata_cmd->lba_l >> 16);
324 fis[7] = (u8) ata_cmd->device;
325
326 fis[8] = (u8) (ata_cmd->lba_l >> 24);
327 fis[9] = (u8) ata_cmd->lba_h;
328 fis[10] = (u8) (ata_cmd->lba_h >> 8);
329 fis[11] = (u8) (ata_cmd->features >> 8);
330
331 fis[12] = (u8) ata_cmd->count;
332 fis[13] = (u8) (ata_cmd->count >> 8);
333}
334
335/******************************************************************************
336 * Get index in S/G list for the number of transferred sectors in the IORB.
337 *
338 * Returning io->cSGList indicates an error.
339 *
340 * NOTE: OS/2 makes sure S/G lists are set up such that entries at the HW
341 * limit will never cross sector boundaries. This means that splitting
342 * S/G lists into multiple commands can be done without editing the S/G
343 * lists.
344 */
345u16 ata_get_sg_indx(IORB_EXECUTEIO _far *io)
346{
347 ULONG offset = io->BlocksXferred * io->BlockSize;
348 USHORT i;
349
350 for (i = 0; i < io->cSGList && offset > 0; i++) {
351 offset -= io->pSGList[i].XferBufLen;
352 }
353
354 return(i);
355}
356
357/******************************************************************************
358 * Get max S/G count which will fit into our HW S/G buffers. This function is
359 * called when the S/G list is too long and we need to split the IORB into
360 * multiple commands. It returns both the number of sectors and S/G list
361 * elements that we can handle in a single command.
362 *
363 * The parameter 'sg_indx' indicates the current start index in the S/G list
364 * (0 if this is the first command iteration).
365 *
366 * The parameter 'sg_max' is the return value of v_ata_cmd() and indicates
367 * how many S/G elements were successfully mapped. Whatever we return needs to
368 * be less or equal to this value.
369 *
370 * Returning 0 in *sg_cnt indicates an error.
371 *
372 * NOTE: OS/2 makes sure S/G lists are set up such that entries at HW limits
373 * will never cross sector boundaries. This means that splitting S/G
374 * lists into multiple commands can be done without editing S/G list
375 * elements. Since AHCI only allows 22 bits for each S/G element, the
376 * hardware limits are reported as AHCI_MAX_SG / 2 but will vary based
377 * on the actual length of S/G elements. This function looks for the
378 * maximum number of S/G elements that can be mapped on sector
379 * boundaries which will still fit into our HW S/G list.
380 */
381void ata_max_sg_cnt(IORB_EXECUTEIO _far *io, USHORT sg_indx, USHORT sg_max,
382 USHORT _far *sg_cnt, USHORT _far *sector_cnt)
383{
384 ULONG max_sector_cnt = 0;
385 USHORT max_sg_cnt = 0;
386 ULONG offset = 0;
387 USHORT i;
388
389 for (i = sg_indx; i < io->cSGList; i++) {
390 if (i - sg_indx >= sg_max) {
391 /* we're beyond the number of S/G elements we can map */
392 break;
393 }
394
395 offset += io->pSGList[i].XferBufLen;
396 if (offset % io->BlockSize == 0) {
397 /* this S/G element ends on a sector boundary */
398 max_sector_cnt = offset / io->BlockSize;
399 max_sg_cnt = i + 1;
400 }
401 }
402
403 /* return the best match we found (0 indicating failure) */
404 *sector_cnt = max_sector_cnt;
405 *sg_cnt = max_sg_cnt;
406}
407
408
409/******************************************************************************
410 * Get device or media geometry. Device and media geometry are expected to be
411 * the same for non-removable devices, which will always be the case for the
412 * ATA devices we're dealing with (hard disks). ATAPI is a different story
413 * and handled by atapi_get_geometry().
414 */
415int ata_get_geometry(IORBH _far *iorb, int slot)
416{
417 ADD_WORKSPACE _far *aws = add_workspace(iorb);
418 int rc;
419
420 /* allocate buffer for ATA identify information */
421 if ((aws->buf = malloc(ATA_ID_WORDS * sizeof(u16))) == NULL) {
422 iorb_seterr(iorb, IOERR_CMD_SW_RESOURCE);
423 return(-1);
424 }
425
426 /* request ATA identify information */
427 aws->ppfunc = ata_get_geometry_pp;
428 rc = ata_cmd(ad_infos + iorb_unit_adapter(iorb),
429 iorb_unit_port(iorb),
430 iorb_unit_device(iorb),
431 slot,
432 ATA_CMD_ID_ATA,
433 AP_VADDR, (void _far *) aws->buf, ATA_ID_WORDS * sizeof(u16),
434 AP_END);
435
436 if (rc != 0) {
437 iorb_seterr(iorb, IOERR_CMD_ADD_SOFTWARE_FAILURE);
438 }
439
440 return(rc);
441}
442
443int check_lvm(IORBH _far *iorb, ULONG sector)
444{
445 DLA_Table_Sector *pDLA = (DLA_Table_Sector*)add_workspace(iorb)->buf;
446 AD_INFO *ai = ad_infos + iorb_unit_adapter(iorb);
447 GEOMETRY _far *geometry = ((IORB_GEOMETRY _far *) iorb)->pGeometry;
448 int p = iorb_unit_port(iorb);
449 int rc;
450
451 rc = ahci_exec_polled_cmd(ai, p, 0, 500, ATA_CMD_READ,
452 AP_SECTOR_28, (u32) sector-1,
453 AP_COUNT, (u16) 1,
454 AP_VADDR, (void _far *) pDLA, 512,
455 AP_DEVICE, 0x40,
456 AP_END);
457 if (rc) return 0;
458
459 ddphex(pDLA, sizeof(DLA_Table_Sector), "DLA sector %d:\n", sector-1);
460
461 if ((pDLA->DLA_Signature1 == DLA_TABLE_SIGNATURE1) && (pDLA->DLA_Signature2 == DLA_TABLE_SIGNATURE2)) {
462 ddprintf("is_lvm_geometry found at sector %d\n", sector-1);
463 geometry->TotalCylinders = pDLA->Cylinders;
464 geometry->NumHeads = pDLA->Heads_Per_Cylinder;
465 geometry->SectorsPerTrack = pDLA->Sectors_Per_Track;
466 geometry->TotalSectors = pDLA->Cylinders * pDLA->Heads_Per_Cylinder * pDLA->Sectors_Per_Track;
467 return 1;
468 }
469
470 return 0;
471}
472
473/******************************************************************************
474 * Try to read LVM information from the disk. If found, use the LVM geometry.
475 * This function will only work at init time. A better strategy would be to
476 * calculate the geometry during ahci_scan_ports and save it away and then just
477 * return the saved values when ata_get_geometry() is called.
478 */
479int is_lvm_geometry(IORBH _far *iorb)
480{
481 GEOMETRY _far *geometry = ((IORB_GEOMETRY _far *) iorb)->pGeometry;
482 ULONG sector;
483
484 if (init_complete) return 0; /* We cannot use ahci_exec_polled_cmd() after init_complete */
485
486 if (use_lvm_info) {
487 #ifdef DEBUG
488 AD_INFO *ai = ad_infos + iorb_unit_adapter(iorb);
489 int p = iorb_unit_port(iorb);
490 int d = iorb_unit_device(iorb);
491 ddprintf("is_lvm_geometry (%d.%d.%d)\n", ad_no(ai), p, d);
492 #endif
493
494 /* First check the sector reported by the hardware */
495 if (check_lvm(iorb, geometry->SectorsPerTrack)) return 1;
496
497 for (sector = 255; sector >= 63; sector >>= 1) {
498 if (sector == geometry->SectorsPerTrack) continue;
499 if (check_lvm(iorb, sector)) return 1;
500 }
501 }
502
503 return 0;
504}
505
506/******************************************************************************
507 * Post processing function for ata_get_geometry(): convert the ATA identify
508 * information to OS/2 IOCC_GEOMETRY information.
509 */
510void ata_get_geometry_pp(IORBH _far *iorb)
511{
512 GEOMETRY _far *geometry = ((IORB_GEOMETRY _far *) iorb)->pGeometry;
513 USHORT geometry_len = ((IORB_GEOMETRY _far *) iorb)->GeometryLen;
514 u16 *id_buf = add_workspace(iorb)->buf;
515 int a = iorb_unit_adapter(iorb);
516 int p = iorb_unit_port(iorb);
517 char *Method;
518
519 /* Fill-in geometry information; the ATA-8 spec declares the geometry
520 * fields in the ATA ID buffer as obsolete but it's still the best
521 * guess in most cases. If the information stored in the geometry
522 * fields is apparently incorrect, we'll use the algorithm typically
523 * used by SCSI adapters and modern PC BIOS versions:
524 *
525 * - 512 bytes per sector
526 * - 255 heads
527 * - 63 sectors per track (or 56 with the parameter "/4")
528 * - x cylinders (calculated)
529 *
530 * Please note that os2ahci currently does not natively support ATA sectors
531 * larger than 512 bytes, therefore relies on the translation logic built
532 * into the corresponding ATA disks. In order to prevent file systems that
533 * use block sizes larger than 512 bytes (FAT, JFS, ...) from ending up on
534 * incorrectly aligned physical sector accesses, hence using more physical
535 * I/Os than necessary, the command line parameter "/4" can be used to force
536 * a track size of 56 sectors. This way, partitions will start on 4K
537 * boundaries.
538 *
539 * Another limitation is that OS/2 has a 32-bit variable for the total number
540 * of sectors, limiting the maximum capacity to roughly 2TB. This is another
541 * issue that needs to be addressed sooner or later; large sectors could
542 * raise this limit to something like 8TB but this is not really much of a
543 * difference. Maybe there's something in later DDKs that allows more than
544 * 32 bits?
545 */
546 memset(geometry, 0x00, geometry_len);
547 geometry->BytesPerSector = ATA_SECTOR_SIZE;
548
549 /* extract total number of sectors */
550 if (id_buf[ATA_ID_CFS_ENABLE_2] & 0x400) {
551 /* 48-bit LBA supported */
552 if (ATA_CAPACITY48_H(id_buf) != 0) {
553 /* more than 32 bits for number of sectors */
554 dprintf("warning: limiting disk %d.%d.%d to 2TB\n",
555 iorb_unit_adapter(iorb), iorb_unit_port(iorb),
556 iorb_unit_device(iorb));
557 geometry->TotalSectors = 0xffffffffUL;
558 } else {
559 geometry->TotalSectors = ATA_CAPACITY48_L(id_buf);
560 }
561 } else {
562 /* 28-bit LBA */
563 geometry->TotalSectors = ATA_CAPACITY(id_buf) & 0x0fffffffUL;
564 }
565
566 Method = "None";
567 /* fabricate the remaining geometry fields */
568 if (track_size[a][p] != 0) {
569 /* A specific track size has been requested for this port; this is
570 * typically done for disks with 4K sectors to make sure partitions
571 * start on 8-sector boundaries (parameter "/4").
572 */
573 geometry->NumHeads = 255;
574 geometry->SectorsPerTrack = track_size[a][p];
575 geometry->TotalCylinders = geometry->TotalSectors /
576 ((u32) geometry->NumHeads *
577 (u32) geometry->SectorsPerTrack);
578 Method = "Custom";
579 } else if (CUR_HEADS(id_buf) > 0 && CUR_CYLS(id_buf) > 0 &&
580 CUR_SECTORS(id_buf) > 0 &&
581 CUR_CAPACITY(id_buf) == (u32) CUR_HEADS(id_buf) *
582 (u32) CUR_CYLS(id_buf) *
583 (u32) CUR_SECTORS(id_buf)) {
584 /* BIOS-supplied (aka "current") geometry values look valid */
585 geometry->NumHeads = CUR_HEADS(id_buf);
586 geometry->SectorsPerTrack = CUR_SECTORS(id_buf);
587 geometry->TotalCylinders = CUR_CYLS(id_buf);
588 Method = "BIOS";
589 } else if (ATA_HEADS(id_buf) > 0 && ATA_CYLS(id_buf) > 0 &&
590 ATA_SECTORS(id_buf) > 0) {
591 /* ATA-supplied values for geometry look valid */
592 geometry->NumHeads = ATA_HEADS(id_buf);
593 geometry->SectorsPerTrack = ATA_SECTORS(id_buf);
594 geometry->TotalCylinders = ATA_CYLS(id_buf);
595 Method = "ATA";
596 } else {
597 /* use typical SCSI geometry */
598 geometry->NumHeads = 255;
599 geometry->SectorsPerTrack = 63;
600 geometry->TotalCylinders = geometry->TotalSectors /
601 ((u32) geometry->NumHeads *
602 (u32) geometry->SectorsPerTrack);
603 Method = "SCSI";
604 }
605
606 if (is_lvm_geometry(iorb)) Method = "LVM";
607 ad_infos[a].ports[p].devs[0].dev_info.Cylinders = geometry->TotalCylinders;
608 ad_infos[a].ports[p].devs[0].dev_info.HeadsPerCylinder = geometry->NumHeads;
609 ad_infos[a].ports[p].devs[0].dev_info.SectorsPerTrack = geometry->SectorsPerTrack;
610 ad_infos[a].ports[p].devs[0].dev_info.TotalSectors = geometry->TotalSectors;
611 ad_infos[a].ports[p].devs[0].dev_info.Method = Method;
612
613 dprintf("Drive geometry: %ld cylinders, %d heads, %d sectors per track (%ldMB) (%s)\n",
614 (u32) geometry->TotalCylinders, (u16) geometry->NumHeads, (u16) geometry->SectorsPerTrack,
615 (u32) (geometry->TotalSectors / 2048), Method);
616
617 /* tell interrupt handler that this IORB is complete */
618 add_workspace(iorb)->complete = 1;
619}
620
621/******************************************************************************
622 * Test whether unit is ready.
623 */
624int ata_unit_ready(IORBH _far *iorb, int slot)
625{
626 /* This is a NOP for ATA devices (at least right now); returning an error
627 * without setting an error code means ahci_exec_iorb() will not queue any
628 * HW command and the IORB will complete successfully.
629 */
630 ((IORB_UNIT_STATUS _far *) iorb)->UnitStatus = US_READY | US_POWER;
631 return(-1);
632}
633
634/******************************************************************************
635 * Read sectors from AHCI device.
636 */
637int ata_read(IORBH _far *iorb, int slot)
638{
639 IORB_EXECUTEIO _far *io = (IORB_EXECUTEIO _far *) iorb;
640 AD_INFO *ai = ad_infos + iorb_unit_adapter(iorb);
641 ULONG sector = io->RBA + io->BlocksXferred;
642 USHORT count = io->BlockCount - io->BlocksXferred;
643 USHORT sg_indx;
644 USHORT sg_cnt;
645 int p = iorb_unit_port(iorb);
646 int d = iorb_unit_device(iorb);
647 int rc;
648
649 if (io->BlockCount == 0) {
650 /* NOP; return -1 without error in IORB to indicate success */
651 return(-1);
652 }
653
654 if (add_workspace(iorb)->unaligned) {
655 /* unaligned S/G addresses present; need to use double buffers */
656 return(ata_read_unaligned(iorb, slot));
657 }
658
659 /* Kludge: some I/O commands during boot use excessive S/G buffer lengths
660 * which cause NCQ commands to lock up. If there's only one S/G element
661 * and this element is already larger than what we can derive from the sector
662 * count, we'll adjust that element.
663 */
664 if (io->BlocksXferred == 0 && io->cSGList == 1 &&
665 io->pSGList[0].XferBufLen > (ULONG) io->BlockCount * io->BlockSize) {
666 io->pSGList[0].XferBufLen = (ULONG) io->BlockCount * io->BlockSize;
667 }
668
669 /* prepare read command while keeping an eye on S/G count limitations */
670 do {
671 sg_indx = ata_get_sg_indx(io);
672 sg_cnt = io->cSGList - sg_indx;
673 if ((rc = ata_cmd_read(iorb, ai, p, d, slot, sector, count,
674 io->pSGList + sg_indx, sg_cnt)) > 0) {
675 /* couldn't map all S/G elements */
676 ata_max_sg_cnt(io, sg_indx, (USHORT) rc, &sg_cnt, &count);
677 }
678 } while (rc > 0 && sg_cnt > 0);
679
680 if (rc == 0) {
681 add_workspace(iorb)->blocks = count;
682 add_workspace(iorb)->ppfunc = ata_read_pp;
683
684 } else if (rc > 0) {
685 iorb_seterr(iorb, IOERR_CMD_SGLIST_BAD);
686
687 } else if (rc == ATA_CMD_UNALIGNED_ADDR) {
688 /* unaligned S/G addresses detected; need to use double buffers */
689 add_workspace(iorb)->unaligned = 1;
690 return(ata_read_unaligned(iorb, slot));
691
692 } else {
693 iorb_seterr(iorb, IOERR_CMD_ADD_SOFTWARE_FAILURE);
694 }
695
696 return(rc);
697}
698
699/******************************************************************************
700 * Read sectors from AHCI device with unaligned S/G element addresses. AHCI
701 * only allows aligned S/G addresses while OS/2 doesn't have these kind of
702 * restrictions. This doesn't happen very often but when it does, we need to
703 * use a transfer buffer and copy the data manually.
704 */
705int ata_read_unaligned(IORBH _far *iorb, int slot)
706{
707 IORB_EXECUTEIO _far *io = (IORB_EXECUTEIO _far *) iorb;
708 ADD_WORKSPACE _far *aws = add_workspace(iorb);
709 AD_INFO *ai = ad_infos + iorb_unit_adapter(iorb);
710 ULONG sector = io->RBA + io->BlocksXferred;
711 SCATGATENTRY sg_single;
712 int p = iorb_unit_port(iorb);
713 int d = iorb_unit_device(iorb);
714 int rc;
715
716 ddprintf("ata_read_unaligned(%d.%d.%d, %ld)\n", ad_no(ai), p, d, sector);
717
718 /* allocate transfer buffer */
719 if ((aws->buf = malloc(io->BlockSize)) == NULL) {
720 iorb_seterr(iorb, IOERR_CMD_SW_RESOURCE);
721 return(-1);
722 }
723
724 /* prepare read command using transfer buffer */
725 sg_single.ppXferBuf = virt_to_phys(aws->buf);
726 sg_single.XferBufLen = io->BlockSize;
727 rc = ata_cmd_read(iorb, ai, p, d, slot, sector, 1, &sg_single, 1);
728
729 if (rc == 0) {
730 add_workspace(iorb)->blocks = 1;
731 add_workspace(iorb)->ppfunc = ata_read_pp;
732
733 } else if (rc > 0) {
734 iorb_seterr(iorb, IOERR_CMD_SGLIST_BAD);
735
736 } else {
737 iorb_seterr(iorb, IOERR_CMD_ADD_SOFTWARE_FAILURE);
738 }
739
740 return(rc);
741}
742
743/******************************************************************************
744 * Post processing function for ata_read(); this function updates the
745 * BlocksXferred counter in the IORB and, if not all blocks have been
746 * transferred, requeues the IORB to process the remaining sectors. It also
747 * takes care of copying data from the transfer buffer for unaligned reads.
748 */
749void ata_read_pp(IORBH _far *iorb)
750{
751 IORB_EXECUTEIO _far *io = (IORB_EXECUTEIO _far *) iorb;
752 ADD_WORKSPACE _far *aws = add_workspace(iorb);
753
754 if (aws->unaligned) {
755 /* copy transfer buffer to corresponding physical address in S/G list */
756 sg_memcpy(io->pSGList, io->cSGList,
757 (ULONG) io->BlocksXferred * (ULONG) io->BlockSize,
758 aws->buf, io->BlockSize, BUF_TO_SG);
759 }
760
761 io->BlocksXferred += add_workspace(iorb)->blocks;
762 ddprintf("ata_read_pp(): blocks transferred = %d\n", (int) io->BlocksXferred);
763
764 if (io->BlocksXferred >= io->BlockCount) {
765 /* we're done; tell IRQ handler the IORB is complete */
766 add_workspace(iorb)->complete = 1;
767 } else {
768 /* requeue this IORB for next iteration */
769 iorb_requeue(iorb);
770 }
771}
772
773/******************************************************************************
774 * Verify readability of sectors on ATA device.
775 */
776int ata_verify(IORBH _far *iorb, int slot)
777{
778 IORB_EXECUTEIO _far *io = (IORB_EXECUTEIO _far *) iorb;
779 AD_INFO *ai = ad_infos + iorb_unit_adapter(iorb);
780 int p = iorb_unit_port(iorb);
781 int d = iorb_unit_device(iorb);
782 int rc;
783
784 if (io->BlockCount == 0) {
785 /* NOP; return -1 without error in IORB to indicate success */
786 return(-1);
787 }
788
789 /* prepare verify command */
790 if (io->RBA >= (1UL << 28) || io->BlockCount > 256) {
791 /* need LBA48 for this command */
792 if (!ai->ports[p].devs[d].lba48) {
793 iorb_seterr(iorb, IOERR_RBA_LIMIT);
794 return(-1);
795 }
796 rc = ata_cmd(ai, p, d, slot, ATA_CMD_VERIFY_EXT,
797 AP_SECTOR_48, (u32) io->RBA, (u16) 0,
798 AP_COUNT, (u16) io->BlockCount,
799 AP_DEVICE, 0x40,
800 AP_END);
801 } else {
802 rc = ata_cmd(ai, p, d, slot, ATA_CMD_VERIFY,
803 AP_SECTOR_28, (u32) io->RBA,
804 AP_COUNT, (u16) io->BlockCount & 0xffU,
805 AP_DEVICE, 0x40,
806 AP_END);
807 }
808
809 return(rc);
810}
811
812/******************************************************************************
813 * Write sectors to AHCI device.
814 */
815int ata_write(IORBH _far *iorb, int slot)
816{
817 IORB_EXECUTEIO _far *io = (IORB_EXECUTEIO _far *) iorb;
818 AD_INFO *ai = ad_infos + iorb_unit_adapter(iorb);
819 ULONG sector = io->RBA + io->BlocksXferred;
820 USHORT count = io->BlockCount - io->BlocksXferred;
821 USHORT sg_indx;
822 USHORT sg_cnt;
823 int p = iorb_unit_port(iorb);
824 int d = iorb_unit_device(iorb);
825 int rc;
826
827 if (io->BlockCount == 0) {
828 /* NOP; return -1 without error in IORB to indicate success */
829 return(-1);
830 }
831
832 if (add_workspace(iorb)->unaligned) {
833 /* unaligned S/G addresses present; need to use double buffers */
834 return(ata_write_unaligned(iorb, slot));
835 }
836
837 /* prepare write command while keeping an eye on S/G count limitations */
838 do {
839 sg_indx = ata_get_sg_indx(io);
840 sg_cnt = io->cSGList - sg_indx;
841 if ((rc = ata_cmd_write(iorb, ai, p, d, slot, sector, count,
842 io->pSGList + sg_indx, sg_cnt,
843 io->Flags & XIO_DISABLE_HW_WRITE_CACHE)) > 0) {
844 /* couldn't map all S/G elements */
845 ata_max_sg_cnt(io, sg_indx, (USHORT) rc, &sg_cnt, &count);
846 }
847 } while (rc > 0 && sg_cnt > 0);
848
849 if (rc == 0) {
850 add_workspace(iorb)->blocks = count;
851 add_workspace(iorb)->ppfunc = ata_write_pp;
852
853 } else if (rc > 0) {
854 iorb_seterr(iorb, IOERR_CMD_SGLIST_BAD);
855
856 } else if (rc == ATA_CMD_UNALIGNED_ADDR) {
857 /* unaligned S/G addresses detected; need to use double buffers */
858 add_workspace(iorb)->unaligned = 1;
859 return(ata_write_unaligned(iorb, slot));
860
861 } else {
862 iorb_seterr(iorb, IOERR_CMD_ADD_SOFTWARE_FAILURE);
863 }
864
865 return(rc);
866}
867
868/******************************************************************************
869 * Write sectors from AHCI device with unaligned S/G element addresses. AHCI
870 * only allows aligned S/G addresses while OS/2 doesn't have these kind of
871 * restrictions. This doesn't happen very often but when it does, we need to
872 * use a transfer buffer and copy the data manually.
873 */
874int ata_write_unaligned(IORBH _far *iorb, int slot)
875{
876 IORB_EXECUTEIO _far *io = (IORB_EXECUTEIO _far *) iorb;
877 ADD_WORKSPACE _far *aws = add_workspace(iorb);
878 AD_INFO *ai = ad_infos + iorb_unit_adapter(iorb);
879 ULONG sector = io->RBA + io->BlocksXferred;
880 SCATGATENTRY sg_single;
881 int p = iorb_unit_port(iorb);
882 int d = iorb_unit_device(iorb);
883 int rc;
884
885 ddprintf("ata_write_unaligned(%d.%d.%d, %ld)\n", ad_no(ai), p, d, sector);
886
887 /* allocate transfer buffer */
888 if ((aws->buf = malloc(io->BlockSize)) == NULL) {
889 iorb_seterr(iorb, IOERR_CMD_SW_RESOURCE);
890 return(-1);
891 }
892
893 /* copy next sector from S/G list to transfer buffer */
894 sg_memcpy(io->pSGList, io->cSGList,
895 (ULONG) io->BlocksXferred * (ULONG) io->BlockSize,
896 aws->buf, io->BlockSize, SG_TO_BUF);
897
898 /* prepare write command using transfer buffer */
899 sg_single.ppXferBuf = virt_to_phys(aws->buf);
900 sg_single.XferBufLen = io->BlockSize;
901 rc = ata_cmd_write(iorb, ai, p, d, slot, sector, 1, &sg_single, 1,
902 io->Flags & XIO_DISABLE_HW_WRITE_CACHE);
903
904 if (rc == 0) {
905 add_workspace(iorb)->blocks = 1;
906 add_workspace(iorb)->ppfunc = ata_write_pp;
907
908 } else if (rc > 0) {
909 iorb_seterr(iorb, IOERR_CMD_SGLIST_BAD);
910
911 } else {
912 iorb_seterr(iorb, IOERR_CMD_ADD_SOFTWARE_FAILURE);
913 }
914
915 return(rc);
916}
917
918
919/******************************************************************************
920 * Post processing function for ata_write(); this function updates the
921 * BlocksXferred counter in the IORB and, if not all blocks have been
922 * transferred, requeues the IORB to process the remaining sectors.
923 */
924void ata_write_pp(IORBH _far *iorb)
925{
926 IORB_EXECUTEIO _far *io = (IORB_EXECUTEIO _far *) iorb;
927
928 io->BlocksXferred += add_workspace(iorb)->blocks;
929 ddprintf("ata_write_pp(): blocks transferred = %d\n", (int) io->BlocksXferred);
930
931 if (io->BlocksXferred >= io->BlockCount) {
932 /* we're done; tell IRQ handler the IORB is complete */
933 add_workspace(iorb)->complete = 1;
934 } else {
935 /* requeue this IORB for next iteration */
936 iorb_requeue(iorb);
937 }
938}
939
940/******************************************************************************
941 * Execute ATA command.
942 */
943int ata_execute_ata(IORBH _far *iorb, int slot)
944{
945 IORB_ADAPTER_PASSTHRU _far *apt = (IORB_ADAPTER_PASSTHRU _far *) iorb;
946 AD_INFO *ai = ad_infos + iorb_unit_adapter(iorb);
947 int p = iorb_unit_port(iorb);
948 int d = iorb_unit_device(iorb);
949 int rc;
950
951 if (apt->ControllerCmdLen != sizeof(ATA_CMD)) {
952 iorb_seterr(iorb, IOERR_CMD_SYNTAX);
953 return(-1);
954 }
955
956 rc = ata_cmd(ai, p, d, slot, 0,
957 AP_SGLIST, apt->pSGList, apt->cSGList,
958 AP_ATA_CMD, apt->pControllerCmd,
959 AP_WRITE, !(apt->Flags & PT_DIRECTION_IN),
960 AP_END);
961
962 if (rc == 0) {
963 add_workspace(iorb)->ppfunc = ata_execute_ata_pp;
964 }
965
966 return(rc);
967}
968
969/******************************************************************************
970 * Post processing function for ata_execute_ata(); the main purpose of this
971 * function is to copy the received D2H FIS (i.e. the device registers after
972 * command completion) back to the ATA command structure.
973 *
974 * See ata_cmd_to_fis() for an explanation of the mapping.
975 */
976void ata_execute_ata_pp(IORBH _far *iorb)
977{
978 AHCI_PORT_DMA _far *dma_base;
979 ATA_CMD _far *cmd;
980 AD_INFO *ai;
981 u8 _far *fis;
982 int p;
983
984 /* get address of D2H FIS */
985 ai = ad_infos + iorb_unit_adapter(iorb);
986 p = iorb_unit_port(iorb);
987 dma_base = port_dma_base(ai, p);
988 fis = dma_base->rx_fis + 0x40;
989
990 if (fis[0] != 0x34) {
991 /* this is not a D2H FIS - give up silently */
992 ddprintf("ata_execute_ata_pp(): D2H FIS type incorrect: %d\n", fis[0]);
993 add_workspace(iorb)->complete = 1;
994 return;
995 }
996
997 /* map D2H FIS to the original ATA controller command structure */
998 cmd = (ATA_CMD _far *) ((IORB_ADAPTER_PASSTHRU _far *) iorb)->pControllerCmd;
999
1000 cmd->cmd = fis[2];
1001 cmd->device = fis[7];
1002 cmd->features = ((u16) fis[3])
1003 | ((u16) fis[11]);
1004 cmd->lba_l = ((u32) fis[4])
1005 | ((u32) fis[5] << 8)
1006 | ((u32) fis[6] << 16)
1007 | ((u32) fis[8] << 24);
1008 cmd->lba_h = ((u16) fis[9])
1009 | ((u16) fis[10] << 8);
1010 cmd->count = ((u16) fis[12])
1011 | ((u16) fis[13] << 8);
1012
1013 dphex(cmd, sizeof(*cmd), "ahci_execute_ata_pp(): cmd after completion:\n");
1014
1015 /* signal completion to interrupt handler */
1016 add_workspace(iorb)->complete = 1;
1017}
1018
1019/******************************************************************************
1020 * Request sense information for a failed command. Since there is no "request
1021 * sense" command for ATA devices, we need to read the current error code from
1022 * the AHCI task file register and fabricate the sense information.
1023 *
1024 * NOTES:
1025 *
1026 * - This function must be called right after an ATA command has failed and
1027 * before any other commands are queued on the corresponding port. This
1028 * function is typically called in the port restart context hook which is
1029 * triggered by an AHCI error interrupt.
1030 *
1031 * - The ATA error bits are a complete mess. We'll try and catch the most
1032 * interesting error codes (such as medium errors) and report everything
1033 * else with a generic error code.
1034 */
1035int ata_req_sense(IORBH _far *iorb, int slot)
1036{
1037 AD_INFO *ai = ad_infos + iorb_unit_adapter(iorb);
1038 u8 _far *port_mmio = port_base(ai, iorb_unit_port(iorb));
1039 u32 tf_data = readl(port_mmio + PORT_TFDATA);
1040 u8 err = (u8) (tf_data >> 8);
1041 u8 sts = (u8) (tf_data);
1042
1043 if (sts & ATA_ERR) {
1044 if (sts & ATA_DF) {
1045 /* there is a device-specific error condition */
1046 if (err & ATA_ICRC) {
1047 iorb_seterr(iorb, IOERR_ADAPTER_DEVICEBUSCHECK);
1048 } else if (err & ATA_UNC) {
1049 iorb_seterr(iorb, IOERR_MEDIA);
1050 } else if (err & ATA_IDNF) {
1051 iorb_seterr(iorb, IOERR_RBA_ADDRESSING_ERROR);
1052 } else {
1053 iorb_seterr(iorb, IOERR_DEVICE_NONSPECIFIC);
1054 }
1055
1056 } else {
1057 iorb_seterr(iorb, IOERR_DEVICE_NONSPECIFIC);
1058 }
1059 } else {
1060 /* this function only gets called when we received an error interrupt */
1061 iorb_seterr(iorb, IOERR_DEVICE_NONSPECIFIC);
1062 }
1063
1064 /* Return an error to indicate there's no HW command to be submitted and
1065 * that the IORB can be completed "as is" (the upstream code expects the
1066 * IORB error code, if any, to be set when this happens and this is exactly
1067 * what this function is all about).
1068 */
1069 return(-1);
1070}
1071
1072/******************************************************************************
1073 * Extract vendor and device name from an ATA INDENTIFY buffer. Since strings
1074 * in the indentify buffer are byte-swapped, we need to swap them back.
1075 */
1076char *ata_dev_name(u16 *id_buf)
1077{
1078 static char dev_name[ATA_ID_PROD_LEN + 1];
1079 char *t = dev_name;
1080 char *s = (char *) (id_buf + ATA_ID_PROD);
1081 int i;
1082
1083 dev_name[sizeof(dev_name)-1] = '\0';
1084
1085 for (i = 0; i < ATA_ID_PROD_LEN / 2; i++) {
1086 *(t++) = s[1];
1087 *(t++) = s[0];
1088 s += 2;
1089 }
1090
1091 return(dev_name);
1092}
1093
1094/******************************************************************************
1095 * Fabricate ATA READ command based on the capabilities of the corresponding
1096 * device and the paramters set from above (NCQ, etc).
1097 */
1098static int ata_cmd_read(IORBH _far *iorb, AD_INFO *ai, int p, int d, int slot,
1099 ULONG sector, ULONG count, SCATGATENTRY _far *sg_list,
1100 ULONG sg_cnt)
1101{
1102 int rc;
1103
1104 if (sector >= (1UL << 28) || count > 256 || add_workspace(iorb)->is_ncq) {
1105 /* need LBA48 for this command */
1106 if (!ai->ports[p].devs[d].lba48) {
1107 iorb_seterr(iorb, IOERR_RBA_LIMIT);
1108 return(-1);
1109 }
1110 if (add_workspace(iorb)->is_ncq) {
1111 /* use NCQ read; count goes into feature register, tag into count! */
1112 rc = ata_cmd(ai, p, d, slot, ATA_CMD_FPDMA_READ,
1113 AP_SECTOR_48, (u32) sector, (u16) 0,
1114 AP_FEATURES, (u16) count,
1115 AP_COUNT, (u16) (slot << 3), /* tag == slot */
1116 AP_SGLIST, sg_list, (u16) sg_cnt,
1117 AP_DEVICE, 0x40,
1118 AP_END);
1119 } else {
1120 rc = ata_cmd(ai, p, d, slot, ATA_CMD_READ_EXT,
1121 AP_SECTOR_48, (u32) sector, (u16) 0,
1122 AP_COUNT, (u16) count,
1123 AP_SGLIST, sg_list, (u16) sg_cnt,
1124 AP_DEVICE, 0x40,
1125 AP_END);
1126 }
1127
1128 } else {
1129 rc = ata_cmd(ai, p, d, slot, ATA_CMD_READ,
1130 AP_SECTOR_28, (u32) sector,
1131 AP_COUNT, (u16) count & 0xffU,
1132 AP_SGLIST, sg_list, (u16) sg_cnt,
1133 AP_DEVICE, 0x40,
1134 AP_END);
1135 }
1136
1137 return(rc);
1138}
1139
1140/******************************************************************************
1141 * Fabricate ATA WRITE command based on the capabilities of the corresponding
1142 * device and the paramters set from above (NCQ, etc)
1143 */
1144static int ata_cmd_write(IORBH _far *iorb, AD_INFO *ai, int p, int d, int slot,
1145 ULONG sector, ULONG count, SCATGATENTRY _far *sg_list,
1146 ULONG sg_cnt, int write_through)
1147{
1148 int rc;
1149
1150 if (sector >= (1UL << 28) || count > 256 || add_workspace(iorb)->is_ncq) {
1151 /* need LBA48 for this command */
1152 if (!ai->ports[p].devs[d].lba48) {
1153 iorb_seterr(iorb, IOERR_RBA_LIMIT);
1154 return(-1);
1155 }
1156 if (add_workspace(iorb)->is_ncq) {
1157 /* use NCQ write; count goes into feature register, tag into count! */
1158 rc = ata_cmd(ai, p, d, slot, ATA_CMD_FPDMA_WRITE,
1159 AP_SECTOR_48, (u32) sector, (u16) 0,
1160 AP_FEATURES, (u16) count,
1161 /* tag = slot */
1162 AP_COUNT, (u16) (slot << 3),
1163 AP_SGLIST, sg_list, (u16) sg_cnt,
1164 AP_DEVICE, 0x40,
1165 /* force unit access */
1166 AP_DEVICE, (write_through && !force_write_cache) ? 0x80 : 0,
1167 AP_WRITE, 1,
1168 AP_END);
1169 } else {
1170 rc = ata_cmd(ai, p, d, slot, ATA_CMD_WRITE_EXT,
1171 AP_SECTOR_48, (u32) sector, (u16) 0,
1172 AP_COUNT, (u16) count,
1173 AP_SGLIST, sg_list, (u16) sg_cnt,
1174 AP_DEVICE, 0x40,
1175 AP_WRITE, 1,
1176 AP_END);
1177 }
1178
1179 } else {
1180 rc = ata_cmd(ai, p, d, slot, ATA_CMD_WRITE,
1181 AP_SECTOR_28, (u32) sector,
1182 AP_COUNT, (u16) count & 0xffU,
1183 AP_SGLIST, sg_list, (u16) sg_cnt,
1184 AP_DEVICE, 0x40,
1185 AP_WRITE, 1,
1186 AP_END);
1187 }
1188
1189 return(rc);
1190}
Note: See TracBrowser for help on using the repository browser.