1 /*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21
22 /*
23 * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
24 * Use is subject to license terms.
25 */
26
27 #include <sys/types.h>
28 #include <sys/dkio.h>
29 #include <sys/cdio.h>
30 #include <sys/file.h>
31
32 #include "ata_common.h"
33 #include "ata_disk.h"
34
35 /*
36 * this typedef really should be in dktp/cmpkt.h
37 */
38 typedef struct cmpkt cmpkt_t;
39
40
41 /*
42 * DADA entry points
43 */
44
45 static int ata_disk_abort(opaque_t ctl_data, cmpkt_t *pktp);
46 static int ata_disk_reset(opaque_t ctl_data, int level);
47 static int ata_disk_ioctl(opaque_t ctl_data, int cmd, intptr_t a, int flag);
48 static cmpkt_t *ata_disk_pktalloc(opaque_t ctl_data, int (*callback)(caddr_t),
49 caddr_t arg);
50 static void ata_disk_pktfree(opaque_t ctl_data, cmpkt_t *pktp);
51 static cmpkt_t *ata_disk_memsetup(opaque_t ctl_data, cmpkt_t *pktp,
52 struct buf *bp, int (*callback)(caddr_t), caddr_t arg);
53 static void ata_disk_memfree(opaque_t ctl_data, cmpkt_t *pktp);
54 static cmpkt_t *ata_disk_iosetup(opaque_t ctl_data, cmpkt_t *pktp);
55 static int ata_disk_transport(opaque_t ctl_data, cmpkt_t *pktp);
56
57 /*
58 * DADA packet callbacks
59 */
60
61 static void ata_disk_complete(ata_drv_t *ata_drvp, ata_pkt_t *ata_pktp,
62 int do_callback);
63 static int ata_disk_intr(ata_ctl_t *ata_ctlp, ata_drv_t *ata_drvp,
64 ata_pkt_t *ata_pktp);
65 static int ata_disk_intr_dma(ata_ctl_t *ata_ctlp, ata_drv_t *ata_drvp,
66 ata_pkt_t *ata_pktp);
67 static int ata_disk_intr_pio_in(ata_ctl_t *ata_ctlp, ata_drv_t *ata_drvp,
68 ata_pkt_t *ata_pktp);
69 static int ata_disk_intr_pio_out(ata_ctl_t *ata_ctlp, ata_drv_t *ata_drvp,
70 ata_pkt_t *ata_pktp);
71 static int ata_disk_start(ata_ctl_t *ata_ctlp, ata_drv_t *ata_drvp,
72 ata_pkt_t *ata_pktp);
73 static int ata_disk_start_dma_in(ata_ctl_t *ata_ctlp, ata_drv_t *ata_drvp,
74 ata_pkt_t *ata_pktp);
75 static int ata_disk_start_dma_out(ata_ctl_t *ata_ctlp, ata_drv_t *ata_drvp,
76 ata_pkt_t *ata_pktp);
77 static int ata_disk_start_pio_in(ata_ctl_t *ata_ctlp, ata_drv_t *ata_drvp,
78 ata_pkt_t *ata_pktp);
79 static int ata_disk_start_pio_out(ata_ctl_t *ata_ctlp, ata_drv_t *ata_drvp,
80 ata_pkt_t *ata_pktp);
81
82 /*
83 * Local Function prototypes
84 */
85
86 static int ata_disk_eject(ata_ctl_t *ata_ctlp, ata_drv_t *ata_drvp,
87 ata_pkt_t *ata_pktp);
88 static void ata_disk_fake_inquiry(ata_drv_t *ata_drvp);
89 static void ata_disk_get_resid(ata_ctl_t *ata_ctlp, ata_drv_t *ata_drvp,
90 ata_pkt_t *ata_pktp);
91 static int ata_disk_initialize_device_parameters(ata_ctl_t *ata_ctlp,
92 ata_drv_t *ata_drvp);
93 static int ata_disk_lock(ata_ctl_t *ata_ctlp, ata_drv_t *ata_drvp,
94 ata_pkt_t *ata_pktp);
95 static int ata_disk_set_multiple(ata_ctl_t *ata_ctlp, ata_drv_t *ata_drvp);
96 static void ata_disk_pio_xfer_data_in(ata_ctl_t *ata_ctlp, ata_pkt_t *ata_pktp);
97 static void ata_disk_pio_xfer_data_out(ata_ctl_t *ata_ctlp,
98 ata_pkt_t *ata_pktp);
99 static void ata_disk_set_standby_timer(ata_ctl_t *ata_ctlp,
100 ata_drv_t *ata_drvp);
101 static int ata_disk_recalibrate(ata_ctl_t *ata_ctlp, ata_drv_t *ata_drvp,
102 ata_pkt_t *ata_pktp);
103 static int ata_disk_standby(ata_ctl_t *ata_ctlp, ata_drv_t *ata_drvp,
104 ata_pkt_t *ata_pktp);
105 static int ata_disk_start_common(ata_ctl_t *ata_ctlp, ata_drv_t *ata_drvp,
106 ata_pkt_t *ata_pktp);
107 static int ata_disk_state(ata_ctl_t *ata_ctlp, ata_drv_t *ata_drvp,
108 ata_pkt_t *ata_pktp);
109 static int ata_disk_unlock(ata_ctl_t *ata_ctlp, ata_drv_t *ata_drvp,
110 ata_pkt_t *ata_pktp);
111 static int ata_get_capacity(ata_drv_t *ata_drvp, uint64_t *capacity);
112 static void ata_fix_large_disk_geometry(ata_drv_t *ata_drvp);
113 static uint64_t ata_calculate_28bits_capacity(ata_drv_t *ata_drvp);
114 static uint64_t ata_calculate_48bits_capacity(ata_drv_t *ata_drvp);
115 static int ata_copy_dk_ioc_string(intptr_t arg, char *source, int length,
116 int flag);
117 static void ata_set_write_cache(ata_ctl_t *ata_ctlp, ata_drv_t *ata_drvp);
118 static int ata_disk_update_fw(gtgt_t *gtgtp, ata_ctl_t *ata_ctlp,
119 ata_drv_t *ata_drvp, caddr_t fwfile, uint_t size,
120 uint8_t type, int flag);
121 static int ata_disk_set_feature_spinup(ata_ctl_t *ata_ctlp,
122 ata_drv_t *ata_drvp, ata_pkt_t *ata_pktp);
123 static int ata_disk_id_update(ata_ctl_t *ata_ctlp,
124 ata_drv_t *ata_drvp, ata_pkt_t *ata_pktp);
125
126
127 /*
128 * Local static data
129 */
130
131 uint_t ata_disk_init_dev_parm_wait = 4 * 1000000;
132 uint_t ata_disk_set_mult_wait = 4 * 1000000;
133 int ata_disk_do_standby_timer = TRUE;
134
135 /* timeout value for device update firmware */
136 int ata_disk_updatefw_time = 60;
137
138 /*
139 * ata_write_cache == 1 force write cache on.
140 * ata_write_cache == 0 do not modify write cache. firmware defaults kept.
141 * ata_write_cache == -1 force write cache off.
142 */
143 int ata_write_cache = 1;
144
145
146 static struct ctl_objops ata_disk_objops = {
147 ata_disk_pktalloc,
148 ata_disk_pktfree,
149 ata_disk_memsetup,
150 ata_disk_memfree,
151 ata_disk_iosetup,
152 ata_disk_transport,
153 ata_disk_reset,
154 ata_disk_abort,
155 nulldev,
156 nulldev,
157 ata_disk_ioctl,
158 0, 0
159 };
160
161
162
163 /*
164 *
165 * initialize the ata_disk sub-system
166 *
167 */
168
169 /*ARGSUSED*/
170 int
ata_disk_attach(ata_ctl_t * ata_ctlp)171 ata_disk_attach(
172 ata_ctl_t *ata_ctlp)
173 {
174 ADBG_TRACE(("ata_disk_init entered\n"));
175 return (TRUE);
176 }
177
178
179
180 /*
181 *
182 * destroy the ata_disk sub-system
183 *
184 */
185
186 /*ARGSUSED*/
187 void
ata_disk_detach(ata_ctl_t * ata_ctlp)188 ata_disk_detach(
189 ata_ctl_t *ata_ctlp)
190 {
191 ADBG_TRACE(("ata_disk_destroy entered\n"));
192 }
193
194
195 /*
196 * Test whether the disk can support Logical Block Addressing
197 */
198
199 int
ata_test_lba_support(struct ata_id * aidp)200 ata_test_lba_support(struct ata_id *aidp)
201 {
202 #ifdef __old_version__
203 /*
204 * determine if the drive supports LBA mode
205 */
206 if (aidp->ai_cap & ATAC_LBA_SUPPORT)
207 return (TRUE);
208 #else
209 /*
210 * Determine if the drive supports LBA mode
211 * LBA mode is mandatory on ATA-3 (or newer) drives but is
212 * optional on ATA-2 (or older) drives. On ATA-2 drives
213 * the ai_majorversion word should be 0xffff or 0x0000
214 * (version not reported).
215 */
216 if (aidp->ai_majorversion != 0xffff &&
217 aidp->ai_majorversion >= (1 << 3)) {
218 /* ATA-3 or better */
219 return (TRUE);
220 } else if (aidp->ai_cap & ATAC_LBA_SUPPORT) {
221 /* ATA-2 LBA capability bit set */
222 return (TRUE);
223 } else {
224 return (FALSE);
225 }
226 #endif
227 }
228
229 /*
230 * ATA-6 drives do not provide geometry information, so words
231 * ai_heads, ai_sectors and ai_fixcyls may not be valid
232 */
233 static void
ata_fixup_ata6_geometry(struct ata_id * aidp)234 ata_fixup_ata6_geometry(struct ata_id *aidp)
235 {
236 /* check cylinders, heads, and sectors for valid values */
237 if (aidp->ai_heads != 0 && aidp->ai_heads != 0xffff &&
238 aidp->ai_sectors != 0 && aidp->ai_sectors != 0xffff &&
239 aidp->ai_fixcyls != 0)
240 return; /* assume valid geometry - do nothing */
241
242 /*
243 * Pre-set standard geometry values - they are not necessarily
244 * optimal for a given capacity
245 */
246 aidp->ai_heads = 0x10;
247 aidp->ai_sectors = 0x3f;
248 aidp->ai_fixcyls = 1;
249 /*
250 * The fixcyls value will get fixed up later in
251 * ata_fix_large_disk_geometry.
252 */
253 }
254
255 /*
256 *
257 * initialize the soft-structure for an ATA (non-PACKET) drive and
258 * then configure the drive with the correct modes and options.
259 *
260 */
261
262 int
ata_disk_init_drive(ata_drv_t * ata_drvp)263 ata_disk_init_drive(
264 ata_drv_t *ata_drvp)
265 {
266 ata_ctl_t *ata_ctlp = ata_drvp->ad_ctlp;
267 struct ata_id *aidp = &ata_drvp->ad_id;
268 struct ctl_obj *ctlobjp;
269 struct scsi_device *devp;
270 int len;
271 int val;
272 int mode;
273 short *chs;
274 char buf[80];
275
276 ADBG_TRACE(("ata_disk_init_drive entered\n"));
277
278 /* ATA disks don't support LUNs */
279
280 if (ata_drvp->ad_lun != 0)
281 return (FALSE);
282
283 /*
284 * set up drive structure
285 * ATA-6 drives do not provide geometry information, so words
286 * ai_heads, ai_sectors and ai_fixcyls may not be valid - they
287 * will be fixed later
288 */
289
290 ata_drvp->ad_phhd = aidp->ai_heads;
291 ata_drvp->ad_phsec = aidp->ai_sectors;
292 ata_drvp->ad_drvrhd = aidp->ai_heads;
293 ata_drvp->ad_drvrsec = aidp->ai_sectors;
294 ata_drvp->ad_drvrcyl = aidp->ai_fixcyls;
295 ata_drvp->ad_acyl = 0;
296
297 if (ata_test_lba_support(&ata_drvp->ad_id))
298 ata_drvp->ad_drive_bits |= ATDH_LBA;
299
300 /* Get capacity and check for 48-bit mode */
301 mode = ata_get_capacity(ata_drvp, &ata_drvp->ad_capacity);
302 if (mode == AD_EXT48) {
303 ata_drvp->ad_flags |= AD_EXT48;
304 }
305
306 /* straighten out the geometry */
307 (void) sprintf(buf, "SUNW-ata-%p-d%d-chs", (void *) ata_ctlp->ac_data,
308 ata_drvp->ad_targ+1);
309 if (ddi_getlongprop(DDI_DEV_T_ANY, ddi_root_node(), 0,
310 buf, (caddr_t)&chs, &len) == DDI_PROP_SUCCESS) {
311 /*
312 * if the number of sectors and heads in bios matches the
313 * physical geometry, then so should the number of cylinders
314 * this is to prevent the 1023 limit in the older bios's
315 * causing loss of space.
316 */
317 if (chs[1] == (ata_drvp->ad_drvrhd - 1) &&
318 chs[2] == ata_drvp->ad_drvrsec)
319 /* Set chs[0] to zero-based number of cylinders. */
320 chs[0] = aidp->ai_fixcyls - 1;
321 else if (!(ata_drvp->ad_drive_bits & ATDH_LBA)) {
322 /*
323 * if the the sector/heads do not match that of the
324 * bios and the drive does not support LBA. We go ahead
325 * and advertise the bios geometry but use the physical
326 * geometry for sector translation.
327 */
328 cmn_err(CE_WARN, "!Disk 0x%p,%d: BIOS geometry "
329 "different from physical, and no LBA support.",
330 (void *)ata_ctlp->ac_data, ata_drvp->ad_targ);
331 }
332
333 /*
334 * chs[0,1] are zero-based; make them one-based.
335 */
336 ata_drvp->ad_drvrcyl = chs[0] + 1;
337 ata_drvp->ad_drvrhd = chs[1] + 1;
338 ata_drvp->ad_drvrsec = chs[2];
339 kmem_free(chs, len);
340 } else {
341 /*
342 * Property not present; this means that boot.bin has
343 * determined that the drive supports Int13 LBA. Note
344 * this, but just return a geometry with a large
345 * cylinder count; this will be the signal for dadk to
346 * fail DKIOCG_VIRTGEOM.
347 * ad_drvr* are already set; just recalculate ad_drvrcyl
348 * from capacity.
349 */
350
351 ata_drvp->ad_flags |= AD_INT13LBA;
352 if (ata_drvp->ad_capacity != 0) {
353 ata_drvp->ad_drvrcyl = ata_drvp->ad_capacity /
354 (ata_drvp->ad_drvrhd * ata_drvp->ad_drvrsec);
355 } else {
356 /*
357 * Something's wrong; return something sure to
358 * fail the "cyls < 1024" test. This will
359 * never make it out of the DKIOCG_VIRTGEOM
360 * call, so its total bogosity won't matter.
361 */
362 ata_drvp->ad_drvrcyl = 1025;
363 ata_drvp->ad_drvrhd = 1;
364 ata_drvp->ad_drvrsec = 1;
365 }
366 }
367
368 /* fix geometry for disks > 31GB, if needed */
369 ata_fix_large_disk_geometry(ata_drvp);
370
371 /*
372 * set up the scsi_device and ctl_obj structures
373 */
374 devp = kmem_zalloc(scsi_device_size(), KM_SLEEP);
375 ata_drvp->ad_device = devp;
376 ctlobjp = &ata_drvp->ad_ctl_obj;
377
378 devp->sd_inq = &ata_drvp->ad_inquiry;
379 devp->sd_address.a_hba_tran = (scsi_hba_tran_t *)ctlobjp;
380 devp->sd_address.a_target = (ushort_t)ata_drvp->ad_targ;
381 devp->sd_address.a_lun = (uchar_t)ata_drvp->ad_lun;
382 mutex_init(&devp->sd_mutex, NULL, MUTEX_DRIVER, NULL);
383 ata_drvp->ad_flags |= AD_MUTEX_INIT;
384
385 /*
386 * DADA ops vectors and cookie
387 */
388 ctlobjp->c_ops = (struct ctl_objops *)&ata_disk_objops;
389
390 /*
391 * this is filled in with gtgtp by ata_disk_bus_ctl(INITCHILD)
392 */
393 ctlobjp->c_data = NULL;
394
395 ctlobjp->c_ext = &(ctlobjp->c_extblk);
396 ctlobjp->c_extblk.c_ctldip = ata_ctlp->ac_dip;
397 ctlobjp->c_extblk.c_targ = ata_drvp->ad_targ;
398 ctlobjp->c_extblk.c_blksz = NBPSCTR;
399
400 /*
401 * Get highest block factor supported by the drive.
402 * Some drives report 0 if read/write multiple not supported,
403 * adjust their blocking factor to 1.
404 */
405 ata_drvp->ad_block_factor = aidp->ai_mult1 & 0xff;
406
407 /*
408 * If a block factor property exists, use the smaller of the
409 * property value and the highest value the drive can support.
410 */
411 (void) sprintf(buf, "drive%d_block_factor", ata_drvp->ad_targ);
412 val = ddi_prop_get_int(DDI_DEV_T_ANY, ata_ctlp->ac_dip, 0, buf,
413 ata_drvp->ad_block_factor);
414
415 ata_drvp->ad_block_factor = (short)min(val, ata_drvp->ad_block_factor);
416
417 if (ata_drvp->ad_block_factor == 0)
418 ata_drvp->ad_block_factor = 1;
419
420 if (!ata_disk_setup_parms(ata_ctlp, ata_drvp)) {
421 ata_drvp->ad_device = NULL;
422 kmem_free(devp, scsi_device_size());
423 return (FALSE);
424 }
425
426 ata_disk_fake_inquiry(ata_drvp);
427
428 return (TRUE);
429 }
430
431 /*
432 * Test if a disk supports 48-bit (extended mode) addressing and
433 * get disk capacity.
434 * Return value:
435 * AD_EXT48 if 48-bit mode is available, 0 otherwise,
436 * capacity in sectors.
437 * There are several indicators for 48-bit addressing. If any of
438 * them is missing, assume 28-bit (non-extended) addressing.
439 */
440
441 static int
ata_get_capacity(ata_drv_t * ata_drvp,uint64_t * capacity)442 ata_get_capacity(ata_drv_t *ata_drvp, uint64_t *capacity)
443 {
444 struct ata_id *aidp = &ata_drvp->ad_id;
445 uint64_t cap28; /* capacity in 28-bit mode */
446 uint64_t cap48; /* capacity in 48-bit mode */
447
448 /*
449 * First compute capacity in 28-bit mode, using 28-bit capacity
450 * words in IDENTIFY DEVICE response words
451 */
452 cap28 = ata_calculate_28bits_capacity(ata_drvp);
453 *capacity = cap28;
454
455 if (!IS_ATA_VERSION_SUPPORTED(aidp, 6) &&
456 !(ata_drvp->ad_flags & AD_BLLBA48))
457 return (0);
458
459 /* Check that 48 bit addressing is supported & enabled */
460 /* words 83 and 86 */
461 if (!(aidp->ai_cmdset83 & ATACS_EXT48))
462 return (0);
463 if (!(aidp->ai_features86 & ATACS_EXT48))
464 return (0);
465
466 /*
467 * Drive supports ATA-6. Since ATA-6 drives may not provide
468 * geometry info, pre-set standard geometry values
469 */
470 ata_fixup_ata6_geometry(aidp);
471
472 /* Compute 48-bit capacity */
473 cap48 = ata_calculate_48bits_capacity(ata_drvp);
474
475 /*
476 * If capacity is smaller then the maximum capacity addressable
477 * in 28-bit mode, just use 28-bit capacity value.
478 * We will use 28-bit addressing read/write commands.
479 */
480 if (cap48 <= MAX_28BIT_CAPACITY)
481 return (0);
482
483 /*
484 * Capacity is too big for 28-bits addressing. But, to make
485 * sure that the drive implements ATA-6 correctly, the
486 * final check: cap28 should be MAX for 28-bit addressing.
487 * If it's not, we shouldn't use 48-bit mode, so return
488 * the capacity reported in 28-bit capacity words.
489 */
490 if (cap28 != MAX_28BIT_CAPACITY)
491 return (0); /* not max, use 28-bit value */
492
493 /*
494 * All is well so return 48-bit capacity indicator
495 */
496 ADBG_INIT(("ATA: using 48-bit mode for capacity %llx blocks\n",
497 (unsigned long long)cap48));
498
499 *capacity = cap48;
500 return (AD_EXT48);
501 }
502
503 /*
504 * With the advent of disks that hold more than 31 GB, we run into a
505 * limitation in the sizes of the fields that describe the geometry.
506 * The cylinders, heads, and sectors-per-track are each described by a
507 * 16-bit number -- both in the structure returned from IDENTIFY
508 * DEVICE and in the structure returned from the DIOCTL_GETGEOM or
509 * DIOCTL_GETPHYGEOM ioctl.
510 *
511 * The typical disk has 32 heads per cylinder and 63 sectors per
512 * track. A 16 bit field can contain up to 65535. So the largest
513 * disk that can be described in these fields is 65535 * 32 * 63 * 512
514 * (bytes/sector), or about 31.5 GB. The cylinder count gets truncated
515 * when stored in a narrow field, so a 40GB disk appears to have only
516 * 8 GB!
517 *
518 * The solution (for the time being at least) is to lie about the
519 * geometry. If the number of cylinders is too large to fit in 16
520 * bits, we will halve the cylinders and double the heads, repeating
521 * until we can fit the geometry into 3 shorts.
522 * FUTURE ENHANCEMENT: If this ever isn't enough, we could
523 * add another step to double sectors/track as well.
524 */
525
526 static void
ata_fix_large_disk_geometry(ata_drv_t * ata_drvp)527 ata_fix_large_disk_geometry(
528 ata_drv_t *ata_drvp)
529 {
530 struct ata_id *aidp = &ata_drvp->ad_id;
531
532 /* no hope for large disks if LBA not supported */
533 if (!(ata_drvp->ad_drive_bits & ATDH_LBA))
534 return;
535
536 /*
537 * Fix up the geometry to be returned by DIOCTL_GETGEOM.
538 * If number of cylinders > USHRT_MAX, double heads and
539 * halve cylinders until everything fits.
540 */
541 while (ata_drvp->ad_drvrcyl > USHRT_MAX) {
542 int tempheads;
543
544 /* is there room in 16 bits to double the heads? */
545 tempheads = 2 * ata_drvp->ad_drvrhd;
546 if (tempheads > USHRT_MAX) {
547 /*
548 * No room to double the heads.
549 * I give up, there's no way to represent this.
550 * Limit disk size.
551 */
552 cmn_err(CE_WARN,
553 "Disk is too large: "
554 "Model %s, Serial# %s "
555 "Approximating...\n",
556 aidp->ai_model, aidp->ai_drvser);
557 ata_drvp->ad_drvrcyl = USHRT_MAX;
558 break;
559 }
560
561 /* OK, so double the heads and halve the cylinders */
562 ata_drvp->ad_drvrcyl /= 2;
563 ata_drvp->ad_drvrhd *= 2;
564 }
565 }
566
567 /*
568 * Calculate capacity using 28-bit capacity words from IDENTIFY DEVICE
569 * return words
570 */
571 uint64_t
ata_calculate_28bits_capacity(ata_drv_t * ata_drvp)572 ata_calculate_28bits_capacity(ata_drv_t *ata_drvp)
573 {
574 /*
575 * Asked x3t13 for advice; this implements Hale Landis'
576 * response, minus the "use ATA_INIT_DEVPARMS".
577 * See "capacity.notes".
578 */
579
580 /* some local shorthand/renaming to clarify the meaning */
581
582 ushort_t curcyls_w54, curhds_w55, cursect_w56;
583 uint32_t curcap_w57_58;
584
585 if ((ata_drvp->ad_drive_bits & ATDH_LBA) != 0) {
586 return ((uint64_t)(ata_drvp->ad_id.ai_addrsec[0] +
587 ata_drvp->ad_id.ai_addrsec[1] * 0x10000));
588 }
589
590 /*
591 * If we're not LBA, then first try to validate "current" values.
592 */
593
594 curcyls_w54 = ata_drvp->ad_id.ai_curcyls;
595 curhds_w55 = ata_drvp->ad_id.ai_curheads;
596 cursect_w56 = ata_drvp->ad_id.ai_cursectrk;
597 curcap_w57_58 = ata_drvp->ad_id.ai_cursccp[0] +
598 ata_drvp->ad_id.ai_cursccp[1] * 0x10000;
599
600 if (((ata_drvp->ad_id.ai_validinfo & 1) == 1) &&
601 (curhds_w55 >= 1) && (curhds_w55 <= 16) &&
602 (cursect_w56 >= 1) && (cursect_w56 <= 63) &&
603 (curcap_w57_58 == curcyls_w54 * curhds_w55 * cursect_w56)) {
604 return ((uint64_t)curcap_w57_58);
605 }
606
607 /*
608 * At this point, Hale recommends ATA_INIT_DEVPARMS.
609 * I don't want to do that, so simply use 1/3/6 as
610 * a final fallback, and continue to assume the BIOS
611 * has done whatever INIT_DEVPARMS are necessary.
612 */
613
614 return ((uint64_t)(ata_drvp->ad_id.ai_fixcyls *
615 ata_drvp->ad_id.ai_heads * ata_drvp->ad_id.ai_sectors));
616 }
617
618 /*
619 * Calculate capacity using 48-bits capacity words from IDENTIFY DEVICE
620 * return words
621 */
622 uint64_t
ata_calculate_48bits_capacity(ata_drv_t * ata_drvp)623 ata_calculate_48bits_capacity(ata_drv_t *ata_drvp)
624 {
625 uint64_t cap48 = 0;
626 int i;
627
628 for (i = 3; i >= 0; --i) {
629 cap48 <<= 16;
630 cap48 += ata_drvp->ad_id.ai_addrsecxt[i];
631 }
632 return (cap48);
633 }
634
635
636 /*
637 *
638 * Setup the drives Read/Write Multiple Blocking factor and the
639 * current translation geometry. Necessary during attach and after
640 * Software Resets.
641 *
642 */
643
644 int
ata_disk_setup_parms(ata_ctl_t * ata_ctlp,ata_drv_t * ata_drvp)645 ata_disk_setup_parms(
646 ata_ctl_t *ata_ctlp,
647 ata_drv_t *ata_drvp)
648 {
649
650 /*
651 * program geometry info back to the drive
652 */
653 if (!ata_disk_initialize_device_parameters(ata_ctlp, ata_drvp)) {
654 return (FALSE);
655 }
656
657 /*
658 * Determine the blocking factor
659 */
660 if (ata_drvp->ad_block_factor > 1) {
661 /*
662 * Program the block factor into the drive. If this
663 * fails, then go back to using a block size of 1.
664 */
665 if (!ata_disk_set_multiple(ata_ctlp, ata_drvp))
666 ata_drvp->ad_block_factor = 1;
667 }
668
669
670 if (ata_drvp->ad_block_factor > 1) {
671 ata_drvp->ad_rd_cmd = ATC_RDMULT;
672 ata_drvp->ad_wr_cmd = ATC_WRMULT;
673 } else {
674 ata_drvp->ad_rd_cmd = ATC_RDSEC;
675 ata_drvp->ad_wr_cmd = ATC_WRSEC;
676 }
677
678 ata_drvp->ad_bytes_per_block = ata_drvp->ad_block_factor << SCTRSHFT;
679
680 ADBG_INIT(("set block factor for drive %d to %d\n",
681 ata_drvp->ad_targ, ata_drvp->ad_block_factor));
682
683 if (ata_disk_do_standby_timer)
684 ata_disk_set_standby_timer(ata_ctlp, ata_drvp);
685
686 ata_set_write_cache(ata_ctlp, ata_drvp);
687
688 return (TRUE);
689 }
690
691
692 /*
693 * Take the timeout value specified in the "standby" property
694 * and convert from seconds to the magic parm expected by the
695 * the drive. Then issue the IDLE command to set the drive's
696 * internal standby timer.
697 */
698
699 static void
ata_disk_set_standby_timer(ata_ctl_t * ata_ctlp,ata_drv_t * ata_drvp)700 ata_disk_set_standby_timer(
701 ata_ctl_t *ata_ctlp,
702 ata_drv_t *ata_drvp)
703 {
704 uchar_t parm;
705 int timeout = ata_ctlp->ac_standby_time;
706
707 /*
708 * take the timeout value, specificed in seconds, and
709 * encode it into the proper command parm
710 */
711
712 /*
713 * don't change it if no property specified or if
714 * the specified value is out of range
715 */
716 if (timeout < 0 || timeout > (12 * 60 * 60))
717 return;
718
719 /* 1 to 1200 seconds (20 minutes) == N * 5 seconds */
720 if (timeout <= (240 * 5))
721 parm = (timeout + 4) / 5;
722
723 /* 20 to 21 minutes == 21 minutes */
724 else if (timeout <= (21 * 60))
725 parm = 252;
726
727 /* 21 minutes to 21 minutes 15 seconds == 21:15 */
728 else if (timeout <= ((21 * 60) + 15))
729 parm = 255;
730
731 /* 21:15 to 330 minutes == N * 30 minutes */
732 else if (timeout <= (11 * 30 * 60))
733 parm = 240 + ((timeout + (30 * 60) - 1)/ (30 * 60));
734
735 /* > 330 minutes == 8 to 12 hours */
736 else
737 parm = 253;
738
739 (void) ata_command(ata_ctlp, ata_drvp, TRUE, FALSE, 5 * 1000000,
740 ATC_IDLE, 0, parm, 0, 0, 0, 0);
741 }
742
743
744
745 /*
746 *
747 * destroy an ata disk drive
748 *
749 */
750
751 void
ata_disk_uninit_drive(ata_drv_t * ata_drvp)752 ata_disk_uninit_drive(
753 ata_drv_t *ata_drvp)
754 {
755 struct scsi_device *devp = ata_drvp->ad_device;
756
757 ADBG_TRACE(("ata_disk_uninit_drive entered\n"));
758
759 if (devp) {
760 if (ata_drvp->ad_flags & AD_MUTEX_INIT)
761 mutex_destroy(&devp->sd_mutex);
762 ata_drvp->ad_device = NULL;
763 kmem_free(devp, scsi_device_size());
764 }
765 }
766
767
768
769
770 /*
771 *
772 * DADA compliant bus_ctl entry point
773 *
774 */
775
776 /*ARGSUSED*/
777 int
ata_disk_bus_ctl(dev_info_t * d,dev_info_t * r,ddi_ctl_enum_t o,void * a,void * v)778 ata_disk_bus_ctl(
779 dev_info_t *d,
780 dev_info_t *r,
781 ddi_ctl_enum_t o,
782 void *a,
783 void *v)
784 {
785 ADBG_TRACE(("ata_disk_bus_ctl entered\n"));
786
787 switch (o) {
788
789 case DDI_CTLOPS_REPORTDEV:
790 {
791 int targ;
792
793 targ = ddi_prop_get_int(DDI_DEV_T_ANY, r, DDI_PROP_DONTPASS,
794 "target", 0);
795 cmn_err(CE_CONT, "?%s%d at %s%d target %d lun %d\n",
796 ddi_driver_name(r), ddi_get_instance(r),
797 ddi_driver_name(d), ddi_get_instance(d), targ, 0);
798 return (DDI_SUCCESS);
799 }
800 case DDI_CTLOPS_INITCHILD:
801 {
802 dev_info_t *cdip = (dev_info_t *)a;
803 ata_drv_t *ata_drvp;
804 ata_ctl_t *ata_ctlp;
805 ata_tgt_t *ata_tgtp;
806 struct scsi_device *devp;
807 struct ctl_obj *ctlobjp;
808 gtgt_t *gtgtp;
809 char name[MAXNAMELEN];
810
811 /*
812 * save time by picking up ptr to drive struct left
813 * by ata_bus_ctl - isn't that convenient.
814 */
815 ata_drvp = ddi_get_driver_private(cdip);
816 ata_ctlp = ata_drvp->ad_ctlp;
817
818 /* set up pointers to child dip */
819
820 devp = ata_drvp->ad_device;
821 /*
822 * If sd_dev is set, it means that the target has already
823 * being initialized. The cdip is a duplicate node from
824 * reexpansion of driver.conf. Fail INITCHILD here.
825 */
826 if ((devp == NULL) || (devp->sd_dev != NULL)) {
827 return (DDI_FAILURE);
828 }
829 devp->sd_dev = cdip;
830
831 ctlobjp = &ata_drvp->ad_ctl_obj;
832 ctlobjp->c_extblk.c_devdip = cdip;
833
834 /*
835 * Create the "ata" property for use by the target driver
836 */
837 if (!ata_prop_create(cdip, ata_drvp, "ata")) {
838 return (DDI_FAILURE);
839 }
840
841 gtgtp = ghd_target_init(d, cdip, &ata_ctlp->ac_ccc,
842 sizeof (ata_tgt_t), ata_ctlp,
843 ata_drvp->ad_targ,
844 ata_drvp->ad_lun);
845
846 /* gt_tgt_private points to ata_tgt_t */
847 ata_tgtp = GTGTP2ATATGTP(gtgtp);
848 ata_tgtp->at_drvp = ata_drvp;
849 ata_tgtp->at_dma_attr = ata_pciide_dma_attr;
850 ata_tgtp->at_dma_attr.dma_attr_maxxfer =
851 ata_ctlp->ac_max_transfer << SCTRSHFT;
852
853 /* gtgtp is the opaque arg to all my entry points */
854 ctlobjp->c_data = gtgtp;
855
856 /* create device name */
857
858 (void) sprintf(name, "%x,%x", ata_drvp->ad_targ,
859 ata_drvp->ad_lun);
860 ddi_set_name_addr(cdip, name);
861 ddi_set_driver_private(cdip, devp);
862
863 return (DDI_SUCCESS);
864 }
865
866 case DDI_CTLOPS_UNINITCHILD:
867 {
868 dev_info_t *cdip = (dev_info_t *)a;
869 struct scsi_device *devp;
870 struct ctl_obj *ctlobjp;
871 gtgt_t *gtgtp;
872
873 devp = ddi_get_driver_private(cdip);
874 ctlobjp = (struct ctl_obj *)devp->sd_address.a_hba_tran;
875 gtgtp = ctlobjp->c_data;
876
877 ghd_target_free(d, cdip, >GTP2ATAP(gtgtp)->ac_ccc, gtgtp);
878
879 ddi_set_driver_private(cdip, NULL);
880 ddi_set_name_addr(cdip, NULL);
881 return (DDI_SUCCESS);
882 }
883
884 default:
885 return (DDI_FAILURE);
886 }
887 }
888
889
890 /*
891 *
892 * DADA abort entry point - not currently used by dadk
893 *
894 */
895
896 /* ARGSUSED */
897 static int
ata_disk_abort(opaque_t ctl_data,cmpkt_t * pktp)898 ata_disk_abort(opaque_t ctl_data, cmpkt_t *pktp)
899 {
900 ADBG_TRACE(("ata_disk_abort entered\n"));
901
902 /* XXX - Note that this interface is currently not used by dadk */
903
904 /*
905 * GHD abort functions take a pointer to a scsi_address
906 * and so they're unusable here. The ata driver used to
907 * return DDI_SUCCESS here without doing anything. Its
908 * seems that DDI_FAILURE is more appropriate.
909 */
910
911 return (DDI_FAILURE);
912 }
913
914
915
916 /*
917 *
918 * DADA reset entry point - not currently used by dadk
919 * (except in debug versions of driver)
920 *
921 */
922
923 /* ARGSUSED */
924 static int
ata_disk_reset(opaque_t ctl_data,int level)925 ata_disk_reset(opaque_t ctl_data, int level)
926 {
927 gtgt_t *gtgtp = (gtgt_t *)ctl_data;
928 ata_drv_t *ata_drvp = GTGTP2ATADRVP(gtgtp);
929 int rc;
930
931 ADBG_TRACE(("ata_disk_reset entered\n"));
932
933 /* XXX - Note that this interface is currently not used by dadk */
934
935 if (level == RESET_TARGET) {
936 rc = ghd_tran_reset_target(&ata_drvp->ad_ctlp->ac_ccc, gtgtp,
937 NULL);
938 } else if (level == RESET_ALL) {
939 rc = ghd_tran_reset_bus(&ata_drvp->ad_ctlp->ac_ccc, gtgtp,
940 NULL);
941 }
942
943 return (rc ? DDI_SUCCESS : DDI_FAILURE);
944 }
945
946
947
948 /*
949 *
950 * DADA ioctl entry point
951 *
952 */
953
954 /* ARGSUSED */
955 static int
ata_disk_ioctl(opaque_t ctl_data,int cmd,intptr_t arg,int flag)956 ata_disk_ioctl(opaque_t ctl_data, int cmd, intptr_t arg, int flag)
957 {
958 gtgt_t *gtgtp = (gtgt_t *)ctl_data;
959 ata_ctl_t *ata_ctlp = GTGTP2ATAP(gtgtp);
960 ata_drv_t *ata_drvp = GTGTP2ATADRVP(gtgtp);
961 int rc, rc2;
962 struct tgdk_geom tgdk;
963 int wce;
964 struct ata_id *aidp = &ata_drvp->ad_id;
965 dk_updatefw_t updatefw;
966 #ifdef _MULTI_DATAMODEL
967 dk_updatefw_32_t updatefw32;
968 #endif
969 dk_disk_id_t dk_disk_id;
970 char buf[80];
971 int i;
972
973
974 ADBG_TRACE(("ata_disk_ioctl entered, cmd = %d\n", cmd));
975
976 switch (cmd) {
977
978 case DIOCTL_GETGEOM:
979 case DIOCTL_GETPHYGEOM:
980 tgdk.g_cyl = ata_drvp->ad_drvrcyl;
981 tgdk.g_head = ata_drvp->ad_drvrhd;
982 tgdk.g_sec = ata_drvp->ad_drvrsec;
983 tgdk.g_acyl = ata_drvp->ad_acyl;
984 tgdk.g_secsiz = 512;
985 tgdk.g_cap = (diskaddr_t)tgdk.g_cyl * tgdk.g_head * tgdk.g_sec;
986 if (ddi_copyout(&tgdk, (caddr_t)arg, sizeof (tgdk), flag))
987 return (EFAULT);
988 return (0);
989
990 case DCMD_UPDATE_GEOM:
991 /* ??? fix this to issue IDENTIFY DEVICE ??? */
992 /* might not be necessary since I don't know of any ATA/IDE that */
993 /* can change its geometry. On the other hand, ATAPI devices like the */
994 /* LS-120 or PD/CD can change their geometry when new media is inserted */
995 return (0);
996
997 /* copy the model number into the caller's buffer */
998 case DIOCTL_GETMODEL:
999 rc = ata_copy_dk_ioc_string(arg, aidp->ai_model,
1000 sizeof (aidp->ai_model), flag);
1001 return (rc);
1002
1003 /* copy the serial number into the caller's buffer */
1004 case DIOCTL_GETSERIAL:
1005 rc = ata_copy_dk_ioc_string(arg, aidp->ai_drvser,
1006 sizeof (aidp->ai_drvser),
1007 flag);
1008 return (rc);
1009
1010 case DIOCTL_GETWCE:
1011 /*
1012 * WCE is only supported in ATAPI-4 or higher, for
1013 * lower rev devices, must assume write cache is
1014 * enabled.
1015 * NOTE: Since there is currently no Solaris mechanism
1016 * to change the state of the Write Cache Enable feature,
1017 * this code just checks the value of the WCE bit
1018 * obtained at device init time. If a mechanism
1019 * is added to the driver to change WCE, this code
1020 * must be updated appropriately.
1021 */
1022 wce = (aidp->ai_majorversion == 0xffff) ||
1023 ((aidp->ai_majorversion & ATAC_MAJVER_4) == 0) ||
1024 (aidp->ai_features85 & ATAC_FEATURES85_WCE) != 0;
1025
1026 if (ddi_copyout(&wce, (caddr_t)arg, sizeof (wce), flag) != 0)
1027 return (EFAULT);
1028
1029 return (0);
1030
1031 case DCMD_GET_STATE:
1032 rc = ata_queue_cmd(ata_disk_state, NULL, ata_ctlp, ata_drvp,
1033 gtgtp);
1034 break;
1035
1036 case DCMD_LOCK:
1037 case DKIOCLOCK:
1038 rc = ata_queue_cmd(ata_disk_lock, NULL, ata_ctlp, ata_drvp,
1039 gtgtp);
1040 break;
1041
1042 case DCMD_UNLOCK:
1043 case DKIOCUNLOCK:
1044 rc = ata_queue_cmd(ata_disk_unlock, NULL, ata_ctlp, ata_drvp,
1045 gtgtp);
1046 break;
1047
1048 case DCMD_START_MOTOR:
1049 case CDROMSTART:
1050 rc = ata_queue_cmd(ata_disk_recalibrate, NULL, ata_ctlp,
1051 ata_drvp, gtgtp);
1052 break;
1053
1054 case DCMD_STOP_MOTOR:
1055 case CDROMSTOP:
1056 rc = ata_queue_cmd(ata_disk_standby, NULL, ata_ctlp, ata_drvp,
1057 gtgtp);
1058 break;
1059
1060 case DKIOCEJECT:
1061 case CDROMEJECT:
1062 rc = ata_queue_cmd(ata_disk_eject, NULL, ata_ctlp, ata_drvp,
1063 gtgtp);
1064 break;
1065
1066 case DKIOC_UPDATEFW:
1067
1068 /*
1069 * Call DOWNLOAD MICROCODE command to update device
1070 * firmware.
1071 *
1072 * return value:
1073 * normal 0 Download microcode success
1074 * error EFAULT Bad address
1075 * ENXIO No such device or address
1076 * EINVAL Invalid argument
1077 * ENOMEM Not enough core
1078 * ENOTSUP Operation not supported
1079 * EIO I/O error
1080 * EPERM Not owner
1081 */
1082
1083 /*
1084 * The following code deals with handling 32-bit request
1085 * in 64-bit kernel.
1086 */
1087 #ifdef _MULTI_DATAMODEL
1088 if (ddi_model_convert_from(flag & FMODELS) ==
1089 DDI_MODEL_ILP32) {
1090 if (ddi_copyin((void *)arg, &updatefw32,
1091 sizeof (dk_updatefw_32_t), flag))
1092 return (EFAULT);
1093
1094 updatefw.dku_ptrbuf =
1095 (caddr_t)(uintptr_t)updatefw32.dku_ptrbuf;
1096 updatefw.dku_size = updatefw32.dku_size;
1097 updatefw.dku_type = updatefw32.dku_type;
1098 } else {
1099 if (ddi_copyin((void *)arg, &updatefw,
1100 sizeof (dk_updatefw_t), flag))
1101 return (EFAULT);
1102 }
1103 #else
1104 if (ddi_copyin((void *)arg, &updatefw,
1105 sizeof (dk_updatefw_t), flag))
1106 return (EFAULT);
1107 #endif
1108 rc = ata_disk_update_fw(gtgtp, ata_ctlp, ata_drvp,
1109 updatefw.dku_ptrbuf, updatefw.dku_size,
1110 updatefw.dku_type, flag);
1111
1112 /*
1113 * According to ATA8-ACS spec, the new microcode should
1114 * become effective immediately after the transfer of the
1115 * last data segment has completed, so here we will call
1116 * IDENTIFY DEVICE command immediately to update
1117 * ata_id content when success.
1118 */
1119 if (rc == 0) {
1120 rc2 = ata_queue_cmd(ata_disk_id_update, NULL,
1121 ata_ctlp, ata_drvp, gtgtp);
1122 if (rc2 != TRUE) {
1123 return (ENXIO);
1124 } else {
1125 /*
1126 * Check whether the content of the IDENTIFY
1127 * DEVICE data is incomplete, if yes, it's
1128 * because the device supports the Power-up
1129 * in Standby feature set, and we will first
1130 * check word 2, and then decide whether need
1131 * to call set feature to spin-up the device,
1132 * and then call IDENTIFY DEVICE command again.
1133 */
1134 aidp = &ata_drvp->ad_id;
1135 if (aidp->ai_config & ATA_ID_INCMPT) {
1136 if (aidp->ai_resv0 == 0x37c8 ||
1137 aidp->ai_resv0 == 0x738c) {
1138 /* Spin-up the device */
1139 (void) ata_queue_cmd(
1140 ata_disk_set_feature_spinup,
1141 NULL,
1142 ata_ctlp,
1143 ata_drvp,
1144 gtgtp);
1145 }
1146
1147 /* Try to update ata_id again */
1148 rc2 = ata_queue_cmd(
1149 ata_disk_id_update,
1150 NULL,
1151 ata_ctlp,
1152 ata_drvp,
1153 gtgtp);
1154 if (rc2 != TRUE) {
1155 return (ENXIO);
1156 } else {
1157 aidp = &ata_drvp->ad_id;
1158 if (aidp->ai_config &
1159 ATA_ID_INCMPT)
1160 return (ENXIO);
1161 }
1162 }
1163
1164 /*
1165 * Dump the drive information.
1166 */
1167 ATAPRT(("?\tUpdate firmware of %s device at "
1168 "targ %d, lun %d lastlun 0x%x\n",
1169 (ATAPIDRV(ata_drvp) ? "ATAPI":"IDE"),
1170 ata_drvp->ad_targ, ata_drvp->ad_lun,
1171 aidp->ai_lastlun));
1172
1173 (void) strncpy(buf, aidp->ai_model,
1174 sizeof (aidp->ai_model));
1175 buf[sizeof (aidp->ai_model)] = '\0';
1176 for (i = sizeof (aidp->ai_model) - 1;
1177 buf[i] == ' '; i--)
1178 buf[i] = '\0';
1179 ATAPRT(("?\tmodel %s\n", buf));
1180
1181 (void) strncpy(buf, aidp->ai_fw,
1182 sizeof (aidp->ai_fw));
1183 buf[sizeof (aidp->ai_fw)] = '\0';
1184 for (i = sizeof (aidp->ai_fw) - 1;
1185 buf[i] == ' '; i--)
1186 buf[i] = '\0';
1187 ATAPRT(("?\tfw %s\n", buf));
1188 }
1189 }
1190 return (rc);
1191
1192 case DKIOC_GETDISKID:
1193 bzero(&dk_disk_id, sizeof (dk_disk_id_t));
1194
1195 dk_disk_id.dkd_dtype = DKD_ATA_TYPE;
1196
1197 /* Get the model number */
1198 (void) strncpy(dk_disk_id.disk_id.ata_disk_id.dkd_amodel,
1199 aidp->ai_model, sizeof (aidp->ai_model));
1200
1201 /* Get the firmware revision */
1202 (void) strncpy(dk_disk_id.disk_id.ata_disk_id.dkd_afwver,
1203 aidp->ai_fw, sizeof (aidp->ai_fw));
1204
1205 /* Get the serial number */
1206 (void) strncpy(dk_disk_id.disk_id.ata_disk_id.dkd_aserial,
1207 aidp->ai_drvser, sizeof (aidp->ai_drvser));
1208
1209 if (ddi_copyout(&dk_disk_id, (void *)arg,
1210 sizeof (dk_disk_id_t), flag))
1211 return (EFAULT);
1212 else
1213 return (0);
1214
1215 default:
1216 ADBG_WARN(("ata_disk_ioctl: unsupported cmd 0x%x\n", cmd));
1217 return (ENOTTY);
1218 }
1219
1220 if (rc)
1221 return (0);
1222 return (ENXIO);
1223
1224 }
1225
1226
1227 #ifdef ___not___used___
1228 /*
1229 * Issue an ATA command to the drive using the packet already
1230 * allocated by the target driver
1231 */
1232
1233 int
ata_disk_do_ioctl(int (* func)(ata_ctl_t *,ata_drv_t *,ata_pkt_t *),void * arg,ata_ctl_t * ata_ctlp,gtgt_t * gtgtp,cmpkt_t * pktp)1234 ata_disk_do_ioctl(
1235 int (*func)(ata_ctl_t *, ata_drv_t *, ata_pkt_t *),
1236 void *arg,
1237 ata_ctl_t *ata_ctlp,
1238 gtgt_t *gtgtp,
1239 cmpkt_t *pktp)
1240 {
1241 gcmd_t *gcmdp = CPKT2GCMD(pktp);
1242 ata_pkt_t *ata_pktp = GCMD2APKT(gcmdp);
1243 int rc;
1244
1245 ata_pktp->ap_start = func;
1246 ata_pktp->ap_intr = NULL;
1247 ata_pktp->ap_complete = NULL;
1248 ata_pktp->ap_v_addr = (caddr_t)arg;
1249
1250 /*
1251 * add it to the queue, when it gets to the front the
1252 * ap_start function is called.
1253 */
1254 rc = ghd_transport(&ata_ctlp->ac_ccc, gcmdp, gcmdp->cmd_gtgtp,
1255 0, TRUE, NULL);
1256
1257 if (rc != TRAN_ACCEPT) {
1258 /* this should never, ever happen */
1259 return (ENXIO);
1260 }
1261
1262 if (ata_pktp->ap_flags & AP_ERROR)
1263 return (ENXIO);
1264 return (0);
1265 }
1266 #endif
1267
1268
1269
1270 /*
1271 *
1272 * DADA pktalloc entry point
1273 *
1274 */
1275
1276 /* ARGSUSED */
1277 static cmpkt_t *
ata_disk_pktalloc(opaque_t ctl_data,int (* callback)(caddr_t),caddr_t arg)1278 ata_disk_pktalloc(opaque_t ctl_data, int (*callback)(caddr_t), caddr_t arg)
1279 {
1280 gtgt_t *gtgtp = (gtgt_t *)ctl_data;
1281 ata_drv_t *ata_drvp = GTGTP2ATADRVP(gtgtp);
1282 cmpkt_t *pktp;
1283 ata_pkt_t *ata_pktp;
1284 gcmd_t *gcmdp;
1285
1286 ADBG_TRACE(("ata_disk_pktalloc entered\n"));
1287
1288 /*
1289 * Allocate and init the GHD gcmd_t structure and the
1290 * DADA cmpkt and the ata_pkt
1291 */
1292 if ((gcmdp = ghd_gcmd_alloc(gtgtp,
1293 (sizeof (cmpkt_t) + sizeof (ata_pkt_t)),
1294 (callback == DDI_DMA_SLEEP))) == NULL) {
1295 return ((cmpkt_t *)NULL);
1296 }
1297 ASSERT(gcmdp != NULL);
1298
1299 ata_pktp = GCMD2APKT(gcmdp);
1300 ASSERT(ata_pktp != NULL);
1301
1302 pktp = (cmpkt_t *)(ata_pktp + 1);
1303
1304 pktp->cp_ctl_private = (void *)gcmdp;
1305 ata_pktp->ap_gcmdp = gcmdp;
1306 gcmdp->cmd_pktp = (void *)pktp;
1307
1308 /*
1309 * At this point the structures are linked like this:
1310 *
1311 * (struct cmpkt) <--> (struct gcmd) <--> (struct ata_pkt)
1312 */
1313
1314 /* callback functions */
1315
1316 ata_pktp->ap_start = ata_disk_start;
1317 ata_pktp->ap_intr = ata_disk_intr;
1318 ata_pktp->ap_complete = ata_disk_complete;
1319
1320 /* other ata_pkt setup */
1321
1322 ata_pktp->ap_bytes_per_block = ata_drvp->ad_bytes_per_block;
1323
1324 /* cmpkt setup */
1325
1326 pktp->cp_cdblen = 1;
1327 pktp->cp_cdbp = (opaque_t)&ata_pktp->ap_cdb;
1328 pktp->cp_scbp = (opaque_t)&ata_pktp->ap_scb;
1329 pktp->cp_scblen = 1;
1330
1331 return (pktp);
1332 }
1333
1334
1335
1336 /*
1337 *
1338 * DADA pktfree entry point
1339 *
1340 */
1341
1342 /* ARGSUSED */
1343 static void
ata_disk_pktfree(opaque_t ctl_data,cmpkt_t * pktp)1344 ata_disk_pktfree(opaque_t ctl_data, cmpkt_t *pktp)
1345 {
1346 ata_pkt_t *ata_pktp = CPKT2APKT(pktp);
1347
1348 ADBG_TRACE(("ata_disk_pktfree entered\n"));
1349
1350 /* check not free already */
1351
1352 ASSERT(!(ata_pktp->ap_flags & AP_FREE));
1353 ata_pktp->ap_flags = AP_FREE;
1354
1355 ghd_gcmd_free(CPKT2GCMD(pktp));
1356 }
1357
1358
1359 /*
1360 *
1361 * DADA memsetup entry point
1362 *
1363 */
1364
1365 /* ARGSUSED */
1366 static cmpkt_t *
ata_disk_memsetup(opaque_t ctl_data,cmpkt_t * pktp,struct buf * bp,int (* callback)(caddr_t),caddr_t arg)1367 ata_disk_memsetup(
1368 opaque_t ctl_data,
1369 cmpkt_t *pktp,
1370 struct buf *bp,
1371 int (*callback)(caddr_t),
1372 caddr_t arg)
1373 {
1374 gtgt_t *gtgtp = (gtgt_t *)ctl_data;
1375 ata_pkt_t *ata_pktp = CPKT2APKT(pktp);
1376 gcmd_t *gcmdp = APKT2GCMD(ata_pktp);
1377 int flags;
1378
1379 ADBG_TRACE(("ata_disk_memsetup entered\n"));
1380
1381 ata_pktp->ap_sg_cnt = 0;
1382
1383 if (bp->b_bcount == 0) {
1384 ata_pktp->ap_v_addr = NULL;
1385 return (pktp);
1386 }
1387
1388 if (GTGTP2ATADRVP(gtgtp)->ad_pciide_dma != ATA_DMA_ON)
1389 goto skip_dma_setup;
1390
1391 if (ata_dma_disabled)
1392 goto skip_dma_setup;
1393
1394 /*
1395 * The PCI-IDE DMA engine is brain-damaged and can't
1396 * DMA non-aligned buffers.
1397 */
1398 if (!(bp->b_flags & B_PAGEIO) &&
1399 ((uintptr_t)bp->b_un.b_addr) & PCIIDE_PRDE_ADDR_MASK) {
1400 goto skip_dma_setup;
1401 }
1402
1403 /*
1404 * It also insists that the byte count must be even.
1405 */
1406 if (bp->b_bcount & 1)
1407 goto skip_dma_setup;
1408
1409 /* check direction for data transfer */
1410 if (bp->b_flags & B_READ) {
1411 flags = DDI_DMA_READ | DDI_DMA_PARTIAL;
1412 } else {
1413 flags = DDI_DMA_WRITE | DDI_DMA_PARTIAL;
1414 }
1415
1416 /*
1417 * Bind the DMA handle to the buf
1418 */
1419 if (ghd_dma_buf_bind_attr(>GTP2ATAP(gtgtp)->ac_ccc, gcmdp, bp, flags,
1420 callback, arg, >GTP2ATATGTP(gtgtp)->at_dma_attr)) {
1421 ata_pktp->ap_v_addr = 0;
1422 return (pktp);
1423 }
1424
1425 skip_dma_setup:
1426 bp_mapin(bp);
1427 ata_pktp->ap_v_addr = bp->b_un.b_addr;
1428 return (pktp);
1429 }
1430
1431
1432
1433 /*
1434 *
1435 * DADA memfree entry point
1436 *
1437 */
1438
1439 /*
1440 * 1157317 sez that drivers shouldn't call bp_mapout(), as either
1441 * biodone() or biowait() will end up doing it, but after they
1442 * call bp->b_iodone(), which is a necessary sequence for
1443 * Online Disk Suite. However, the DDI group wants to rethink
1444 * bp_mapin()/bp_mapout() and how they should behave in the
1445 * presence of layered drivers, etc. For the moment, fix
1446 * the OLDS problem by removing the bp_mapout() call.
1447 */
1448
1449 #define BUG_1157317
1450
1451 /* ARGSUSED */
1452 static void
ata_disk_memfree(opaque_t ctl_data,cmpkt_t * pktp)1453 ata_disk_memfree(opaque_t ctl_data, cmpkt_t *pktp)
1454 {
1455 gcmd_t *gcmdp = CPKT2GCMD(pktp);
1456
1457 ADBG_TRACE(("ata_disk_memfree entered\n"));
1458
1459 if (gcmdp->cmd_dma_handle)
1460 ghd_dmafree_attr(gcmdp);
1461 #if !defined(BUG_1157317)
1462 else
1463 bp_mapout(pktp->cp_bp);
1464 #endif
1465 }
1466
1467
1468
1469 /*
1470 *
1471 * DADA iosetup entry point
1472 *
1473 */
1474
1475 static cmpkt_t *
ata_disk_iosetup(opaque_t ctl_data,cmpkt_t * pktp)1476 ata_disk_iosetup(opaque_t ctl_data, cmpkt_t *pktp)
1477 {
1478 gtgt_t *gtgtp = (gtgt_t *)ctl_data;
1479 ata_drv_t *ata_drvp = GTGTP2ATADRVP(gtgtp);
1480 ata_pkt_t *ata_pktp = CPKT2APKT(pktp);
1481 gcmd_t *gcmdp = APKT2GCMD(ata_pktp);
1482 uint_t sec_count;
1483 daddr_t start_sec;
1484 uint_t byte_count;
1485
1486 ADBG_TRACE(("ata_disk_iosetup entered\n"));
1487
1488 /*
1489 * Check for DCMD_FLUSH_CACHE (which does no I/O) and
1490 * just do basic setup.
1491 */
1492 if (pktp->cp_passthru == NULL &&
1493 ata_pktp->ap_cdb == DCMD_FLUSH_CACHE) {
1494 ata_pktp->ap_cmd = ATC_FLUSH_CACHE;
1495 ata_pktp->ap_flags = 0;
1496 ata_pktp->ap_count = 0;
1497 ata_pktp->ap_startsec = 0;
1498 ata_pktp->ap_sg_cnt = 0;
1499 ata_pktp->ap_pciide_dma = FALSE;
1500 return (pktp);
1501 }
1502
1503 /* check for error retry */
1504 if (ata_pktp->ap_flags & AP_ERROR) {
1505 /*
1506 * this is a temporary work-around for dadk calling
1507 * iosetup for retry. The correct
1508 * solution is changing dadk to not to call iosetup
1509 * for a retry.
1510 * We do not apply the work-around for pio mode since
1511 * that does not involve moving dma windows and reducing the
1512 * sector count would work for pio mode on a retry
1513 * for now.
1514 */
1515 if (gcmdp->cmd_dma_handle != NULL) {
1516 ata_pktp->ap_flags = 0;
1517 return (NULL);
1518 }
1519
1520 ata_pktp->ap_bytes_per_block = NBPSCTR;
1521 sec_count = 1;
1522
1523 /*
1524 * Since we are retrying the last read or write operation,
1525 * restore the old values of the ap_v_addr and ap_resid.
1526 * This assumes CTL_IOSETUP is called again on retry; if not,
1527 * this needs to be done in CTL_TRANSPORT.
1528 */
1529 if (ata_pktp->ap_flags & (AP_READ | AP_WRITE)) {
1530 ata_pktp->ap_v_addr = ata_pktp->ap_v_addr_sav;
1531 ata_pktp->ap_resid = ata_pktp->ap_resid_sav;
1532 }
1533 } else {
1534 /*
1535 * Limit request to ac_max_transfer sectors.
1536 * The value is specified by the user in the
1537 * max_transfer property. It must be in the range 1 to 256.
1538 * When max_transfer is 0x100 it is bigger than 8 bits.
1539 * The spec says 0 represents 256 so it should be OK.
1540 */
1541 sec_count = min((pktp->cp_bytexfer >> SCTRSHFT),
1542 ata_drvp->ad_ctlp->ac_max_transfer);
1543 /*
1544 * Save the current values of ap_v_addr and ap_resid
1545 * in case a retry operation happens. During a retry
1546 * operation we need to restore these values.
1547 */
1548 ata_pktp->ap_v_addr_sav = ata_pktp->ap_v_addr;
1549 ata_pktp->ap_resid_sav = ata_pktp->ap_resid;
1550 }
1551
1552 /* reset flags */
1553 ata_pktp->ap_flags = 0;
1554
1555 #ifdef DADKIO_RWCMD_READ
1556 start_sec = pktp->cp_passthru ? RWCMDP(pktp)->blkaddr : pktp->cp_srtsec;
1557 #else
1558 start_sec = pktp->cp_srtsec;
1559 #endif
1560
1561 /*
1562 * Setup the PCIDE Bus Master Scatter/Gather list
1563 */
1564 ata_pktp->ap_sg_cnt = 0;
1565 ata_pktp->ap_pciide_dma = FALSE;
1566 if (gcmdp->cmd_dma_handle != NULL && sec_count != 0) {
1567 byte_count = sec_count << SCTRSHFT;
1568 if ((ghd_dmaget_attr(>GTP2ATAP(gtgtp)->ac_ccc, gcmdp,
1569 byte_count, ATA_DMA_NSEGS, &byte_count) == FALSE) ||
1570 (byte_count == 0)) {
1571 ADBG_ERROR(("ata_disk_iosetup: byte count zero\n"));
1572 return (NULL);
1573 }
1574 sec_count = byte_count >> SCTRSHFT;
1575 }
1576
1577 /*
1578 * In the non-48-bit mode addressing (CHS and LBA28) the sector
1579 * count is a 8-bit value and the sector count 0 represents 256
1580 * sectors.
1581 * In the extended addressing (LBA48) the sector count is a 16-bit
1582 * value, so max_transfer 0x100 cannot be truncated to 8-bits
1583 * because this would represent a zero sector count.
1584 */
1585 ata_pktp->ap_count = (ushort_t)sec_count;
1586 if (!(ata_drvp->ad_flags & AD_EXT48)) {
1587 ata_pktp->ap_count &= 0xff;
1588 }
1589 ata_pktp->ap_startsec = start_sec;
1590
1591 #ifdef DADKIO_RWCMD_READ
1592 if (pktp->cp_passthru) {
1593 switch (RWCMDP(pktp)->cmd) {
1594 case DADKIO_RWCMD_READ:
1595 if (ata_pktp->ap_sg_cnt) {
1596 ata_pktp->ap_cmd = ATC_READ_DMA;
1597 ata_pktp->ap_pciide_dma = TRUE;
1598 ata_pktp->ap_start = ata_disk_start_dma_in;
1599 ata_pktp->ap_intr = ata_disk_intr_dma;
1600 } else {
1601 ata_pktp->ap_cmd = ATC_RDSEC;
1602 ata_pktp->ap_start = ata_disk_start_pio_in;
1603 ata_pktp->ap_intr = ata_disk_intr_pio_in;
1604 }
1605 ata_pktp->ap_flags |= AP_READ;
1606 break;
1607 case DADKIO_RWCMD_WRITE:
1608 if (ata_pktp->ap_sg_cnt) {
1609 ata_pktp->ap_cmd = ATC_WRITE_DMA;
1610 ata_pktp->ap_pciide_dma = TRUE;
1611 ata_pktp->ap_start = ata_disk_start_dma_out;
1612 ata_pktp->ap_intr = ata_disk_intr_dma;
1613 } else {
1614 ata_pktp->ap_cmd = ATC_WRSEC;
1615 ata_pktp->ap_start = ata_disk_start_pio_out;
1616 ata_pktp->ap_intr = ata_disk_intr_pio_out;
1617 }
1618 ata_pktp->ap_flags |= AP_WRITE;
1619 break;
1620 }
1621
1622 byte_count = RWCMDP(pktp)->buflen;
1623 pktp->cp_bytexfer = byte_count;
1624 pktp->cp_resid = byte_count;
1625 ata_pktp->ap_resid = byte_count;
1626
1627 /*
1628 * since we're not using READ/WRITE MULTIPLE, we
1629 * should set bytes_per_block to one sector
1630 * XXX- why wasn't this in the old driver??
1631 */
1632 ata_pktp->ap_bytes_per_block = NBPSCTR;
1633 } else
1634 #endif
1635 {
1636 byte_count = sec_count << SCTRSHFT;
1637 pktp->cp_bytexfer = byte_count;
1638 pktp->cp_resid = byte_count;
1639 ata_pktp->ap_resid = byte_count;
1640
1641 /* setup the task file registers */
1642
1643 switch (ata_pktp->ap_cdb) {
1644 case DCMD_READ:
1645 if (ata_pktp->ap_sg_cnt) {
1646 ata_pktp->ap_cmd = ATC_READ_DMA;
1647 ata_pktp->ap_pciide_dma = TRUE;
1648 ata_pktp->ap_start = ata_disk_start_dma_in;
1649 ata_pktp->ap_intr = ata_disk_intr_dma;
1650 } else {
1651 ata_pktp->ap_cmd = ata_drvp->ad_rd_cmd;
1652 ata_pktp->ap_start = ata_disk_start_pio_in;
1653 ata_pktp->ap_intr = ata_disk_intr_pio_in;
1654 }
1655 ata_pktp->ap_flags |= AP_READ;
1656 break;
1657
1658 case DCMD_WRITE:
1659 if (ata_pktp->ap_sg_cnt) {
1660 ata_pktp->ap_cmd = ATC_WRITE_DMA;
1661 ata_pktp->ap_pciide_dma = TRUE;
1662 ata_pktp->ap_start = ata_disk_start_dma_out;
1663 ata_pktp->ap_intr = ata_disk_intr_dma;
1664 } else {
1665 ata_pktp->ap_cmd = ata_drvp->ad_wr_cmd;
1666 ata_pktp->ap_start = ata_disk_start_pio_out;
1667 ata_pktp->ap_intr = ata_disk_intr_pio_out;
1668 }
1669 ata_pktp->ap_flags |= AP_WRITE;
1670 break;
1671
1672 default:
1673 ADBG_WARN(("ata_disk_iosetup: unknown command 0x%x\n",
1674 ata_pktp->ap_cdb));
1675 pktp = NULL;
1676 break;
1677 }
1678 }
1679
1680 /* If 48-bit mode is used, convert command to 48-bit mode cmd */
1681 if (pktp != NULL && ata_drvp->ad_flags & AD_EXT48) {
1682 switch (ata_pktp->ap_cmd) {
1683 case ATC_RDSEC:
1684 ata_pktp->ap_cmd = ATC_RDSEC_EXT;
1685 break;
1686 case ATC_WRSEC:
1687 ata_pktp->ap_cmd = ATC_WRSEC_EXT;
1688 break;
1689 case ATC_RDMULT:
1690 ata_pktp->ap_cmd = ATC_RDMULT_EXT;
1691 break;
1692 case ATC_WRMULT:
1693 ata_pktp->ap_cmd = ATC_WRMULT_EXT;
1694 break;
1695 case ATC_READ_DMA:
1696 ata_pktp->ap_cmd = ATC_RDDMA_EXT;
1697 break;
1698 case ATC_WRITE_DMA:
1699 ata_pktp->ap_cmd = ATC_WRDMA_EXT;
1700 break;
1701 }
1702 }
1703
1704 return (pktp);
1705 }
1706
1707
1708
1709 /*
1710 *
1711 * DADA transport entry point
1712 *
1713 */
1714
1715 static int
ata_disk_transport(opaque_t ctl_data,cmpkt_t * pktp)1716 ata_disk_transport(opaque_t ctl_data, cmpkt_t *pktp)
1717 {
1718 gtgt_t *gtgtp = (gtgt_t *)ctl_data;
1719 ata_drv_t *ata_drvp = GTGTP2ATADRVP(gtgtp);
1720 ata_ctl_t *ata_ctlp = ata_drvp->ad_ctlp;
1721 ata_pkt_t *ata_pktp = CPKT2APKT(pktp);
1722 int rc;
1723 int polled = FALSE;
1724
1725 ADBG_TRACE(("ata_disk_transport entered\n"));
1726
1727 /* check for polling pkt */
1728
1729 if (pktp->cp_flags & CPF_NOINTR) {
1730 polled = TRUE;
1731 }
1732
1733 /* call ghd transport routine */
1734
1735 rc = ghd_transport(&ata_ctlp->ac_ccc, APKT2GCMD(ata_pktp),
1736 gtgtp, pktp->cp_time, polled, NULL);
1737
1738 /* see if pkt was not accepted */
1739
1740 if (rc == TRAN_BUSY)
1741 return (CTL_SEND_BUSY);
1742
1743 if (rc == TRAN_ACCEPT)
1744 return (CTL_SEND_SUCCESS);
1745
1746 return (CTL_SEND_FAILURE);
1747 }
1748
1749
1750 /*
1751 *
1752 * routines to load the cylinder/head/sector/count
1753 * task file registers.
1754 *
1755 */
1756 static void
ata_disk_load_regs_lba28(ata_pkt_t * ata_pktp,ata_drv_t * ata_drvp)1757 ata_disk_load_regs_lba28(ata_pkt_t *ata_pktp, ata_drv_t *ata_drvp)
1758 {
1759 ata_ctl_t *ata_ctlp = ata_drvp->ad_ctlp;
1760 ddi_acc_handle_t io_hdl1 = ata_ctlp->ac_iohandle1;
1761 uint_t lba; /* LBA of first sector */
1762
1763 lba = ata_pktp->ap_startsec;
1764
1765 ddi_put8(io_hdl1, ata_ctlp->ac_count,
1766 ata_pktp->ap_count);
1767 ddi_put8(io_hdl1, ata_ctlp->ac_sect, lba);
1768 lba >>= 8;
1769 ddi_put8(io_hdl1, ata_ctlp->ac_lcyl, lba);
1770 lba >>= 8;
1771 ddi_put8(io_hdl1, ata_ctlp->ac_hcyl, lba);
1772 lba >>= 8;
1773 /*
1774 * dev/head register can use only 4 bits
1775 * must also include drive selector.
1776 */
1777 lba = (lba & 0xf) | ata_drvp->ad_drive_bits;
1778 ddi_put8(io_hdl1, ata_ctlp->ac_drvhd, lba);
1779 }
1780
1781 /*
1782 * In 48-bit extended mode, the sector count is 16 bits wide, and the
1783 * LBA is 48 bits wide, as follows:
1784 * register most recent previous
1785 * name value value
1786 * -------- ---------- ---------
1787 * sector cnt count(7:0) count(15:8)
1788 * sector num lba(7:0) lba(31:24)
1789 * cyl low lba(15:8) lba(39:32)
1790 * cyl hi lba(23:16) lba(47:40)
1791 * device/head 111D0000 N/A
1792 * ^ ^
1793 * | |
1794 * | +-- drive number
1795 * |
1796 * +-- indicates LBA
1797 * The other two 1 bits are historical and are not used in 48bit
1798 * extended mode.
1799 */
1800 /*
1801 * WARNING:
1802 * dada framework passes starting sector as daddr_t type, thus
1803 * limiting reachable disk space in 32-bit x86 architecture to 1 terabyte.
1804 * Therefore high 16 bits of the 48-bits address can be and
1805 * are currently ignored.
1806 */
1807 static void
ata_disk_load_regs_lba48(ata_pkt_t * ata_pktp,ata_drv_t * ata_drvp)1808 ata_disk_load_regs_lba48(ata_pkt_t *ata_pktp, ata_drv_t *ata_drvp)
1809 {
1810 ata_ctl_t *ata_ctlp = ata_drvp->ad_ctlp;
1811 ddi_acc_handle_t io_hdl1 = ata_ctlp->ac_iohandle1;
1812 uint16_t seccnt; /* 16-bit sector count */
1813 uint_t lbalow; /* low-order 24 bits of LBA */
1814 uint_t lbahi; /* high-order 24 bits of LBA */
1815
1816 seccnt = ata_pktp->ap_count;
1817 /* high-order 8 bits of lbalow never get used */
1818 lbalow = ata_pktp->ap_startsec;
1819 lbahi = ata_pktp->ap_startsec >> 24;
1820
1821 ddi_put8(io_hdl1, ata_ctlp->ac_count, seccnt >> 8);
1822 ddi_put8(io_hdl1, ata_ctlp->ac_count, seccnt);
1823 /* Send the high-order half first */
1824 ddi_put8(io_hdl1, ata_ctlp->ac_sect, lbahi);
1825 lbahi >>= 8;
1826 ddi_put8(io_hdl1, ata_ctlp->ac_lcyl, lbahi);
1827 lbahi >>= 8;
1828 ddi_put8(io_hdl1, ata_ctlp->ac_hcyl, lbahi);
1829 /* Send the low-order half */
1830 ddi_put8(io_hdl1, ata_ctlp->ac_sect, lbalow);
1831 lbalow >>= 8;
1832 ddi_put8(io_hdl1, ata_ctlp->ac_lcyl, lbalow);
1833 lbalow >>= 8;
1834 ddi_put8(io_hdl1, ata_ctlp->ac_hcyl, lbalow);
1835 ddi_put8(io_hdl1, ata_ctlp->ac_drvhd,
1836 ata_drvp->ad_drive_bits);
1837 }
1838
1839 static void
ata_disk_load_regs_chs(ata_pkt_t * ata_pktp,ata_drv_t * ata_drvp)1840 ata_disk_load_regs_chs(ata_pkt_t *ata_pktp, ata_drv_t *ata_drvp)
1841 {
1842 ata_ctl_t *ata_ctlp = ata_drvp->ad_ctlp;
1843 ddi_acc_handle_t io_hdl1 = ata_ctlp->ac_iohandle1;
1844 uint_t resid;
1845 uint_t cyl;
1846 uchar_t head;
1847 uchar_t drvheads;
1848 uchar_t drvsectors;
1849
1850 drvheads = ata_drvp->ad_phhd;
1851 drvsectors = ata_drvp->ad_phsec;
1852
1853 resid = ata_pktp->ap_startsec / drvsectors;
1854 head = (resid % drvheads) & 0xf;
1855 cyl = resid / drvheads;
1856 /* automatically truncate to char */
1857 ddi_put8(io_hdl1, ata_ctlp->ac_sect,
1858 (ata_pktp->ap_startsec % drvsectors) + 1);
1859 ddi_put8(io_hdl1, ata_ctlp->ac_count, ata_pktp->ap_count);
1860 ddi_put8(io_hdl1, ata_ctlp->ac_hcyl, (cyl >> 8));
1861 /* lcyl gets truncated to 8 bits */
1862 ddi_put8(io_hdl1, ata_ctlp->ac_lcyl, cyl);
1863 ddi_put8(io_hdl1, ata_ctlp->ac_drvhd,
1864 ata_drvp->ad_drive_bits | head);
1865 }
1866
1867
1868 /*
1869 *
1870 * packet start callback routines
1871 *
1872 */
1873
1874 /* ARGSUSED */
1875 static int
ata_disk_start_common(ata_ctl_t * ata_ctlp,ata_drv_t * ata_drvp,ata_pkt_t * ata_pktp)1876 ata_disk_start_common(
1877 ata_ctl_t *ata_ctlp,
1878 ata_drv_t *ata_drvp,
1879 ata_pkt_t *ata_pktp)
1880 {
1881 ddi_acc_handle_t io_hdl1 = ata_ctlp->ac_iohandle1;
1882 ddi_acc_handle_t io_hdl2 = ata_ctlp->ac_iohandle2;
1883
1884 ADBG_TRACE(("ata_disk_start_common entered\n"));
1885
1886 ADBG_TRANSPORT(("ata_disk_start:\tpkt = 0x%p, pkt flags = 0x%x\n",
1887 ata_pktp, ata_pktp->ap_flags));
1888 ADBG_TRANSPORT(("\tcommand=0x%x, sect=0x%lx\n",
1889 ata_pktp->ap_cmd, ata_pktp->ap_startsec));
1890 ADBG_TRANSPORT(("\tcount=0x%x, drvhd = 0x%x\n",
1891 ata_pktp->ap_count, ata_drvp->ad_drive_bits));
1892
1893 /*
1894 * If AC_BSY_WAIT is set, wait for controller to not be busy,
1895 * before issuing a command. If AC_BSY_WAIT is not set,
1896 * skip the wait. This is important for laptops that do
1897 * suspend/resume but do not correctly wait for the busy bit to
1898 * drop after a resume.
1899 *
1900 * NOTE: this test for ATS_BSY is also needed if/when we
1901 * implement the overlapped/queued command protocols. Currently,
1902 * the overlap/queued feature is not supported so the test is
1903 * conditional.
1904 */
1905 if (ata_ctlp->ac_timing_flags & AC_BSY_WAIT) {
1906 if (!ata_wait(io_hdl2, ata_ctlp->ac_ioaddr2,
1907 0, ATS_BSY, 5000000)) {
1908 ADBG_ERROR(("ata_disk_start: BUSY\n"));
1909 return (FALSE);
1910 }
1911 }
1912
1913 ddi_put8(io_hdl1, ata_ctlp->ac_drvhd, ata_drvp->ad_drive_bits);
1914 ata_nsecwait(400);
1915
1916 /*
1917 * make certain the drive selected
1918 */
1919 if (!ata_wait(io_hdl2, ata_ctlp->ac_ioaddr2,
1920 ATS_DRDY, ATS_BSY, 5 * 1000000)) {
1921 ADBG_ERROR(("ata_disk_start: select failed\n"));
1922 return (FALSE);
1923 }
1924
1925 if (ata_pktp->ap_cmd == ATC_LOAD_FW) {
1926
1927 /* the sector count is 16 bits wide */
1928 ddi_put8(io_hdl1, ata_ctlp->ac_count, ata_pktp->ap_count);
1929 ddi_put8(io_hdl1, ata_ctlp->ac_sect, ata_pktp->ap_count >> 8);
1930 ddi_put8(io_hdl1, ata_ctlp->ac_lcyl, ata_pktp->ap_startsec);
1931 ddi_put8(io_hdl1, ata_ctlp->ac_hcyl,
1932 ata_pktp->ap_startsec >> 8);
1933
1934 /* put subcommand for DOWNLOAD MICROCODE */
1935 ddi_put8(io_hdl1, ata_ctlp->ac_feature, ata_pktp->ap_bcount);
1936 } else {
1937
1938 /*
1939 * We use different methods for loading the task file
1940 * registers, depending on whether the disk
1941 * uses LBA or CHS addressing and whether 48-bit
1942 * extended addressing is to be used.
1943 */
1944 if (!(ata_drvp->ad_drive_bits & ATDH_LBA))
1945 ata_disk_load_regs_chs(ata_pktp, ata_drvp);
1946 else if (ata_drvp->ad_flags & AD_EXT48)
1947 ata_disk_load_regs_lba48(ata_pktp, ata_drvp);
1948 else
1949 ata_disk_load_regs_lba28(ata_pktp, ata_drvp);
1950 ddi_put8(io_hdl1, ata_ctlp->ac_feature, 0);
1951 }
1952
1953 /*
1954 * Always make certain interrupts are enabled. It's been reported
1955 * (but not confirmed) that some notebook computers don't
1956 * clear the interrupt disable bit after being resumed. The
1957 * easiest way to fix this is to always clear the disable bit
1958 * before every command.
1959 */
1960 ddi_put8(io_hdl2, ata_ctlp->ac_devctl, ATDC_D3);
1961 return (TRUE);
1962 }
1963
1964
1965 /*
1966 *
1967 * Start a non-data ATA command (not DMA and not PIO):
1968 *
1969 */
1970
1971 static int
ata_disk_start(ata_ctl_t * ata_ctlp,ata_drv_t * ata_drvp,ata_pkt_t * ata_pktp)1972 ata_disk_start(
1973 ata_ctl_t *ata_ctlp,
1974 ata_drv_t *ata_drvp,
1975 ata_pkt_t *ata_pktp)
1976 {
1977 ddi_acc_handle_t io_hdl1 = ata_ctlp->ac_iohandle1;
1978 int rc;
1979
1980 rc = ata_disk_start_common(ata_ctlp, ata_drvp, ata_pktp);
1981
1982 if (!rc)
1983 return (ATA_FSM_RC_BUSY);
1984
1985 /*
1986 * This next one sets the controller in motion
1987 */
1988 ddi_put8(io_hdl1, ata_ctlp->ac_cmd, ata_pktp->ap_cmd);
1989
1990 /* wait for the busy bit to settle */
1991 ata_nsecwait(400);
1992
1993 return (ATA_FSM_RC_OKAY);
1994 }
1995
1996
1997
1998 static int
ata_disk_start_dma_in(ata_ctl_t * ata_ctlp,ata_drv_t * ata_drvp,ata_pkt_t * ata_pktp)1999 ata_disk_start_dma_in(
2000 ata_ctl_t *ata_ctlp,
2001 ata_drv_t *ata_drvp,
2002 ata_pkt_t *ata_pktp)
2003 {
2004 ddi_acc_handle_t io_hdl1 = ata_ctlp->ac_iohandle1;
2005 int rc;
2006
2007 rc = ata_disk_start_common(ata_ctlp, ata_drvp, ata_pktp);
2008
2009 if (!rc)
2010 return (ATA_FSM_RC_BUSY);
2011
2012 /*
2013 * Copy the Scatter/Gather list to the controller's
2014 * Physical Region Descriptor Table
2015 */
2016 ata_pciide_dma_setup(ata_ctlp, ata_pktp->ap_sg_list,
2017 ata_pktp->ap_sg_cnt);
2018
2019 /*
2020 * reset the PCIIDE Controller's interrupt and error status bits
2021 */
2022 (void) ata_pciide_status_clear(ata_ctlp);
2023
2024 /*
2025 * This next one sets the drive in motion
2026 */
2027 ddi_put8(io_hdl1, ata_ctlp->ac_cmd, ata_pktp->ap_cmd);
2028
2029 /* wait for the drive's busy bit to settle */
2030 ata_nsecwait(400);
2031
2032 ata_pciide_dma_start(ata_ctlp, PCIIDE_BMICX_RWCON_WRITE_TO_MEMORY);
2033
2034 return (ATA_FSM_RC_OKAY);
2035 }
2036
2037
2038
2039 static int
ata_disk_start_dma_out(ata_ctl_t * ata_ctlp,ata_drv_t * ata_drvp,ata_pkt_t * ata_pktp)2040 ata_disk_start_dma_out(
2041 ata_ctl_t *ata_ctlp,
2042 ata_drv_t *ata_drvp,
2043 ata_pkt_t *ata_pktp)
2044 {
2045 ddi_acc_handle_t io_hdl1 = ata_ctlp->ac_iohandle1;
2046 int rc;
2047
2048 rc = ata_disk_start_common(ata_ctlp, ata_drvp, ata_pktp);
2049
2050 if (!rc)
2051 return (ATA_FSM_RC_BUSY);
2052
2053 /*
2054 * Copy the Scatter/Gather list to the controller's
2055 * Physical Region Descriptor Table
2056 */
2057 ata_pciide_dma_setup(ata_ctlp, ata_pktp->ap_sg_list,
2058 ata_pktp->ap_sg_cnt);
2059
2060 /*
2061 * reset the PCIIDE Controller's interrupt and error status bits
2062 */
2063 (void) ata_pciide_status_clear(ata_ctlp);
2064
2065 /*
2066 * This next one sets the drive in motion
2067 */
2068 ddi_put8(io_hdl1, ata_ctlp->ac_cmd, ata_pktp->ap_cmd);
2069
2070 /* wait for the drive's busy bit to settle */
2071 ata_nsecwait(400);
2072
2073 ata_pciide_dma_start(ata_ctlp, PCIIDE_BMICX_RWCON_READ_FROM_MEMORY);
2074
2075 return (ATA_FSM_RC_OKAY);
2076 }
2077
2078
2079
2080
2081
2082 /*
2083 *
2084 * Start a PIO data-in ATA command:
2085 *
2086 */
2087
2088 static int
ata_disk_start_pio_in(ata_ctl_t * ata_ctlp,ata_drv_t * ata_drvp,ata_pkt_t * ata_pktp)2089 ata_disk_start_pio_in(
2090 ata_ctl_t *ata_ctlp,
2091 ata_drv_t *ata_drvp,
2092 ata_pkt_t *ata_pktp)
2093 {
2094 ddi_acc_handle_t io_hdl1 = ata_ctlp->ac_iohandle1;
2095 int rc;
2096
2097 rc = ata_disk_start_common(ata_ctlp, ata_drvp, ata_pktp);
2098
2099 if (!rc)
2100 return (ATA_FSM_RC_BUSY);
2101 /*
2102 * This next one sets the controller in motion
2103 */
2104 ddi_put8(io_hdl1, ata_ctlp->ac_cmd, ata_pktp->ap_cmd);
2105
2106 /* wait for the busy bit to settle */
2107 ata_nsecwait(400);
2108
2109 return (ATA_FSM_RC_OKAY);
2110 }
2111
2112
2113
2114
2115 /*
2116 *
2117 * Start a PIO data-out ATA command:
2118 *
2119 */
2120
2121 static int
ata_disk_start_pio_out(ata_ctl_t * ata_ctlp,ata_drv_t * ata_drvp,ata_pkt_t * ata_pktp)2122 ata_disk_start_pio_out(
2123 ata_ctl_t *ata_ctlp,
2124 ata_drv_t *ata_drvp,
2125 ata_pkt_t *ata_pktp)
2126 {
2127 ddi_acc_handle_t io_hdl1 = ata_ctlp->ac_iohandle1;
2128 ddi_acc_handle_t io_hdl2 = ata_ctlp->ac_iohandle2;
2129 int rc;
2130
2131 ata_pktp->ap_wrt_count = 0;
2132
2133 rc = ata_disk_start_common(ata_ctlp, ata_drvp, ata_pktp);
2134
2135 if (!rc)
2136 return (ATA_FSM_RC_BUSY);
2137 /*
2138 * This next one sets the controller in motion
2139 */
2140 ddi_put8(io_hdl1, ata_ctlp->ac_cmd, ata_pktp->ap_cmd);
2141
2142 /* wait for the busy bit to settle */
2143 ata_nsecwait(400);
2144
2145 /*
2146 * Wait for the drive to assert DRQ to send the first chunk
2147 * of data. Have to busy wait because there's no interrupt for
2148 * the first chunk. This sucks (a lot of cycles) if the
2149 * drive responds too slowly or if the wait loop granularity
2150 * is too large. It's really bad if the drive is defective and
2151 * the loop times out.
2152 */
2153
2154 if (!ata_wait3(io_hdl2, ata_ctlp->ac_ioaddr2,
2155 ATS_DRQ, ATS_BSY, /* okay */
2156 ATS_ERR, ATS_BSY, /* cmd failed */
2157 ATS_DF, ATS_BSY, /* drive failed */
2158 4000000)) {
2159 ADBG_WARN(("ata_disk_start_pio_out: no DRQ\n"));
2160 ata_pktp->ap_flags |= AP_ERROR;
2161 return (ATA_FSM_RC_INTR);
2162 }
2163
2164 /*
2165 * Tell the upper layer to fake a hardware interrupt which
2166 * actually causes the first segment to be written to the drive.
2167 */
2168 return (ATA_FSM_RC_INTR);
2169 }
2170
2171
2172
2173 /*
2174 *
2175 * packet complete callback routine
2176 *
2177 */
2178
2179 static void
ata_disk_complete(ata_drv_t * ata_drvp,ata_pkt_t * ata_pktp,int do_callback)2180 ata_disk_complete(
2181 ata_drv_t *ata_drvp,
2182 ata_pkt_t *ata_pktp,
2183 int do_callback)
2184 {
2185 struct ata_id *aidp = &ata_drvp->ad_id;
2186 cmpkt_t *pktp;
2187
2188 ADBG_TRACE(("ata_disk_complete entered\n"));
2189 ADBG_TRANSPORT(("ata_disk_complete: pkt = 0x%p\n", ata_pktp));
2190
2191 pktp = APKT2CPKT(ata_pktp);
2192
2193 /* update resid */
2194
2195 pktp->cp_resid = ata_pktp->ap_resid;
2196
2197 if (ata_pktp->ap_flags & AP_ERROR) {
2198
2199 pktp->cp_reason = CPS_CHKERR;
2200
2201 if (ata_pktp->ap_error & ATE_BBK_ICRC) {
2202 if (IS_ATA_VERSION_GE(aidp, 4))
2203 ata_pktp->ap_scb = DERR_ICRC;
2204 else
2205 ata_pktp->ap_scb = DERR_BBK;
2206 } else if (ata_pktp->ap_error & ATE_UNC)
2207 ata_pktp->ap_scb = DERR_UNC;
2208 else if (ata_pktp->ap_error & ATE_IDNF)
2209 ata_pktp->ap_scb = DERR_IDNF;
2210 else if (ata_pktp->ap_error & ATE_TKONF)
2211 ata_pktp->ap_scb = DERR_TKONF;
2212 else if (ata_pktp->ap_error & ATE_AMNF)
2213 ata_pktp->ap_scb = DERR_AMNF;
2214 else if (ata_pktp->ap_status & ATS_BSY)
2215 ata_pktp->ap_scb = DERR_BUSY;
2216 else if (ata_pktp->ap_status & ATS_DF)
2217 ata_pktp->ap_scb = DERR_DWF;
2218 else /* any unknown error */
2219 ata_pktp->ap_scb = DERR_ABORT;
2220 } else if (ata_pktp->ap_flags &
2221 (AP_ABORT|AP_TIMEOUT|AP_BUS_RESET)) {
2222
2223 pktp->cp_reason = CPS_CHKERR;
2224 ata_pktp->ap_scb = DERR_ABORT;
2225 } else {
2226 pktp->cp_reason = CPS_SUCCESS;
2227 ata_pktp->ap_scb = DERR_SUCCESS;
2228 }
2229
2230 /* callback */
2231 if (do_callback)
2232 (*pktp->cp_callback)(pktp);
2233 }
2234
2235
2236 /*
2237 *
2238 * Interrupt callbacks
2239 *
2240 */
2241
2242
2243 /*
2244 *
2245 * ATA command, no data
2246 *
2247 */
2248
2249 /* ARGSUSED */
2250 static int
ata_disk_intr(ata_ctl_t * ata_ctlp,ata_drv_t * ata_drvp,ata_pkt_t * ata_pktp)2251 ata_disk_intr(
2252 ata_ctl_t *ata_ctlp,
2253 ata_drv_t *ata_drvp,
2254 ata_pkt_t *ata_pktp)
2255 {
2256 uchar_t status;
2257
2258 ADBG_TRACE(("ata_disk_intr entered\n"));
2259 ADBG_TRANSPORT(("ata_disk_intr: pkt = 0x%p\n", ata_pktp));
2260
2261 status = ata_get_status_clear_intr(ata_ctlp, ata_pktp);
2262
2263 ASSERT((status & (ATS_BSY | ATS_DRQ)) == 0);
2264
2265 /*
2266 * check for errors
2267 */
2268
2269 if (status & (ATS_DF | ATS_ERR)) {
2270 ADBG_WARN(("ata_disk_intr: status 0x%x error 0x%x\n", status,
2271 ddi_get8(ata_ctlp->ac_iohandle1, ata_ctlp->ac_error)));
2272 ata_pktp->ap_flags |= AP_ERROR;
2273 }
2274
2275 if (ata_pktp->ap_flags & AP_ERROR) {
2276 ata_pktp->ap_status = ddi_get8(ata_ctlp->ac_iohandle2,
2277 ata_ctlp->ac_altstatus);
2278 ata_pktp->ap_error = ddi_get8(ata_ctlp->ac_iohandle1,
2279 ata_ctlp->ac_error);
2280 }
2281
2282 /* tell the upper layer this request is complete */
2283 return (ATA_FSM_RC_FINI);
2284 }
2285
2286
2287 /*
2288 *
2289 * ATA command, PIO data in
2290 *
2291 */
2292
2293 /* ARGSUSED */
2294 static int
ata_disk_intr_pio_in(ata_ctl_t * ata_ctlp,ata_drv_t * ata_drvp,ata_pkt_t * ata_pktp)2295 ata_disk_intr_pio_in(
2296 ata_ctl_t *ata_ctlp,
2297 ata_drv_t *ata_drvp,
2298 ata_pkt_t *ata_pktp)
2299 {
2300 ddi_acc_handle_t io_hdl1 = ata_ctlp->ac_iohandle1;
2301 ddi_acc_handle_t io_hdl2 = ata_ctlp->ac_iohandle2;
2302 uchar_t status;
2303
2304 ADBG_TRACE(("ata_disk_pio_in entered\n"));
2305 ADBG_TRANSPORT(("ata_disk_pio_in: pkt = 0x%p\n", ata_pktp));
2306
2307 /*
2308 * first make certain DRQ is asserted (and no errors)
2309 */
2310 (void) ata_wait3(io_hdl2, ata_ctlp->ac_ioaddr2,
2311 ATS_DRQ, ATS_BSY, ATS_ERR, ATS_BSY, ATS_DF, ATS_BSY,
2312 4000000);
2313
2314 status = ata_get_status_clear_intr(ata_ctlp, ata_pktp);
2315
2316 if (status & ATS_BSY) {
2317 ADBG_WARN(("ata_disk_pio_in: BUSY\n"));
2318 ata_pktp->ap_flags |= AP_ERROR;
2319 ata_pktp->ap_status = ddi_get8(io_hdl2, ata_ctlp->ac_altstatus);
2320 ata_pktp->ap_error = ddi_get8(io_hdl1, ata_ctlp->ac_error);
2321 return (ATA_FSM_RC_BUSY);
2322 }
2323
2324 /*
2325 * record any errors
2326 */
2327 if ((status & (ATS_DRQ | ATS_DF | ATS_ERR)) != ATS_DRQ) {
2328 ADBG_WARN(("ata_disk_pio_in: status 0x%x error 0x%x\n",
2329 status, ddi_get8(io_hdl1, ata_ctlp->ac_error)));
2330 ata_pktp->ap_flags |= AP_ERROR;
2331 ata_pktp->ap_status = ddi_get8(io_hdl2, ata_ctlp->ac_altstatus);
2332 ata_pktp->ap_error = ddi_get8(io_hdl1, ata_ctlp->ac_error);
2333 }
2334
2335 /*
2336 * read the next chunk of data (if any)
2337 */
2338 if (status & ATS_DRQ) {
2339 ata_disk_pio_xfer_data_in(ata_ctlp, ata_pktp);
2340 }
2341
2342 /*
2343 * If that was the last chunk, wait for the device to clear DRQ
2344 */
2345 if (ata_pktp->ap_resid == 0) {
2346 if (ata_wait(io_hdl2, ata_ctlp->ac_ioaddr2,
2347 0, (ATS_DRQ | ATS_BSY), 4000000)) {
2348 /* tell the upper layer this request is complete */
2349 return (ATA_FSM_RC_FINI);
2350 }
2351
2352 ADBG_WARN(("ata_disk_pio_in: DRQ stuck\n"));
2353 ata_pktp->ap_flags |= AP_ERROR;
2354 ata_pktp->ap_status = ddi_get8(io_hdl2, ata_ctlp->ac_altstatus);
2355 ata_pktp->ap_error = ddi_get8(io_hdl1, ata_ctlp->ac_error);
2356 }
2357
2358 /*
2359 * check for errors
2360 */
2361 if (ata_pktp->ap_flags & AP_ERROR) {
2362 return (ATA_FSM_RC_FINI);
2363 }
2364
2365 /*
2366 * If the read command isn't done yet,
2367 * wait for the next interrupt.
2368 */
2369 ADBG_TRACE(("ata_disk_pio_in: partial\n"));
2370 return (ATA_FSM_RC_OKAY);
2371 }
2372
2373
2374
2375 /*
2376 *
2377 * ATA command, PIO data out
2378 *
2379 */
2380
2381 /* ARGSUSED */
2382 static int
ata_disk_intr_pio_out(ata_ctl_t * ata_ctlp,ata_drv_t * ata_drvp,ata_pkt_t * ata_pktp)2383 ata_disk_intr_pio_out(
2384 ata_ctl_t *ata_ctlp,
2385 ata_drv_t *ata_drvp,
2386 ata_pkt_t *ata_pktp)
2387 {
2388 ddi_acc_handle_t io_hdl1 = ata_ctlp->ac_iohandle1;
2389 ddi_acc_handle_t io_hdl2 = ata_ctlp->ac_iohandle2;
2390 int tmp_count = ata_pktp->ap_wrt_count;
2391 uchar_t status;
2392
2393 /*
2394 * clear the IRQ
2395 */
2396 status = ata_get_status_clear_intr(ata_ctlp, ata_pktp);
2397
2398 ADBG_TRACE(("ata_disk_intr_pio_out entered\n"));
2399 ADBG_TRANSPORT(("ata_disk_intr_pio_out: pkt = 0x%p\n", ata_pktp));
2400
2401 ASSERT(!(status & ATS_BSY));
2402
2403
2404 /*
2405 * check for errors
2406 */
2407
2408 if (status & (ATS_DF | ATS_ERR)) {
2409 ADBG_WARN(("ata_disk_intr_pio_out: status 0x%x error 0x%x\n",
2410 status, ddi_get8(io_hdl1, ata_ctlp->ac_error)));
2411 ata_pktp->ap_flags |= AP_ERROR;
2412 ata_pktp->ap_status = ddi_get8(io_hdl2, ata_ctlp->ac_altstatus);
2413 ata_pktp->ap_error = ddi_get8(io_hdl1, ata_ctlp->ac_error);
2414 /* tell the upper layer this request is complete */
2415 return (ATA_FSM_RC_FINI);
2416 }
2417
2418
2419 /*
2420 * last write was okay, bump the ptr and
2421 * decr the resid count
2422 */
2423 ata_pktp->ap_v_addr += tmp_count;
2424 ata_pktp->ap_resid -= tmp_count;
2425
2426 /*
2427 * check for final interrupt on write command
2428 */
2429 if (ata_pktp->ap_resid == 0) {
2430 /* tell the upper layer this request is complete */
2431 return (ATA_FSM_RC_FINI);
2432 }
2433
2434 /*
2435 * Perform the next data transfer
2436 *
2437 * First make certain DRQ is asserted and no error status.
2438 * (I'm not certain but I think some drives might deassert BSY
2439 * before asserting DRQ. This extra ata_wait3() will
2440 * compensate for such drives).
2441 *
2442 */
2443 (void) ata_wait3(io_hdl2, ata_ctlp->ac_ioaddr2,
2444 ATS_DRQ, ATS_BSY, ATS_ERR, ATS_BSY, ATS_DF, ATS_BSY, 4000000);
2445
2446 status = ddi_get8(io_hdl2, ata_ctlp->ac_altstatus);
2447
2448 if (status & ATS_BSY) {
2449 /* this should never happen */
2450 ADBG_WARN(("ata_disk_intr_pio_out: BUSY\n"));
2451 ata_pktp->ap_flags |= AP_ERROR;
2452 ata_pktp->ap_status = ddi_get8(io_hdl2, ata_ctlp->ac_altstatus);
2453 ata_pktp->ap_error = ddi_get8(io_hdl1, ata_ctlp->ac_error);
2454 return (ATA_FSM_RC_BUSY);
2455 }
2456
2457 /*
2458 * bailout if any errors
2459 */
2460 if ((status & (ATS_DRQ | ATS_DF | ATS_ERR)) != ATS_DRQ) {
2461 ADBG_WARN(("ata_disk_pio_out: status 0x%x error 0x%x\n",
2462 status, ddi_get8(io_hdl1, ata_ctlp->ac_error)));
2463 ata_pktp->ap_flags |= AP_ERROR;
2464 ata_pktp->ap_status = ddi_get8(io_hdl2, ata_ctlp->ac_altstatus);
2465 ata_pktp->ap_error = ddi_get8(io_hdl1, ata_ctlp->ac_error);
2466 return (ATA_FSM_RC_FINI);
2467 }
2468
2469 /*
2470 * write the next chunk of data
2471 */
2472 ADBG_TRACE(("ata_disk_intr_pio_out: write xfer\n"));
2473 ata_disk_pio_xfer_data_out(ata_ctlp, ata_pktp);
2474
2475 /*
2476 * Wait for the next interrupt before checking the transfer
2477 * status and adjusting the transfer count.
2478 *
2479 */
2480 return (ATA_FSM_RC_OKAY);
2481 }
2482
2483
2484 /*
2485 *
2486 * ATA command, DMA data in/out
2487 *
2488 */
2489
2490 static int
ata_disk_intr_dma(ata_ctl_t * ata_ctlp,ata_drv_t * ata_drvp,ata_pkt_t * ata_pktp)2491 ata_disk_intr_dma(
2492 ata_ctl_t *ata_ctlp,
2493 ata_drv_t *ata_drvp,
2494 ata_pkt_t *ata_pktp)
2495 {
2496 ddi_acc_handle_t io_hdl1 = ata_ctlp->ac_iohandle1;
2497 ddi_acc_handle_t io_hdl2 = ata_ctlp->ac_iohandle2;
2498 uchar_t status;
2499
2500 ADBG_TRACE(("ata_disk_intr_dma entered\n"));
2501 ADBG_TRANSPORT(("ata_disk_intr_dma: pkt = 0x%p\n", ata_pktp));
2502
2503 /*
2504 * halt the DMA engine
2505 */
2506 ata_pciide_dma_stop(ata_ctlp);
2507
2508 /*
2509 * wait for the device to clear DRQ
2510 */
2511 if (!ata_wait(io_hdl2, ata_ctlp->ac_ioaddr2,
2512 0, (ATS_DRQ | ATS_BSY), 4000000)) {
2513 ADBG_WARN(("ata_disk_intr_dma: DRQ stuck\n"));
2514 ata_pktp->ap_flags |= AP_ERROR;
2515 ata_pktp->ap_status = ddi_get8(io_hdl2, ata_ctlp->ac_altstatus);
2516 ata_pktp->ap_error = ddi_get8(io_hdl1, ata_ctlp->ac_error);
2517 return (ATA_FSM_RC_BUSY);
2518 }
2519
2520 /*
2521 * get the status and clear the IRQ, and check for DMA error
2522 */
2523 status = ata_get_status_clear_intr(ata_ctlp, ata_pktp);
2524
2525 /*
2526 * check for drive errors
2527 */
2528
2529 if (status & (ATS_DF | ATS_ERR)) {
2530 ADBG_WARN(("ata_disk_intr_dma: status 0x%x error 0x%x\n",
2531 status, ddi_get8(io_hdl1, ata_ctlp->ac_error)));
2532 ata_pktp->ap_flags |= AP_ERROR;
2533 ata_pktp->ap_status = ddi_get8(io_hdl2, ata_ctlp->ac_altstatus);
2534 ata_pktp->ap_error = ddi_get8(io_hdl1, ata_ctlp->ac_error);
2535 }
2536
2537 /*
2538 * If there was a drive or DMA error, compute a resid count
2539 */
2540 if (ata_pktp->ap_flags & AP_ERROR) {
2541 /*
2542 * grab the last sector address from the drive regs
2543 * and use that to compute the resid
2544 */
2545 ata_disk_get_resid(ata_ctlp, ata_drvp, ata_pktp);
2546 } else {
2547 ata_pktp->ap_resid = 0;
2548 }
2549
2550 /* tell the upper layer this request is complete */
2551 return (ATA_FSM_RC_FINI);
2552 }
2553
2554
2555 /*
2556 *
2557 * Low level PIO routine that transfers data from the drive
2558 *
2559 */
2560
2561 static void
ata_disk_pio_xfer_data_in(ata_ctl_t * ata_ctlp,ata_pkt_t * ata_pktp)2562 ata_disk_pio_xfer_data_in(
2563 ata_ctl_t *ata_ctlp,
2564 ata_pkt_t *ata_pktp)
2565 {
2566 ddi_acc_handle_t io_hdl1 = ata_ctlp->ac_iohandle1;
2567 int count;
2568
2569 count = min(ata_pktp->ap_resid,
2570 ata_pktp->ap_bytes_per_block);
2571
2572 ADBG_TRANSPORT(("ata_disk_pio_xfer_data_in: 0x%x bytes, addr = 0x%p\n",
2573 count, ata_pktp->ap_v_addr));
2574
2575 /*
2576 * read count bytes
2577 */
2578
2579 ASSERT(count != 0);
2580
2581 ddi_rep_get16(io_hdl1, (ushort_t *)ata_pktp->ap_v_addr,
2582 ata_ctlp->ac_data, (count >> 1), DDI_DEV_NO_AUTOINCR);
2583
2584 /* wait for the busy bit to settle */
2585 ata_nsecwait(400);
2586
2587 /*
2588 * this read command completed okay, bump the ptr and
2589 * decr the resid count now.
2590 */
2591 ata_pktp->ap_v_addr += count;
2592 ata_pktp->ap_resid -= count;
2593 }
2594
2595
2596 /*
2597 *
2598 * Low level PIO routine that transfers data to the drive
2599 *
2600 */
2601
2602 static void
ata_disk_pio_xfer_data_out(ata_ctl_t * ata_ctlp,ata_pkt_t * ata_pktp)2603 ata_disk_pio_xfer_data_out(
2604 ata_ctl_t *ata_ctlp,
2605 ata_pkt_t *ata_pktp)
2606 {
2607 ddi_acc_handle_t io_hdl1 = ata_ctlp->ac_iohandle1;
2608 int count;
2609
2610 count = min(ata_pktp->ap_resid,
2611 ata_pktp->ap_bytes_per_block);
2612
2613 ADBG_TRANSPORT(("ata_disk_pio_xfer_data_out: 0x%x bytes, addr = 0x%p\n",
2614 count, ata_pktp->ap_v_addr));
2615
2616 /*
2617 * read or write count bytes
2618 */
2619
2620 ASSERT(count != 0);
2621
2622 ddi_rep_put16(io_hdl1, (ushort_t *)ata_pktp->ap_v_addr,
2623 ata_ctlp->ac_data, (count >> 1), DDI_DEV_NO_AUTOINCR);
2624
2625 /* wait for the busy bit to settle */
2626 ata_nsecwait(400);
2627
2628 /*
2629 * save the count here so I can correctly adjust
2630 * the ap_v_addr and ap_resid values at the next
2631 * interrupt.
2632 */
2633 ata_pktp->ap_wrt_count = count;
2634 }
2635
2636
2637 /*
2638 *
2639 * ATA Initialize Device Parameters (aka Set Params) command
2640 *
2641 * If the drive was put in some sort of CHS extended/logical geometry
2642 * mode by the BIOS, this function will reset it to its "native"
2643 * CHS geometry. This ensures that we don't run into any sort of
2644 * 1024 cylinder (or 65535 cylinder) limitation that may have been
2645 * created by a BIOS (or users) that chooses a bogus translated geometry.
2646 */
2647
2648 static int
ata_disk_initialize_device_parameters(ata_ctl_t * ata_ctlp,ata_drv_t * ata_drvp)2649 ata_disk_initialize_device_parameters(
2650 ata_ctl_t *ata_ctlp,
2651 ata_drv_t *ata_drvp)
2652 {
2653 int rc;
2654
2655 rc = ata_command(ata_ctlp, ata_drvp, FALSE, FALSE,
2656 ata_disk_init_dev_parm_wait,
2657 ATC_SETPARAM,
2658 0, /* feature n/a */
2659 ata_drvp->ad_phsec, /* max sector (1-based) */
2660 0, /* sector n/a */
2661 (ata_drvp->ad_phhd -1), /* max head (0-based) */
2662 0, /* cyl_low n/a */
2663 0); /* cyl_hi n/a */
2664
2665 if (rc)
2666 return (TRUE);
2667
2668 ADBG_ERROR(("ata_init_dev_parms: failed\n"));
2669 return (FALSE);
2670 }
2671
2672
2673
2674 /*
2675 *
2676 * create fake inquiry data for DADA interface
2677 *
2678 */
2679
2680 static void
ata_disk_fake_inquiry(ata_drv_t * ata_drvp)2681 ata_disk_fake_inquiry(
2682 ata_drv_t *ata_drvp)
2683 {
2684 struct ata_id *ata_idp = &ata_drvp->ad_id;
2685 struct scsi_inquiry *inqp = &ata_drvp->ad_inquiry;
2686
2687 ADBG_TRACE(("ata_disk_fake_inquiry entered\n"));
2688
2689 if (ata_idp->ai_config & ATA_ID_REM_DRV) /* ide removable bit */
2690 inqp->inq_rmb = 1; /* scsi removable bit */
2691
2692 (void) strncpy(inqp->inq_vid, "Gen-ATA ", sizeof (inqp->inq_vid));
2693 inqp->inq_dtype = DTYPE_DIRECT;
2694 inqp->inq_qual = DPQ_POSSIBLE;
2695
2696 (void) strncpy(inqp->inq_pid, ata_idp->ai_model,
2697 sizeof (inqp->inq_pid));
2698 (void) strncpy(inqp->inq_revision, ata_idp->ai_fw,
2699 sizeof (inqp->inq_revision));
2700 }
2701
2702 #define LOOP_COUNT 10000
2703
2704
2705 /*
2706 *
2707 * ATA Set Multiple Mode
2708 *
2709 */
2710
2711 static int
ata_disk_set_multiple(ata_ctl_t * ata_ctlp,ata_drv_t * ata_drvp)2712 ata_disk_set_multiple(
2713 ata_ctl_t *ata_ctlp,
2714 ata_drv_t *ata_drvp)
2715 {
2716 int rc;
2717
2718 rc = ata_command(ata_ctlp, ata_drvp, TRUE, FALSE,
2719 ata_disk_set_mult_wait,
2720 ATC_SETMULT,
2721 0, /* feature n/a */
2722 ata_drvp->ad_block_factor, /* count */
2723 0, /* sector n/a */
2724 0, /* head n/a */
2725 0, /* cyl_low n/a */
2726 0); /* cyl_hi n/a */
2727
2728 if (rc) {
2729 return (TRUE);
2730 }
2731
2732 ADBG_ERROR(("ata_disk_set_multiple: failed\n"));
2733 return (FALSE);
2734 }
2735
2736
2737 /*
2738 *
2739 * ATA Identify Device command
2740 *
2741 */
2742
2743 int
ata_disk_id(ddi_acc_handle_t io_hdl1,caddr_t ioaddr1,ddi_acc_handle_t io_hdl2,caddr_t ioaddr2,struct ata_id * ata_idp)2744 ata_disk_id(
2745 ddi_acc_handle_t io_hdl1,
2746 caddr_t ioaddr1,
2747 ddi_acc_handle_t io_hdl2,
2748 caddr_t ioaddr2,
2749 struct ata_id *ata_idp)
2750 {
2751 int rc;
2752
2753 ADBG_TRACE(("ata_disk_id entered\n"));
2754
2755 rc = ata_id_common(ATC_ID_DEVICE, TRUE, io_hdl1, ioaddr1, io_hdl2,
2756 ioaddr2, ata_idp);
2757
2758 if (!rc)
2759 return (FALSE);
2760
2761 /*
2762 * If the disk is a CF/Microdrive that works under ATA mode
2763 * through CF<->ATA adapters, identify it as an ATA device
2764 * and a non removable media.
2765 */
2766 if (ata_idp->ai_config == ATA_ID_COMPACT_FLASH) {
2767 ata_idp->ai_config = ATA_ID_CF_TO_ATA;
2768 }
2769
2770 if ((ata_idp->ai_config & ATAC_ATA_TYPE_MASK) != ATAC_ATA_TYPE)
2771 return (FALSE);
2772
2773 if (ata_idp->ai_heads == 0 || ata_idp->ai_sectors == 0) {
2774 return (FALSE);
2775 }
2776
2777 return (TRUE);
2778 }
2779
2780 static daddr_t
ata_last_block_xferred_chs(ata_drv_t * ata_drvp)2781 ata_last_block_xferred_chs(ata_drv_t *ata_drvp)
2782 {
2783 ata_ctl_t *ata_ctlp = ata_drvp->ad_ctlp;
2784 ddi_acc_handle_t io_hdl1 = ata_ctlp->ac_iohandle1;
2785 uchar_t drvheads = ata_drvp->ad_phhd;
2786 uchar_t drvsectors = ata_drvp->ad_phsec;
2787 uchar_t sector;
2788 uchar_t head;
2789 uchar_t low_cyl;
2790 uchar_t hi_cyl;
2791 daddr_t lbastop;
2792
2793 sector = ddi_get8(io_hdl1, ata_ctlp->ac_sect);
2794 head = ddi_get8(io_hdl1, ata_ctlp->ac_drvhd) & 0xf;
2795 low_cyl = ddi_get8(io_hdl1, ata_ctlp->ac_lcyl);
2796 hi_cyl = ddi_get8(io_hdl1, ata_ctlp->ac_hcyl);
2797
2798 lbastop = low_cyl;
2799 lbastop |= (uint_t)hi_cyl << 8;
2800 lbastop *= (uint_t)drvheads;
2801 lbastop += (uint_t)head;
2802 lbastop *= (uint_t)drvsectors;
2803 lbastop += (uint_t)sector - 1;
2804 return (lbastop);
2805 }
2806
2807 static daddr_t
ata_last_block_xferred_lba28(ata_ctl_t * ata_ctlp)2808 ata_last_block_xferred_lba28(ata_ctl_t *ata_ctlp)
2809 {
2810 ddi_acc_handle_t io_hdl1 = ata_ctlp->ac_iohandle1;
2811 daddr_t lbastop;
2812
2813 lbastop = ddi_get8(io_hdl1, ata_ctlp->ac_drvhd) & 0xf;
2814 lbastop <<= 8;
2815 lbastop += ddi_get8(io_hdl1, ata_ctlp->ac_hcyl);
2816 lbastop <<= 8;
2817 lbastop += ddi_get8(io_hdl1, ata_ctlp->ac_lcyl);
2818 lbastop <<= 8;
2819 lbastop += ddi_get8(io_hdl1, ata_ctlp->ac_sect);
2820 return (lbastop);
2821 }
2822
2823 static daddr_t
ata_last_block_xferred_lba48(ata_ctl_t * ata_ctlp)2824 ata_last_block_xferred_lba48(ata_ctl_t *ata_ctlp)
2825 {
2826 ddi_acc_handle_t io_hdl1 = ata_ctlp->ac_iohandle1;
2827 ddi_acc_handle_t io_hdl2 = ata_ctlp->ac_iohandle2;
2828 daddr_t lbastop;
2829
2830 /* turn on HOB and read the high-order 24 bits */
2831 ddi_put8(io_hdl2, ata_ctlp->ac_devctl, (ATDC_D3 | ATDC_HOB));
2832 lbastop = ddi_get8(io_hdl1, ata_ctlp->ac_hcyl);
2833 lbastop <<= 8;
2834 lbastop += ddi_get8(io_hdl1, ata_ctlp->ac_lcyl);
2835 lbastop <<= 8;
2836 lbastop += ddi_get8(io_hdl1, ata_ctlp->ac_sect);
2837 lbastop <<= 8;
2838
2839 /* Turn off HOB and read the low-order 24-bits */
2840 ddi_put8(io_hdl2, ata_ctlp->ac_devctl, (ATDC_D3));
2841 lbastop += ddi_get8(io_hdl1, ata_ctlp->ac_hcyl);
2842 lbastop <<= 8;
2843 lbastop += ddi_get8(io_hdl1, ata_ctlp->ac_lcyl);
2844 lbastop <<= 8;
2845 lbastop += ddi_get8(io_hdl1, ata_ctlp->ac_sect);
2846 return (lbastop);
2847 }
2848
2849
2850 /*
2851 *
2852 * Need to compute a value for ap_resid so that cp_resid can
2853 * be set by ata_disk_complete(). The cp_resid var is actually
2854 * misnamed. It's actually the offset to the block in which the
2855 * error occurred not the number of bytes transferred to the device.
2856 * At least that's how dadk actually uses the cp_resid when reporting
2857 * an error. In other words the sector that had the error and the
2858 * number of bytes transferred don't always indicate the same offset.
2859 * On top of that, when doing DMA transfers there's actually no
2860 * way to determine how many bytes have been transferred by the DMA
2861 * engine. On the other hand, the drive will report which sector
2862 * it faulted on. Using that address this routine computes the
2863 * number of residual bytes beyond that point which probably weren't
2864 * written to the drive (the drive is allowed to re-order sector
2865 * writes but on an ATA disk there's no way to deal with that
2866 * complication; in other words, the resid value calculated by
2867 * this routine is as good as we can manage).
2868 */
2869
2870 static void
ata_disk_get_resid(ata_ctl_t * ata_ctlp,ata_drv_t * ata_drvp,ata_pkt_t * ata_pktp)2871 ata_disk_get_resid(
2872 ata_ctl_t *ata_ctlp,
2873 ata_drv_t *ata_drvp,
2874 ata_pkt_t *ata_pktp)
2875 {
2876 uint_t lba_start;
2877 uint_t lba_stop;
2878 uint_t resid_bytes;
2879 uint_t resid_sectors;
2880
2881 lba_start = ata_pktp->ap_startsec;
2882
2883 if (ata_drvp->ad_flags & AD_EXT48)
2884 lba_stop = ata_last_block_xferred_lba48(ata_ctlp);
2885 else if (ata_drvp->ad_drive_bits & ATDH_LBA)
2886 lba_stop = ata_last_block_xferred_lba28(ata_ctlp);
2887 else /* CHS mode */
2888 lba_stop = ata_last_block_xferred_chs(ata_drvp);
2889
2890 resid_sectors = lba_start + ata_pktp->ap_count - lba_stop;
2891 resid_bytes = resid_sectors << SCTRSHFT;
2892
2893 ADBG_TRACE(("ata_disk_get_resid start 0x%x cnt 0x%x stop 0x%x\n",
2894 lba_start, ata_pktp->ap_count, lba_stop));
2895 ata_pktp->ap_resid = resid_bytes;
2896 }
2897
2898
2899
2900 /*
2901 * Removable media commands *
2902 */
2903
2904
2905
2906 /*
2907 * get the media status
2908 *
2909 * NOTE: the error handling case probably isn't correct but it
2910 * will have to do until someone gives me a drive to test this on.
2911 */
2912 static int
ata_disk_state(ata_ctl_t * ata_ctlp,ata_drv_t * ata_drvp,ata_pkt_t * ata_pktp)2913 ata_disk_state(
2914 ata_ctl_t *ata_ctlp,
2915 ata_drv_t *ata_drvp,
2916 ata_pkt_t *ata_pktp)
2917 {
2918 int *statep = (int *)ata_pktp->ap_v_addr;
2919 uchar_t err;
2920
2921 ADBG_TRACE(("ata_disk_state\n"));
2922 if (ata_command(ata_ctlp, ata_drvp, TRUE, TRUE, 5 * 1000000,
2923 ATC_DOOR_LOCK, 0, 0, 0, 0, 0, 0)) {
2924 *statep = DKIO_INSERTED;
2925 return (ATA_FSM_RC_FINI);
2926 }
2927
2928 err = ddi_get8(ata_ctlp->ac_iohandle1, ata_ctlp->ac_error);
2929 if (err & ATE_NM)
2930 *statep = DKIO_EJECTED;
2931 else
2932 *statep = DKIO_NONE;
2933
2934 return (ATA_FSM_RC_FINI);
2935 }
2936
2937 /*
2938 * eject the media
2939 */
2940
2941 static int
ata_disk_eject(ata_ctl_t * ata_ctlp,ata_drv_t * ata_drvp,ata_pkt_t * ata_pktp)2942 ata_disk_eject(
2943 ata_ctl_t *ata_ctlp,
2944 ata_drv_t *ata_drvp,
2945 ata_pkt_t *ata_pktp)
2946 {
2947 ADBG_TRACE(("ata_disk_eject\n"));
2948 if (ata_command(ata_ctlp, ata_drvp, TRUE, TRUE, 5 * 1000000,
2949 ATC_EJECT, 0, 0, 0, 0, 0, 0)) {
2950 return (ATA_FSM_RC_FINI);
2951 }
2952 ata_pktp->ap_flags |= AP_ERROR;
2953 return (ATA_FSM_RC_FINI);
2954 }
2955
2956 /*
2957 * lock the drive
2958 *
2959 */
2960 static int
ata_disk_lock(ata_ctl_t * ata_ctlp,ata_drv_t * ata_drvp,ata_pkt_t * ata_pktp)2961 ata_disk_lock(
2962 ata_ctl_t *ata_ctlp,
2963 ata_drv_t *ata_drvp,
2964 ata_pkt_t *ata_pktp)
2965 {
2966 ADBG_TRACE(("ata_disk_lock\n"));
2967 if (ata_command(ata_ctlp, ata_drvp, TRUE, TRUE, 5 * 1000000,
2968 ATC_DOOR_LOCK, 0, 0, 0, 0, 0, 0)) {
2969 return (ATA_FSM_RC_FINI);
2970 }
2971 ata_pktp->ap_flags |= AP_ERROR;
2972 return (ATA_FSM_RC_FINI);
2973 }
2974
2975
2976 /*
2977 * unlock the drive
2978 *
2979 */
2980 static int
ata_disk_unlock(ata_ctl_t * ata_ctlp,ata_drv_t * ata_drvp,ata_pkt_t * ata_pktp)2981 ata_disk_unlock(
2982 ata_ctl_t *ata_ctlp,
2983 ata_drv_t *ata_drvp,
2984 ata_pkt_t *ata_pktp)
2985 {
2986 ADBG_TRACE(("ata_disk_unlock\n"));
2987 if (ata_command(ata_ctlp, ata_drvp, TRUE, TRUE, 5 * 1000000,
2988 ATC_DOOR_UNLOCK, 0, 0, 0, 0, 0, 0)) {
2989 return (ATA_FSM_RC_FINI);
2990 }
2991 ata_pktp->ap_flags |= AP_ERROR;
2992 return (ATA_FSM_RC_FINI);
2993 }
2994
2995
2996 /*
2997 * put the drive into standby mode
2998 */
2999 static int
ata_disk_standby(ata_ctl_t * ata_ctlp,ata_drv_t * ata_drvp,ata_pkt_t * ata_pktp)3000 ata_disk_standby(
3001 ata_ctl_t *ata_ctlp,
3002 ata_drv_t *ata_drvp,
3003 ata_pkt_t *ata_pktp)
3004 {
3005 ADBG_TRACE(("ata_disk_standby\n"));
3006 if (ata_command(ata_ctlp, ata_drvp, TRUE, TRUE, 5 * 1000000,
3007 ATC_STANDBY_IM, 0, 0, 0, 0, 0, 0)) {
3008 return (ATA_FSM_RC_FINI);
3009 }
3010 ata_pktp->ap_flags |= AP_ERROR;
3011 return (ATA_FSM_RC_FINI);
3012 }
3013
3014
3015 /*
3016 * Recalibrate
3017 *
3018 * Note the extra long timeout value. This is necessary in case
3019 * the drive was in standby mode and needs to spin up the media.
3020 *
3021 */
3022 static int
ata_disk_recalibrate(ata_ctl_t * ata_ctlp,ata_drv_t * ata_drvp,ata_pkt_t * ata_pktp)3023 ata_disk_recalibrate(
3024 ata_ctl_t *ata_ctlp,
3025 ata_drv_t *ata_drvp,
3026 ata_pkt_t *ata_pktp)
3027 {
3028 ADBG_TRACE(("ata_disk_recalibrate\n"));
3029 if (ata_command(ata_ctlp, ata_drvp, TRUE, TRUE, 31 * 1000000,
3030 ATC_RECAL, 0, 0, 0, 0, 0, 0)) {
3031 return (ATA_FSM_RC_FINI);
3032 }
3033 ata_pktp->ap_flags |= AP_ERROR;
3034 return (ATA_FSM_RC_FINI);
3035 }
3036
3037 /*
3038 * Copy a string of bytes that were obtained by Identify Device into a
3039 * string buffer provided by the caller.
3040 *
3041 * 1. Determine the amount to copy. This is the lesser of the
3042 * length of the source string or the space available in the user's
3043 * buffer.
3044 * 2. The true length of the source string is always returned to the
3045 * caller in the size field of the argument.
3046 * 3. Copy the string, add a terminating NUL character at the end.
3047 */
3048
3049 static int
ata_copy_dk_ioc_string(intptr_t arg,char * source,int length,int flag)3050 ata_copy_dk_ioc_string(intptr_t arg, char *source, int length, int flag)
3051 {
3052 STRUCT_DECL(dadk_ioc_string, ds_arg);
3053 int destsize;
3054 char nulchar;
3055 caddr_t outp;
3056
3057 /*
3058 * The ioctls that use this routine are only available to
3059 * the kernel.
3060 */
3061 if ((flag & FKIOCTL) == 0)
3062 return (EFAULT);
3063
3064 STRUCT_INIT(ds_arg, flag & FMODELS);
3065
3066 /* 1. determine size of user's buffer */
3067 if (ddi_copyin((caddr_t)arg, STRUCT_BUF(ds_arg), STRUCT_SIZE(ds_arg),
3068 flag))
3069 return (EFAULT);
3070 destsize = STRUCT_FGET(ds_arg, is_size);
3071 if (destsize > length + 1)
3072 destsize = length + 1;
3073
3074 /*
3075 * 2. Return the copied length to the caller. Note: for
3076 * convenience, we actually copy the entire structure back out, not
3077 * just the length. We don't change the is_buf field, so this
3078 * shouldn't break anything.
3079 */
3080 STRUCT_FSET(ds_arg, is_size, length);
3081 if (ddi_copyout(STRUCT_BUF(ds_arg), (caddr_t)arg, STRUCT_SIZE(ds_arg),
3082 flag))
3083 return (EFAULT);
3084
3085 /* 3. copy the string and add a NULL terminator */
3086 outp = STRUCT_FGETP(ds_arg, is_buf);
3087 if (ddi_copyout(source, outp, destsize - 1, flag))
3088 return (EFAULT);
3089 nulchar = '\0';
3090 if (ddi_copyout(&nulchar, outp + (destsize - 1), 1, flag))
3091 return (EFAULT);
3092 return (0);
3093 }
3094
3095 /*
3096 * Sun branded drives are shipped write cache disabled. The default is to
3097 * force write write caching on.
3098 */
3099 static void
ata_set_write_cache(ata_ctl_t * ata_ctlp,ata_drv_t * ata_drvp)3100 ata_set_write_cache(ata_ctl_t *ata_ctlp, ata_drv_t *ata_drvp)
3101 {
3102 char *path;
3103
3104 if (!(IS_WRITE_CACHE_SUPPORTED(ata_drvp->ad_id)))
3105 return;
3106
3107 if (ata_write_cache == 1) {
3108 if (ata_set_feature(ata_ctlp, ata_drvp, FC_WRITE_CACHE_ON, 0)
3109 == FALSE) {
3110 path = kmem_alloc(MAXPATHLEN + 1, KM_NOSLEEP);
3111 if (path != NULL) {
3112 cmn_err(CE_WARN,
3113 "%s unable to enable write cache targ=%d",
3114 ddi_pathname(ata_ctlp->ac_dip, path),
3115 ata_drvp->ad_targ);
3116 kmem_free(path, MAXPATHLEN + 1);
3117 }
3118 }
3119 } else if (ata_write_cache == -1) {
3120 if (ata_set_feature(ata_ctlp, ata_drvp, FC_WRITE_CACHE_OFF, 0)
3121 == FALSE) {
3122 path = kmem_alloc(MAXPATHLEN + 1, KM_NOSLEEP);
3123 if (path != NULL) {
3124 cmn_err(CE_WARN,
3125 "%s unable to disable write cache targ=%d",
3126 ddi_pathname(ata_ctlp->ac_dip, path),
3127 ata_drvp->ad_targ);
3128 kmem_free(path, MAXPATHLEN + 1);
3129 }
3130 }
3131 }
3132 }
3133
3134 /*
3135 * Call set feature to spin-up the device.
3136 */
3137 static int
ata_disk_set_feature_spinup(ata_ctl_t * ata_ctlp,ata_drv_t * ata_drvp,ata_pkt_t * ata_pktp)3138 ata_disk_set_feature_spinup(
3139 ata_ctl_t *ata_ctlp,
3140 ata_drv_t *ata_drvp,
3141 ata_pkt_t *ata_pktp)
3142 {
3143 int rc;
3144
3145 ADBG_TRACE(("ata_disk_set_feature_spinup entered\n"));
3146
3147 rc = ata_set_feature(ata_ctlp, ata_drvp, 0x07, 0);
3148 if (!rc)
3149 ata_pktp->ap_flags |= AP_ERROR;
3150
3151 return (ATA_FSM_RC_FINI);
3152 }
3153
3154 /*
3155 * Update device ata_id content - IDENTIFY DEVICE command.
3156 */
3157 static int
ata_disk_id_update(ata_ctl_t * ata_ctlp,ata_drv_t * ata_drvp,ata_pkt_t * ata_pktp)3158 ata_disk_id_update(
3159 ata_ctl_t *ata_ctlp,
3160 ata_drv_t *ata_drvp,
3161 ata_pkt_t *ata_pktp)
3162 {
3163 ddi_acc_handle_t io_hdl1 = ata_ctlp->ac_iohandle1;
3164 caddr_t ioaddr1 = ata_ctlp->ac_ioaddr1;
3165 ddi_acc_handle_t io_hdl2 = ata_ctlp->ac_iohandle2;
3166 caddr_t ioaddr2 = ata_ctlp->ac_ioaddr2;
3167 struct ata_id *aidp = &ata_drvp->ad_id;
3168 int rc;
3169
3170 ADBG_TRACE(("ata_disk_id_update entered\n"));
3171
3172 /*
3173 * select the appropriate drive and LUN
3174 */
3175 ddi_put8(io_hdl1, (uchar_t *)ioaddr1 + AT_DRVHD,
3176 ata_drvp->ad_drive_bits);
3177 ata_nsecwait(400);
3178
3179 /*
3180 * make certain the drive is selected, and wait for not busy
3181 */
3182 if (!ata_wait(io_hdl2, ioaddr2, ATS_DRDY, ATS_BSY, 5 * 1000000)) {
3183 ADBG_ERROR(("ata_disk_id_update: select failed\n"));
3184 ata_pktp->ap_flags |= AP_ERROR;
3185 return (ATA_FSM_RC_FINI);
3186 }
3187
3188 rc = ata_disk_id(io_hdl1, ioaddr1, io_hdl2, ioaddr2, aidp);
3189
3190 if (!rc) {
3191 ata_pktp->ap_flags |= AP_ERROR;
3192 } else {
3193 swab(aidp->ai_drvser, aidp->ai_drvser,
3194 sizeof (aidp->ai_drvser));
3195 swab(aidp->ai_fw, aidp->ai_fw,
3196 sizeof (aidp->ai_fw));
3197 swab(aidp->ai_model, aidp->ai_model,
3198 sizeof (aidp->ai_model));
3199 }
3200
3201 return (ATA_FSM_RC_FINI);
3202 }
3203
3204 /*
3205 * Update device firmware.
3206 */
3207 static int
ata_disk_update_fw(gtgt_t * gtgtp,ata_ctl_t * ata_ctlp,ata_drv_t * ata_drvp,caddr_t fwfile,uint_t size,uint8_t type,int flag)3208 ata_disk_update_fw(gtgt_t *gtgtp, ata_ctl_t *ata_ctlp,
3209 ata_drv_t *ata_drvp, caddr_t fwfile,
3210 uint_t size, uint8_t type, int flag)
3211 {
3212 ata_pkt_t *ata_pktp;
3213 gcmd_t *gcmdp = NULL;
3214 caddr_t fwfile_memp = NULL, tmp_fwfile_memp;
3215 uint_t total_sec_count, sec_count, start_sec = 0;
3216 uint8_t cmd_type;
3217 int rc;
3218
3219 /*
3220 * First check whether DOWNLOAD MICROCODE command is supported
3221 */
3222 if (!(ata_drvp->ad_id.ai_cmdset83 & 0x1)) {
3223 ADBG_ERROR(("drive doesn't support download "
3224 "microcode command\n"));
3225 return (ENOTSUP);
3226 }
3227
3228 switch (type) {
3229 case FW_TYPE_TEMP:
3230 cmd_type = ATCM_FW_TEMP;
3231 break;
3232
3233 case FW_TYPE_PERM:
3234 cmd_type = ATCM_FW_PERM;
3235 break;
3236
3237 default:
3238 return (EINVAL);
3239 }
3240
3241 /* Temporary subcommand is obsolete in ATA/ATAPI-8 version */
3242 if (cmd_type == ATCM_FW_TEMP) {
3243 if (ata_drvp->ad_id.ai_majorversion & ATAC_MAJVER_8) {
3244 ADBG_ERROR(("Temporary use is obsolete in "
3245 "ATA/ATAPI-8 version\n"));
3246 return (ENOTSUP);
3247 }
3248 }
3249
3250 total_sec_count = size >> SCTRSHFT;
3251 if (total_sec_count > MAX_FWFILE_SIZE_ONECMD) {
3252 if (cmd_type == ATCM_FW_TEMP) {
3253 ADBG_ERROR(("firmware size: %x sectors is too large\n",
3254 total_sec_count));
3255 return (EINVAL);
3256 } else {
3257 ADBG_WARN(("firmware size: %x sectors is larger than"
3258 " one command, need to use the multicommand"
3259 " subcommand\n", total_sec_count));
3260
3261 cmd_type = ATCM_FW_MULTICMD;
3262 if (!(ata_drvp->ad_id.ai_padding2[15] & 0x10)) {
3263 ADBG_ERROR(("This drive doesn't support "
3264 "the multicommand subcommand\n"));
3265 return (ENOTSUP);
3266 }
3267 }
3268 }
3269
3270 fwfile_memp = kmem_zalloc(size, KM_SLEEP);
3271
3272 if (ddi_copyin(fwfile, fwfile_memp, size, flag)) {
3273 ADBG_ERROR(("ata_disk_update_fw copyin failed\n"));
3274 rc = EFAULT;
3275 goto done;
3276 }
3277
3278 tmp_fwfile_memp = fwfile_memp;
3279
3280 for (; total_sec_count > 0; ) {
3281 if ((gcmdp == NULL) && !(gcmdp =
3282 ghd_gcmd_alloc(gtgtp, sizeof (*ata_pktp), TRUE))) {
3283 ADBG_ERROR(("ata_disk_update_fw alloc failed\n"));
3284 rc = ENOMEM;
3285 goto done;
3286 }
3287
3288 /* set the back ptr from the ata_pkt to the gcmd_t */
3289 ata_pktp = GCMD2APKT(gcmdp);
3290 ata_pktp->ap_gcmdp = gcmdp;
3291 ata_pktp->ap_hd = ata_drvp->ad_drive_bits;
3292 ata_pktp->ap_bytes_per_block = ata_drvp->ad_bytes_per_block;
3293
3294 /* use PIO mode to update disk firmware */
3295 ata_pktp->ap_start = ata_disk_start_pio_out;
3296 ata_pktp->ap_intr = ata_disk_intr_pio_out;
3297 ata_pktp->ap_complete = NULL;
3298
3299 ata_pktp->ap_cmd = ATC_LOAD_FW;
3300 /* use ap_bcount to set subcommand code */
3301 ata_pktp->ap_bcount = (size_t)cmd_type;
3302 ata_pktp->ap_pciide_dma = FALSE;
3303 ata_pktp->ap_sg_cnt = 0;
3304
3305 sec_count = min(total_sec_count, MAX_FWFILE_SIZE_ONECMD);
3306 ata_pktp->ap_flags = 0;
3307
3308 ata_pktp->ap_count = (ushort_t)sec_count;
3309 ata_pktp->ap_startsec = start_sec;
3310 ata_pktp->ap_v_addr = tmp_fwfile_memp;
3311 ata_pktp->ap_resid = sec_count << SCTRSHFT;
3312
3313 /* add it to the queue, and use POLL mode */
3314 rc = ghd_transport(&ata_ctlp->ac_ccc, gcmdp, gcmdp->cmd_gtgtp,
3315 ata_disk_updatefw_time, TRUE, NULL);
3316
3317 if (rc != TRAN_ACCEPT) {
3318 /* this should never, ever happen */
3319 rc = ENOTSUP;
3320 goto done;
3321 }
3322
3323 if (ata_pktp->ap_flags & AP_ERROR) {
3324 if (ata_pktp->ap_error & ATE_ABORT) {
3325 rc = ENOTSUP;
3326 } else
3327 rc = EIO;
3328 goto done;
3329
3330 } else {
3331 total_sec_count -= sec_count;
3332 tmp_fwfile_memp += sec_count << SCTRSHFT;
3333 start_sec += sec_count;
3334 }
3335 }
3336
3337 rc = 0;
3338 done:
3339 if (gcmdp != NULL)
3340 ghd_gcmd_free(gcmdp);
3341
3342 kmem_free(fwfile_memp, size);
3343
3344 return (rc);
3345 }
3346