xref: /titanic_51/usr/src/uts/intel/io/dktp/controller/ata/ata_common.c (revision ab5a7454a6d76e82a121d74c74d5589cc3d37a8f)
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/modctl.h>
29 #include <sys/debug.h>
30 #include <sys/promif.h>
31 #include <sys/pci.h>
32 #include <sys/errno.h>
33 #include <sys/open.h>
34 #include <sys/uio.h>
35 #include <sys/cred.h>
36 #include <sys/cpu.h>
37 #include "ata_common.h"
38 #include "ata_disk.h"
39 #include "atapi.h"
40 #include "ata_blacklist.h"
41 #include "sil3xxx.h"
42 
43 /*
44  * Solaris Entry Points.
45  */
46 
47 static	int	ata_attach(dev_info_t *dip, ddi_attach_cmd_t cmd);
48 static	int	ata_detach(dev_info_t *dip, ddi_detach_cmd_t cmd);
49 static	int	ata_bus_ctl(dev_info_t *d, dev_info_t *r, ddi_ctl_enum_t o,
50 			void *a, void *v);
51 static	uint_t	ata_intr(caddr_t arg);
52 
53 /*
54  * GHD Entry points
55  */
56 
57 static	int	ata_get_status(void *hba_handle, void *intr_status);
58 static	void	ata_process_intr(void *hba_handle, void *intr_status);
59 static	int	ata_hba_start(void *handle, gcmd_t *gcmdp);
60 static	void	ata_hba_complete(void *handle, gcmd_t *gcmdp, int do_callback);
61 static	int	ata_timeout_func(void *hba_handle, gcmd_t  *gcmdp,
62 			gtgt_t *gtgtp, gact_t  action, int calltype);
63 
64 /*
65  * Local Function Prototypes
66  */
67 static int ata_prop_lookup_int(dev_t match_dev, dev_info_t *dip,
68 		    uint_t flags, char *name, int defvalue);
69 static	int	ata_ctlr_fsm(uchar_t fsm_func, ata_ctl_t *ata_ctlp,
70 			ata_drv_t *ata_drvp, ata_pkt_t *ata_pktp,
71 				int *DoneFlgp);
72 static	void	ata_destroy_controller(dev_info_t *dip);
73 static	int	ata_drive_type(uchar_t drvhd,
74 			ddi_acc_handle_t io_hdl1, caddr_t ioaddr1,
75 			ddi_acc_handle_t io_hdl2, caddr_t ioaddr2,
76 			struct ata_id *ata_id_bufp);
77 static	ata_ctl_t *ata_init_controller(dev_info_t *dip);
78 static	ata_drv_t *ata_init_drive(ata_ctl_t *ata_ctlp,
79 			uchar_t targ, uchar_t lun);
80 static	int	ata_init_drive_pcidma(ata_ctl_t *ata_ctlp, ata_drv_t *ata_drvp,
81 			dev_info_t *tdip);
82 static	int	ata_flush_cache(ata_ctl_t *ata_ctlp, ata_drv_t *ata_drvp);
83 static	void	ata_init_pciide(dev_info_t *dip, ata_ctl_t *ata_ctlp);
84 static	int	ata_reset_bus(ata_ctl_t *ata_ctlp);
85 static	int	ata_setup_ioaddr(dev_info_t *dip,
86 			ddi_acc_handle_t *iohandle1, caddr_t *ioaddr1p,
87 			ddi_acc_handle_t *iohandle2, caddr_t *ioaddr2p,
88 			ddi_acc_handle_t *bm_hdlp, caddr_t *bm_addrp);
89 static	int	ata_software_reset(ata_ctl_t *ata_ctlp);
90 static	int	ata_start_arq(ata_ctl_t *ata_ctlp, ata_drv_t *ata_drvp,
91 			ata_pkt_t *ata_pktp);
92 static	int	ata_strncmp(char *p1, char *p2, int cnt);
93 static	void	ata_uninit_drive(ata_drv_t *ata_drvp);
94 
95 static	int	ata_check_pciide_blacklist(dev_info_t *dip, uint_t flags);
96 static	int	ata_check_revert_to_defaults(ata_drv_t *ata_drvp);
97 static  void	ata_show_transfer_mode(ata_ctl_t *, ata_drv_t *);
98 static	int	ata_spec_init_controller(dev_info_t *dip);
99 
100 static void	ata_init_pm(dev_info_t *);
101 static int	ata_suspend(dev_info_t *);
102 static int	ata_resume(dev_info_t *);
103 static int	ata_power(dev_info_t *, int, int);
104 static int	ata_change_power(dev_info_t *, uint8_t);
105 static int	ata_is_pci(dev_info_t *);
106 static void	ata_disable_DMA(ata_drv_t *ata_drvp);
107 static int	ata_check_dma_mode(ata_drv_t *ata_drvp);
108 
109 /*
110  * Local static data
111  */
112 static	void	*ata_state;
113 
114 static	tmr_t	ata_timer_conf; /* single timeout list for all instances */
115 static	int	ata_watchdog_usec = 100000; /* check timeouts every 100 ms */
116 
117 int	ata_hba_start_watchdog = 1000;
118 int	ata_process_intr_watchdog = 1000;
119 int	ata_reset_bus_watchdog = 1000;
120 
121 
122 /*
123  * Use local or framework power management
124  */
125 
126 #ifdef	ATA_USE_AUTOPM
127 #define	ATA_BUSY_COMPONENT(d, c)	((void)pm_busy_component(d, c))
128 #define	ATA_IDLE_COMPONENT(d, c)	((void)pm_idle_component(d, c))
129 #define	ATA_RAISE_POWER(d, c, l)	pm_raise_power(d, c, l)
130 #define	ATA_LOWER_POWER(d, c, l)	pm_lower_power(d, c, l)
131 #else
132 #define	ATA_BUSY_COMPONENT(d, c)
133 #define	ATA_IDLE_COMPONENT(d, c)
134 #define	ATA_RAISE_POWER(d, c, l)	ata_power(d, c, l)
135 #define	ATA_LOWER_POWER(d, c, l)	ata_power(d, c, l)
136 #endif
137 /*
138  * number of seconds to wait during various operations
139  */
140 int	ata_flush_delay = 5 * 1000000;
141 uint_t	ata_set_feature_wait = 4 * 1000000;
142 uint_t	ata_flush_cache_wait = 60 * 1000000;	/* may take a long time */
143 
144 /*
145  * Change this for SFF-8070i support. Currently SFF-8070i is
146  * using a field in the IDENTIFY PACKET DEVICE response which
147  * already seems to be in use by some vendor's drives. I suspect
148  * SFF will either move their laslun field or provide a reliable
149  * way to validate it.
150  */
151 int	ata_enable_atapi_luns = FALSE;
152 
153 /*
154  * set this to disable all DMA requests
155  */
156 int	ata_dma_disabled = FALSE;
157 
158 /*
159  * set this to TRUE to enable storing the IDENTIFY DEVICE result in the
160  * "ata" or "atapi" property.
161  */
162 int	ata_id_debug = FALSE;
163 
164 /*
165  * set this to TRUE to enable logging device-capability data
166  */
167 int	ata_capability_data = FALSE;
168 
169 /*
170  * DMA selection message pointers
171  */
172 char *ata_cntrl_DMA_sel_msg;
173 char *ata_dev_DMA_sel_msg;
174 
175 /*
176  * bus nexus operations
177  */
178 static	struct bus_ops	 ata_bus_ops;
179 static	struct bus_ops	*scsa_bus_ops_p;
180 
181 /* ARGSUSED */
182 static int
183 ata_open(dev_t *devp, int flag, int otyp, cred_t *cred_p)
184 {
185 	if (ddi_get_soft_state(ata_state, getminor(*devp)) == NULL)
186 		return (ENXIO);
187 
188 	return (0);
189 }
190 
191 /*
192  * The purpose of this function is to pass the ioaddress of the controller
193  * to the caller, specifically used for upgrade from pre-pciide
194  * to pciide nodes
195  */
196 /* ARGSUSED */
197 static int
198 ata_read(dev_t dev, struct uio *uio_p, cred_t *cred_p)
199 {
200 	ata_ctl_t *ata_ctlp;
201 	char	buf[18];
202 	long len;
203 
204 	ata_ctlp = ddi_get_soft_state(ata_state, getminor(dev));
205 
206 	if (ata_ctlp == NULL)
207 		return (ENXIO);
208 
209 	(void) sprintf(buf, "%p\n", (void *) ata_ctlp->ac_ioaddr1);
210 
211 	len = strlen(buf) - uio_p->uio_offset;
212 	len = min(uio_p->uio_resid,  len);
213 	if (len <= 0)
214 		return (0);
215 
216 	return (uiomove((caddr_t)(buf + uio_p->uio_offset), len,
217 	    UIO_READ, uio_p));
218 }
219 
220 int
221 ata_devo_reset(
222 	dev_info_t *dip,
223 	ddi_reset_cmd_t cmd)
224 {
225 	ata_ctl_t *ata_ctlp;
226 	ata_drv_t *ata_drvp;
227 	int	   instance;
228 	int	   i;
229 	int	   rc;
230 	int	   flush_okay;
231 
232 	if (cmd != DDI_RESET_FORCE)
233 		return (0);
234 
235 	instance = ddi_get_instance(dip);
236 	ata_ctlp = ddi_get_soft_state(ata_state, instance);
237 
238 	if (!ata_ctlp)
239 		return (0);
240 
241 	/*
242 	 * reset ATA drives and flush the write cache of any drives
243 	 */
244 	flush_okay = TRUE;
245 	for (i = 0; i < ATA_MAXTARG; i++) {
246 		if ((ata_drvp = CTL2DRV(ata_ctlp, i, 0)) == 0)
247 			continue;
248 		/* Don't revert to defaults for certain IBM drives */
249 		if ((ata_drvp->ad_flags & AD_DISK) != 0 &&
250 		    ((ata_drvp->ad_flags & AD_NORVRT) == 0)) {
251 			/* Enable revert to defaults when reset */
252 			(void) ata_set_feature(ata_ctlp, ata_drvp,
253 			    ATSF_ENA_REVPOD, 0);
254 		}
255 
256 		/*
257 		 * skip flush cache if device type is cdrom
258 		 *
259 		 * notes: the structure definitions for ata_drvp->ad_id are
260 		 * defined for the ATA IDENTIFY_DEVICE, but if AD_ATAPI is set
261 		 * the struct holds data for the ATAPI IDENTIFY_PACKET_DEVICE
262 		 */
263 		if (!IS_CDROM(ata_drvp)) {
264 
265 			/*
266 			 * Try the ATA/ATAPI flush write cache command
267 			 */
268 			rc = ata_flush_cache(ata_ctlp, ata_drvp);
269 			ADBG_WARN(("ata_flush_cache %s\n",
270 			    rc ? "okay" : "failed"));
271 
272 			if (!rc)
273 				flush_okay = FALSE;
274 		}
275 
276 
277 		/*
278 		 * do something else if flush cache not supported
279 		 */
280 	}
281 
282 	/*
283 	 * just busy wait if any drive doesn't support FLUSH CACHE
284 	 */
285 	if (!flush_okay)
286 		drv_usecwait(ata_flush_delay);
287 	return (0);
288 }
289 
290 /*
291  * quiesce(9E) entry point.
292  *
293  * This function is called when the system is single-threaded at high
294  * PIL with preemption disabled. Therefore, this function must not be
295  * blocked.
296  *
297  * This function returns DDI_SUCCESS on success, or DDI_FAILURE on failure.
298  * DDI_FAILURE indicates an error condition and should almost never happen.
299  */
300 int
301 ata_quiesce(dev_info_t *dip)
302 {
303 #ifdef ATA_DEBUG
304 	/*
305 	 * Turn off debugging
306 	 */
307 	ata_debug = 0;
308 #endif
309 
310 	return (ata_devo_reset(dip, DDI_RESET_FORCE));
311 }
312 
313 
314 static struct cb_ops ata_cb_ops = {
315 	ata_open,		/* open */
316 	nulldev,		/* close */
317 	nodev,			/* strategy */
318 	nodev,			/* print */
319 	nodev,			/* dump */
320 	ata_read,		/* read */
321 	nodev,			/* write */
322 	nodev,			/* ioctl */
323 	nodev,			/* devmap */
324 	nodev,			/* mmap */
325 	nodev,			/* segmap */
326 	nochpoll,		/* chpoll */
327 	ddi_prop_op,		/* prop_op */
328 	NULL,			/* stream info */
329 	D_MP,			/* driver compatibility flag */
330 	CB_REV,			/* cb_ops revision */
331 	nodev,			/* aread */
332 	nodev			/* awrite */
333 };
334 
335 static struct dev_ops	ata_ops = {
336 	DEVO_REV,		/* devo_rev, */
337 	0,			/* refcnt  */
338 	ddi_getinfo_1to1,	/* info */
339 	nulldev,		/* identify */
340 	NULL,			/* probe */
341 	ata_attach,		/* attach */
342 	ata_detach,		/* detach */
343 	ata_devo_reset,		/* reset */
344 	&ata_cb_ops,		/* driver operations */
345 	NULL,			/* bus operations */
346 	ata_power,		/* power */
347 	ata_quiesce		/* quiesce */
348 };
349 
350 /* driver loadable module wrapper */
351 static struct modldrv modldrv = {
352 	&mod_driverops,		/* Type of module. This one is a driver */
353 	"ATA AT-bus attachment disk controller Driver",	/* module name */
354 	&ata_ops,					/* driver ops */
355 };
356 
357 static struct modlinkage modlinkage = {
358 	MODREV_1, (void *)&modldrv, NULL
359 };
360 
361 #ifdef ATA_DEBUG
362 int	ata_debug_init = FALSE;
363 int	ata_debug_attach = FALSE;
364 
365 int	ata_debug = ADBG_FLAG_ERROR
366 		/* | ADBG_FLAG_ARQ */
367 		/* | ADBG_FLAG_INIT */
368 		/* | ADBG_FLAG_TRACE */
369 		/* | ADBG_FLAG_TRANSPORT */
370 		/* | ADBG_FLAG_WARN */
371 		;
372 #endif
373 
374 int
375 _init(void)
376 {
377 	int err;
378 
379 #ifdef ATA_DEBUG
380 	if (ata_debug_init)
381 		debug_enter("\nATA _INIT\n");
382 #endif
383 
384 	if ((err = ddi_soft_state_init(&ata_state, sizeof (ata_ctl_t), 0)) != 0)
385 		return (err);
386 
387 	if ((err = scsi_hba_init(&modlinkage)) != 0) {
388 		ddi_soft_state_fini(&ata_state);
389 		return (err);
390 	}
391 
392 	/* save pointer to SCSA provided bus_ops struct */
393 	scsa_bus_ops_p = ata_ops.devo_bus_ops;
394 
395 	/* make a copy of SCSA bus_ops */
396 	ata_bus_ops = *(ata_ops.devo_bus_ops);
397 
398 	/*
399 	 * Modify our bus_ops to call our routines.  Our implementation
400 	 * will determine if the device is ATA or ATAPI/SCSA and react
401 	 * accordingly.
402 	 */
403 	ata_bus_ops.bus_ctl = ata_bus_ctl;
404 
405 	/* patch our bus_ops into the dev_ops struct */
406 	ata_ops.devo_bus_ops = &ata_bus_ops;
407 
408 	if ((err = mod_install(&modlinkage)) != 0) {
409 		scsi_hba_fini(&modlinkage);
410 		ddi_soft_state_fini(&ata_state);
411 	}
412 
413 	/*
414 	 * Initialize the per driver timer info.
415 	 */
416 
417 	ghd_timer_init(&ata_timer_conf, drv_usectohz(ata_watchdog_usec));
418 
419 	return (err);
420 }
421 
422 int
423 _fini(void)
424 {
425 	int err;
426 
427 	if ((err = mod_remove(&modlinkage)) == 0) {
428 		ghd_timer_fini(&ata_timer_conf);
429 		scsi_hba_fini(&modlinkage);
430 		ddi_soft_state_fini(&ata_state);
431 	}
432 
433 	return (err);
434 }
435 
436 int
437 _info(struct modinfo *modinfop)
438 {
439 	return (mod_info(&modlinkage, modinfop));
440 }
441 
442 
443 /*
444  *
445  * driver attach entry point
446  *
447  */
448 
449 static int
450 ata_attach(
451 	dev_info_t *dip,
452 	ddi_attach_cmd_t cmd)
453 {
454 	ata_ctl_t	*ata_ctlp;
455 	ata_drv_t	*ata_drvp;
456 	ata_drv_t	*first_drvp = NULL;
457 	uchar_t		 targ;
458 	uchar_t		 lun;
459 	uchar_t		 lastlun;
460 	int		 atapi_count = 0;
461 	int		 disk_count = 0;
462 
463 	ADBG_TRACE(("ata_attach entered\n"));
464 #ifdef ATA_DEBUG
465 	if (ata_debug_attach)
466 		debug_enter("\nATA_ATTACH\n\n");
467 #endif
468 
469 	switch (cmd) {
470 	case DDI_ATTACH:
471 		break;
472 	case DDI_RESUME:
473 		return (ata_resume(dip));
474 	default:
475 		return (DDI_FAILURE);
476 	}
477 
478 	/* initialize controller */
479 	ata_ctlp = ata_init_controller(dip);
480 
481 	if (ata_ctlp == NULL)
482 		goto errout;
483 
484 	mutex_enter(&ata_ctlp->ac_ccc.ccc_hba_mutex);
485 
486 	/* initialize drives */
487 
488 	for (targ = 0; targ < ATA_MAXTARG; targ++) {
489 
490 		ata_drvp = ata_init_drive(ata_ctlp, targ, 0);
491 		if (ata_drvp == NULL)
492 			continue;
493 
494 		if (first_drvp == NULL)
495 			first_drvp = ata_drvp;
496 
497 		if (ATAPIDRV(ata_drvp)) {
498 			atapi_count++;
499 			lastlun = ata_drvp->ad_id.ai_lastlun;
500 		} else {
501 			disk_count++;
502 			lastlun = 0;
503 		}
504 
505 		/*
506 		 * LUN support is currently disabled. Check with SFF-8070i
507 		 * before enabling.
508 		 */
509 		if (!ata_enable_atapi_luns)
510 			lastlun = 0;
511 
512 		/* Initialize higher LUNs, if there are any */
513 		for (lun = 1; lun <= lastlun && lun < ATA_MAXLUN; lun++) {
514 			if ((ata_drvp =
515 			    ata_init_drive(ata_ctlp, targ, lun)) != NULL) {
516 				ata_show_transfer_mode(ata_ctlp, ata_drvp);
517 			}
518 		}
519 	}
520 
521 	if ((atapi_count == 0) && (disk_count == 0)) {
522 		ADBG_WARN(("ata_attach: no drives detected\n"));
523 		goto errout1;
524 	}
525 
526 	/*
527 	 * Always make certain that a valid drive is selected so
528 	 * that routines which poll the status register don't get
529 	 * confused by non-existent drives.
530 	 */
531 	ddi_put8(ata_ctlp->ac_iohandle1, ata_ctlp->ac_drvhd,
532 	    first_drvp->ad_drive_bits);
533 	ata_nsecwait(400);
534 
535 	/*
536 	 * make certain the drive selected
537 	 */
538 	if (!ata_wait(ata_ctlp->ac_iohandle2, ata_ctlp->ac_ioaddr2,
539 	    0, ATS_BSY, 5000000)) {
540 		ADBG_ERROR(("ata_attach: select failed\n"));
541 	}
542 
543 	/*
544 	 * initialize atapi/ata_dsk modules if we have at least
545 	 * one drive of that type.
546 	 */
547 
548 	if (atapi_count) {
549 		if (!atapi_attach(ata_ctlp))
550 			goto errout1;
551 		ata_ctlp->ac_flags |= AC_ATAPI_INIT;
552 	}
553 
554 	if (disk_count) {
555 		if (!ata_disk_attach(ata_ctlp))
556 			goto errout1;
557 		ata_ctlp->ac_flags |= AC_DISK_INIT;
558 	}
559 
560 	/*
561 	 * make certain the interrupt and error latches are clear
562 	 */
563 	if (ata_ctlp->ac_pciide) {
564 
565 		int instance = ddi_get_instance(dip);
566 		if (ddi_create_minor_node(dip, "control", S_IFCHR, instance,
567 		    DDI_PSEUDO, 0) != DDI_SUCCESS) {
568 			goto errout1;
569 		}
570 
571 		(void) ata_pciide_status_clear(ata_ctlp);
572 
573 	}
574 
575 	/*
576 	 * enable the interrupt handler and drop the mutex
577 	 */
578 	ata_ctlp->ac_flags |= AC_ATTACHED;
579 	mutex_exit(&ata_ctlp->ac_ccc.ccc_hba_mutex);
580 
581 	ata_init_pm(dip);
582 
583 	ddi_report_dev(dip);
584 	return (DDI_SUCCESS);
585 
586 errout1:
587 	mutex_exit(&ata_ctlp->ac_ccc.ccc_hba_mutex);
588 errout:
589 	(void) ata_detach(dip, DDI_DETACH);
590 	return (DDI_FAILURE);
591 }
592 
593 /* driver detach entry point */
594 
595 static int
596 ata_detach(
597 	dev_info_t *dip,
598 	ddi_detach_cmd_t cmd)
599 {
600 	ata_ctl_t *ata_ctlp;
601 	ata_drv_t *ata_drvp;
602 	int	   instance;
603 	int	   i;
604 	int	   j;
605 
606 	ADBG_TRACE(("ata_detach entered\n"));
607 
608 	switch (cmd) {
609 	case DDI_DETACH:
610 		break;
611 	case DDI_SUSPEND:
612 		return (ata_suspend(dip));
613 	default:
614 		return (DDI_FAILURE);
615 	}
616 
617 	instance = ddi_get_instance(dip);
618 	ata_ctlp = ddi_get_soft_state(ata_state, instance);
619 
620 	if (!ata_ctlp)
621 		return (DDI_SUCCESS);
622 
623 	if (ata_ctlp->ac_pm_support) {
624 		ATA_BUSY_COMPONENT(dip, 0);
625 		if (ata_ctlp->ac_pm_level != PM_LEVEL_D0) {
626 			if (ATA_RAISE_POWER(dip, 0, PM_LEVEL_D0) !=
627 			    DDI_SUCCESS) {
628 				ATA_IDLE_COMPONENT(dip, 0);
629 				return (DDI_FAILURE);
630 			}
631 		}
632 		(void) ddi_prop_remove(DDI_DEV_T_NONE, dip, "pm-components");
633 	}
634 	ata_ctlp->ac_flags &= ~AC_ATTACHED;
635 
636 	/* destroy ata module */
637 	if (ata_ctlp->ac_flags & AC_DISK_INIT)
638 		ata_disk_detach(ata_ctlp);
639 
640 	/* destroy atapi module */
641 	if (ata_ctlp->ac_flags & AC_ATAPI_INIT)
642 		atapi_detach(ata_ctlp);
643 
644 	ddi_remove_minor_node(dip, NULL);
645 
646 	/* destroy drives */
647 	for (i = 0; i < ATA_MAXTARG; i++) {
648 		for (j = 0; j < ATA_MAXLUN; j++) {
649 			ata_drvp = CTL2DRV(ata_ctlp, i, j);
650 			if (ata_drvp != NULL)
651 				ata_uninit_drive(ata_drvp);
652 		}
653 	}
654 
655 	if (ata_ctlp->ac_iohandle1)
656 		ddi_regs_map_free(&ata_ctlp->ac_iohandle1);
657 	if (ata_ctlp->ac_iohandle2)
658 		ddi_regs_map_free(&ata_ctlp->ac_iohandle2);
659 	if (ata_ctlp->ac_bmhandle)
660 		ddi_regs_map_free(&ata_ctlp->ac_bmhandle);
661 
662 	/* destroy controller */
663 	ata_destroy_controller(dip);
664 
665 	ddi_prop_remove_all(dip);
666 
667 	return (DDI_SUCCESS);
668 }
669 
670 /*
671  * Nexus driver bus_ctl entry point
672  */
673 /*ARGSUSED*/
674 static int
675 ata_bus_ctl(
676 	dev_info_t *d,
677 	dev_info_t *r,
678 	ddi_ctl_enum_t o,
679 	void *a,
680 	void *v)
681 {
682 	dev_info_t *tdip;
683 	int	target_type;
684 	int	rc;
685 	char	*bufp;
686 
687 	ADBG_TRACE(("ata_bus_ctl entered\n"));
688 
689 	switch (o) {
690 
691 	case DDI_CTLOPS_SIDDEV:
692 		return (DDI_FAILURE);
693 
694 	case DDI_CTLOPS_IOMIN:
695 
696 		/*
697 		 * Since we use PIO, we return a minimum I/O size of
698 		 * one byte.  This will need to be updated when we
699 		 * implement DMA support
700 		 */
701 
702 		*((int *)v) = 1;
703 		return (DDI_SUCCESS);
704 
705 	case DDI_CTLOPS_DMAPMAPC:
706 	case DDI_CTLOPS_REPORTINT:
707 	case DDI_CTLOPS_REGSIZE:
708 	case DDI_CTLOPS_NREGS:
709 	case DDI_CTLOPS_SLAVEONLY:
710 	case DDI_CTLOPS_AFFINITY:
711 	case DDI_CTLOPS_POKE:
712 	case DDI_CTLOPS_PEEK:
713 
714 		/* These ops shouldn't be called by a target driver */
715 		ADBG_ERROR(("ata_bus_ctl: %s%d: invalid op (%d) from %s%d\n",
716 		    ddi_driver_name(d), ddi_get_instance(d), o,
717 		    ddi_driver_name(r), ddi_get_instance(r)));
718 
719 		return (DDI_FAILURE);
720 
721 	case DDI_CTLOPS_REPORTDEV:
722 	case DDI_CTLOPS_INITCHILD:
723 	case DDI_CTLOPS_UNINITCHILD:
724 
725 		/* these require special handling below */
726 		break;
727 
728 	default:
729 		return (ddi_ctlops(d, r, o, a, v));
730 	}
731 
732 	/* get targets dip */
733 
734 	if (o == DDI_CTLOPS_INITCHILD || o == DDI_CTLOPS_UNINITCHILD)
735 		tdip = (dev_info_t *)a;
736 	else
737 		tdip = r;
738 
739 	/*
740 	 * XXX - Get class of target
741 	 *   Before the "class" entry in a conf file becomes
742 	 *   a real property, we use an additional property
743 	 *   tentatively called "class_prop".  We will require that
744 	 *   new classes (ie. direct) export "class_prop".
745 	 *   SCSA target drivers will not have this property, so
746 	 *   no property implies SCSA.
747 	 */
748 	if ((ddi_prop_lookup_string(DDI_DEV_T_ANY, tdip, DDI_PROP_DONTPASS,
749 	    "class", &bufp) == DDI_PROP_SUCCESS) ||
750 	    (ddi_prop_lookup_string(DDI_DEV_T_ANY, tdip, DDI_PROP_DONTPASS,
751 	    "class_prop", &bufp) == DDI_PROP_SUCCESS)) {
752 		if (strcmp(bufp, "dada") == 0)
753 			target_type = ATA_DEV_DISK;
754 		else if (strcmp(bufp, "scsi") == 0)
755 			target_type = ATA_DEV_ATAPI;
756 		else {
757 			ADBG_WARN(("ata_bus_ctl: invalid target class %s\n",
758 			    bufp));
759 			ddi_prop_free(bufp);
760 			return (DDI_FAILURE);
761 		}
762 		ddi_prop_free(bufp);
763 	} else {
764 		target_type = ATA_DEV_ATAPI; /* no class prop, assume SCSI */
765 	}
766 
767 	if (o == DDI_CTLOPS_INITCHILD) {
768 		int	instance = ddi_get_instance(d);
769 		ata_ctl_t *ata_ctlp = ddi_get_soft_state(ata_state, instance);
770 		ata_drv_t *ata_drvp;
771 		int	targ;
772 		int	lun;
773 		int	drive_type;
774 		char	*disk_prop;
775 		char	*class_prop;
776 
777 		if (ata_ctlp == NULL) {
778 			ADBG_WARN(("ata_bus_ctl: failed to find ctl struct\n"));
779 			return (DDI_FAILURE);
780 		}
781 
782 		/* get (target,lun) of child device */
783 
784 		targ = ddi_prop_get_int(DDI_DEV_T_ANY, tdip, DDI_PROP_DONTPASS,
785 		    "target", -1);
786 		if (targ == -1) {
787 			ADBG_WARN(("ata_bus_ctl: failed to get targ num\n"));
788 			return (DDI_FAILURE);
789 		}
790 
791 		lun = ddi_prop_get_int(DDI_DEV_T_ANY, tdip, DDI_PROP_DONTPASS,
792 		    "lun", 0);
793 
794 		if ((targ < 0) || (targ >= ATA_MAXTARG) ||
795 		    (lun < 0) || (lun >= ATA_MAXLUN)) {
796 			return (DDI_FAILURE);
797 		}
798 
799 		ata_drvp = CTL2DRV(ata_ctlp, targ, lun);
800 
801 		if (ata_drvp == NULL)
802 			return (DDI_FAILURE);	/* no drive */
803 
804 		/* get type of device */
805 
806 		if (ATAPIDRV(ata_drvp))
807 			drive_type = ATA_DEV_ATAPI;
808 		else
809 			drive_type = ATA_DEV_DISK;
810 
811 		/*
812 		 * Check for special handling when child driver is
813 		 * cmdk (which morphs to the correct interface)
814 		 */
815 		if (strcmp(ddi_get_name(tdip), "cmdk") == 0) {
816 
817 			if ((target_type == ATA_DEV_DISK) &&
818 			    (target_type != drive_type))
819 				return (DDI_FAILURE);
820 
821 			target_type = drive_type;
822 
823 			if (drive_type == ATA_DEV_ATAPI) {
824 				class_prop = "scsi";
825 			} else {
826 				disk_prop = "dadk";
827 				class_prop = "dada";
828 
829 				if (ndi_prop_update_string(DDI_DEV_T_NONE, tdip,
830 				    "disk", disk_prop) != DDI_PROP_SUCCESS) {
831 					ADBG_WARN(("ata_bus_ctl: failed to "
832 					    "create disk prop\n"));
833 					return (DDI_FAILURE);
834 				}
835 			}
836 
837 			if (ndi_prop_update_string(DDI_DEV_T_NONE, tdip,
838 			    "class_prop", class_prop) != DDI_PROP_SUCCESS) {
839 				ADBG_WARN(("ata_bus_ctl: failed to "
840 				    "create class prop\n"));
841 				return (DDI_FAILURE);
842 			}
843 		}
844 
845 		/* Check that target class matches the device */
846 
847 		if (target_type != drive_type)
848 			return (DDI_FAILURE);
849 
850 		/* save pointer to drive struct for ata_disk_bus_ctl */
851 		ddi_set_driver_private(tdip, ata_drvp);
852 
853 		/*
854 		 * Determine whether to enable DMA support for this drive.  This
855 		 * check is deferred to this point so that the various dma
856 		 * properties could reside on the devinfo node should finer
857 		 * grained dma control be required.
858 		 */
859 		if (ata_drvp->ad_pciide_dma == ATA_DMA_UNINITIALIZED) {
860 			ata_drvp->ad_pciide_dma =
861 			    ata_init_drive_pcidma(ata_ctlp, ata_drvp, tdip);
862 			ata_show_transfer_mode(ata_ctlp, ata_drvp);
863 		}
864 	}
865 
866 	if (target_type == ATA_DEV_ATAPI) {
867 		rc = scsa_bus_ops_p->bus_ctl(d, r, o, a, v);
868 	} else {
869 		rc = ata_disk_bus_ctl(d, r, o, a, v);
870 	}
871 
872 	return (rc);
873 }
874 
875 /*
876  *
877  * GHD ccc_hba_complete callback
878  *
879  */
880 
881 /* ARGSUSED */
882 static void
883 ata_hba_complete(
884 	void *hba_handle,
885 	gcmd_t *gcmdp,
886 	int do_callback)
887 {
888 	ata_drv_t *ata_drvp;
889 	ata_pkt_t *ata_pktp;
890 
891 	ADBG_TRACE(("ata_hba_complete entered\n"));
892 
893 	ata_drvp = GCMD2DRV(gcmdp);
894 	ata_pktp = GCMD2APKT(gcmdp);
895 	if (ata_pktp->ap_complete)
896 		(*ata_pktp->ap_complete)(ata_drvp, ata_pktp,
897 		    do_callback);
898 }
899 
900 /* GHD ccc_timeout_func callback */
901 
902 /* ARGSUSED */
903 static int
904 ata_timeout_func(
905 	void	*hba_handle,
906 	gcmd_t	*gcmdp,
907 	gtgt_t	*gtgtp,
908 	gact_t	 action,
909 	int	 calltype)
910 {
911 	ata_ctl_t *ata_ctlp;
912 	ata_pkt_t *ata_pktp;
913 	ata_drv_t *ata_drvp;
914 
915 	ADBG_TRACE(("ata_timeout_func entered\n"));
916 
917 	ata_ctlp = (ata_ctl_t *)hba_handle;
918 
919 	if (gcmdp != NULL)
920 		ata_pktp = GCMD2APKT(gcmdp);
921 	else
922 		ata_pktp = NULL;
923 
924 	switch (action) {
925 	case GACTION_EARLY_ABORT:
926 		/* abort before request was started */
927 		if (ata_pktp != NULL) {
928 			ata_pktp->ap_flags |= AP_ABORT;
929 		}
930 		ghd_complete(&ata_ctlp->ac_ccc, gcmdp);
931 		return (TRUE);
932 
933 	case GACTION_EARLY_TIMEOUT:
934 		/* timeout before request was started */
935 		if (ata_pktp != NULL) {
936 			ata_pktp->ap_flags |= AP_TIMEOUT;
937 		}
938 		ghd_complete(&ata_ctlp->ac_ccc, gcmdp);
939 		return (TRUE);
940 
941 	case GACTION_RESET_TARGET:
942 		/*
943 		 * Reset a device is not supported. Resetting a specific
944 		 * device can't be done at all to an ATA device and if
945 		 * you send a RESET to an ATAPI device you have to
946 		 * reset the whole bus to make certain both devices
947 		 * on the bus stay in sync regarding which device is
948 		 * the currently selected one.
949 		 */
950 		return (FALSE);
951 
952 	case GACTION_RESET_BUS:
953 		/*
954 		 * Issue bus reset and reinitialize both drives.
955 		 * But only if this is a timed-out request. Target
956 		 * driver reset requests are ignored because ATA
957 		 * and ATAPI devices shouldn't be gratuitously reset.
958 		 * Also disable DMA if it is a CF device.
959 		 */
960 		if (gcmdp == NULL)
961 			break;
962 		ata_drvp = GCMD2DRV(gcmdp);
963 		if (ata_drvp != NULL)
964 			if (ata_drvp->ad_id.ai_config == ATA_ID_CF_TO_ATA)
965 				ata_disable_DMA(ata_drvp);
966 		return (ata_reset_bus(ata_ctlp));
967 	default:
968 		break;
969 	}
970 	return (FALSE);
971 }
972 
973 /*
974  *
975  * Initialize controller's soft-state structure
976  *
977  */
978 
979 static ata_ctl_t *
980 ata_init_controller(
981 	dev_info_t *dip)
982 {
983 	ata_ctl_t *ata_ctlp;
984 	int	   instance;
985 	caddr_t	   ioaddr1;
986 	caddr_t	   ioaddr2;
987 
988 	ADBG_TRACE(("ata_init_controller entered\n"));
989 
990 	instance = ddi_get_instance(dip);
991 
992 	/* allocate controller structure */
993 	if (ddi_soft_state_zalloc(ata_state, instance) != DDI_SUCCESS) {
994 		ADBG_WARN(("ata_init_controller: soft_state_zalloc failed\n"));
995 		return (NULL);
996 	}
997 
998 	ata_ctlp = ddi_get_soft_state(ata_state, instance);
999 
1000 	if (ata_ctlp == NULL) {
1001 		ADBG_WARN(("ata_init_controller: failed to find "
1002 		    "controller struct\n"));
1003 		return (NULL);
1004 	}
1005 
1006 	/*
1007 	 * initialize per-controller data
1008 	 */
1009 	ata_ctlp->ac_dip = dip;
1010 	ata_ctlp->ac_arq_pktp = kmem_zalloc(sizeof (ata_pkt_t), KM_SLEEP);
1011 
1012 	/*
1013 	 * map the device registers
1014 	 */
1015 	if (!ata_setup_ioaddr(dip, &ata_ctlp->ac_iohandle1, &ioaddr1,
1016 	    &ata_ctlp->ac_iohandle2, &ioaddr2,
1017 	    &ata_ctlp->ac_bmhandle, &ata_ctlp->ac_bmaddr)) {
1018 		(void) ata_detach(dip, DDI_DETACH);
1019 		return (NULL);
1020 	}
1021 
1022 	ADBG_INIT(("ata_init_controller: ioaddr1 = 0x%p, ioaddr2 = 0x%p\n",
1023 	    ioaddr1, ioaddr2));
1024 
1025 	/*
1026 	 * Do ARQ setup
1027 	 */
1028 	atapi_init_arq(ata_ctlp);
1029 
1030 	/*
1031 	 * Do PCI-IDE setup
1032 	 */
1033 	ata_init_pciide(dip, ata_ctlp);
1034 
1035 	/*
1036 	 * port addresses associated with ioaddr1
1037 	 */
1038 	ata_ctlp->ac_ioaddr1	= ioaddr1;
1039 	ata_ctlp->ac_data	= (ushort_t *)ioaddr1 + AT_DATA;
1040 	ata_ctlp->ac_error	= (uchar_t *)ioaddr1 + AT_ERROR;
1041 	ata_ctlp->ac_feature	= (uchar_t *)ioaddr1 + AT_FEATURE;
1042 	ata_ctlp->ac_count	= (uchar_t *)ioaddr1 + AT_COUNT;
1043 	ata_ctlp->ac_sect	= (uchar_t *)ioaddr1 + AT_SECT;
1044 	ata_ctlp->ac_lcyl	= (uchar_t *)ioaddr1 + AT_LCYL;
1045 	ata_ctlp->ac_hcyl	= (uchar_t *)ioaddr1 + AT_HCYL;
1046 	ata_ctlp->ac_drvhd	= (uchar_t *)ioaddr1 + AT_DRVHD;
1047 	ata_ctlp->ac_status	= (uchar_t *)ioaddr1 + AT_STATUS;
1048 	ata_ctlp->ac_cmd	= (uchar_t *)ioaddr1 + AT_CMD;
1049 
1050 	/*
1051 	 * port addresses associated with ioaddr2
1052 	 */
1053 	ata_ctlp->ac_ioaddr2	= ioaddr2;
1054 	ata_ctlp->ac_altstatus	= (uchar_t *)ioaddr2 + AT_ALTSTATUS;
1055 	ata_ctlp->ac_devctl	= (uchar_t *)ioaddr2 + AT_DEVCTL;
1056 
1057 	/*
1058 	 * If AC_BSY_WAIT needs to be set  for laptops that do
1059 	 * suspend/resume but do not correctly wait for the busy bit to
1060 	 * drop after a resume.
1061 	 */
1062 	ata_ctlp->ac_timing_flags = ddi_prop_get_int(DDI_DEV_T_ANY,
1063 	    dip, DDI_PROP_DONTPASS, "timing_flags", 0);
1064 	/*
1065 	 * get max transfer size, default to 256 sectors
1066 	 */
1067 	ata_ctlp->ac_max_transfer = ddi_prop_get_int(DDI_DEV_T_ANY,
1068 	    dip, DDI_PROP_DONTPASS, "max_transfer", 0x100);
1069 	if (ata_ctlp->ac_max_transfer < 1)
1070 		ata_ctlp->ac_max_transfer = 1;
1071 	if (ata_ctlp->ac_max_transfer > 0x100)
1072 		ata_ctlp->ac_max_transfer = 0x100;
1073 
1074 	/*
1075 	 * Get the standby timer value
1076 	 */
1077 	ata_ctlp->ac_standby_time = ddi_prop_get_int(DDI_DEV_T_ANY,
1078 	    dip, DDI_PROP_DONTPASS, "standby", -1);
1079 
1080 	/*
1081 	 * If this is a /pci/pci-ide instance check to see if
1082 	 * it's supposed to be attached as an /isa/ata
1083 	 */
1084 	if (ata_ctlp->ac_pciide) {
1085 		static char prop_buf[] = "SUNW-ata-ffff-isa";
1086 		int addr1 = (intptr_t)ioaddr1;
1087 
1088 
1089 		if (addr1 < 0 || addr1 > 0xffff) {
1090 			(void) ata_detach(dip, DDI_DETACH);
1091 			return (NULL);
1092 		}
1093 		(void) sprintf(prop_buf, "SUNW-ata-%04x-isa",
1094 		    addr1);
1095 		if (ddi_prop_exists(DDI_DEV_T_ANY, ddi_root_node(),
1096 		    DDI_PROP_DONTPASS, prop_buf)) {
1097 			(void) ata_detach(dip, DDI_DETACH);
1098 			return (NULL);
1099 		}
1100 	}
1101 
1102 	/* Init controller specific stuff */
1103 	(void) ata_spec_init_controller(dip);
1104 
1105 	/*
1106 	 * initialize GHD
1107 	 */
1108 
1109 	GHD_WAITQ_INIT(&ata_ctlp->ac_ccc.ccc_waitq, NULL, 1);
1110 
1111 	if (!ghd_register("ata", &ata_ctlp->ac_ccc, dip, 0, ata_ctlp,
1112 	    atapi_ccballoc, atapi_ccbfree,
1113 	    ata_pciide_dma_sg_func, ata_hba_start,
1114 	    ata_hba_complete, ata_intr,
1115 	    ata_get_status, ata_process_intr, ata_timeout_func,
1116 	    &ata_timer_conf, NULL)) {
1117 		(void) ata_detach(dip, DDI_DETACH);
1118 		return (NULL);
1119 	}
1120 
1121 	ata_ctlp->ac_flags |= AC_GHD_INIT;
1122 	return (ata_ctlp);
1123 }
1124 
1125 /* destroy a controller */
1126 
1127 static void
1128 ata_destroy_controller(
1129 	dev_info_t *dip)
1130 {
1131 	ata_ctl_t *ata_ctlp;
1132 	int	instance;
1133 
1134 	ADBG_TRACE(("ata_destroy_controller entered\n"));
1135 
1136 	instance = ddi_get_instance(dip);
1137 	ata_ctlp = ddi_get_soft_state(ata_state, instance);
1138 
1139 	if (ata_ctlp == NULL)
1140 		return;
1141 
1142 	/* destroy ghd */
1143 	if (ata_ctlp->ac_flags & AC_GHD_INIT)
1144 		ghd_unregister(&ata_ctlp->ac_ccc);
1145 
1146 	/* free the pciide buffer (if any) */
1147 	ata_pciide_free(ata_ctlp);
1148 
1149 	/* destroy controller struct */
1150 	kmem_free(ata_ctlp->ac_arq_pktp, sizeof (ata_pkt_t));
1151 	ddi_soft_state_free(ata_state, instance);
1152 
1153 }
1154 
1155 
1156 /*
1157  *
1158  * initialize a drive
1159  *
1160  */
1161 
1162 static ata_drv_t *
1163 ata_init_drive(
1164 	ata_ctl_t	*ata_ctlp,
1165 	uchar_t		targ,
1166 	uchar_t		lun)
1167 {
1168 	static	char	 nec_260[]	= "NEC CD-ROM DRIVE";
1169 	ata_drv_t *ata_drvp;
1170 	struct ata_id	*aidp;
1171 	char	buf[80];
1172 	int	drive_type;
1173 	int	i;
1174 	int	valid_version = 0;
1175 
1176 	ADBG_TRACE(("ata_init_drive entered, targ = %d, lun = %d\n",
1177 	    targ, lun));
1178 
1179 	/* check if device already exists */
1180 
1181 	ata_drvp = CTL2DRV(ata_ctlp, targ, lun);
1182 
1183 	if (ata_drvp != NULL)
1184 		return (ata_drvp);
1185 
1186 	/* allocate new device structure */
1187 
1188 	ata_drvp = kmem_zalloc(sizeof (ata_drv_t), KM_SLEEP);
1189 	aidp = &ata_drvp->ad_id;
1190 
1191 	/*
1192 	 * set up drive struct
1193 	 */
1194 	ata_drvp->ad_ctlp = ata_ctlp;
1195 	ata_drvp->ad_pciide_dma = ATA_DMA_UNINITIALIZED;
1196 	ata_drvp->ad_targ = targ;
1197 	ata_drvp->ad_drive_bits =
1198 	    (ata_drvp->ad_targ == 0 ? ATDH_DRIVE0 : ATDH_DRIVE1);
1199 	/*
1200 	 * Add the LUN for SFF-8070i support
1201 	 */
1202 	ata_drvp->ad_lun = lun;
1203 	ata_drvp->ad_drive_bits |= ata_drvp->ad_lun;
1204 
1205 	/*
1206 	 * get drive type, side effect is to collect
1207 	 * IDENTIFY DRIVE data
1208 	 */
1209 
1210 	drive_type = ata_drive_type(ata_drvp->ad_drive_bits,
1211 	    ata_ctlp->ac_iohandle1,
1212 	    ata_ctlp->ac_ioaddr1,
1213 	    ata_ctlp->ac_iohandle2,
1214 	    ata_ctlp->ac_ioaddr2,
1215 	    aidp);
1216 
1217 	switch (drive_type) {
1218 	case ATA_DEV_NONE:
1219 		/* no drive found */
1220 		goto errout;
1221 	case ATA_DEV_ATAPI:
1222 		ata_drvp->ad_flags |= AD_ATAPI;
1223 		break;
1224 	case ATA_DEV_DISK:
1225 		ata_drvp->ad_flags |= AD_DISK;
1226 		break;
1227 	}
1228 
1229 	/*
1230 	 * swap bytes of all text fields
1231 	 */
1232 	if (!ata_strncmp(nec_260, aidp->ai_model, sizeof (aidp->ai_model))) {
1233 		swab(aidp->ai_drvser, aidp->ai_drvser,
1234 		    sizeof (aidp->ai_drvser));
1235 		swab(aidp->ai_fw, aidp->ai_fw,
1236 		    sizeof (aidp->ai_fw));
1237 		swab(aidp->ai_model, aidp->ai_model,
1238 		    sizeof (aidp->ai_model));
1239 	}
1240 
1241 	/*
1242 	 * Check if this drive has the Single Sector bug
1243 	 */
1244 
1245 	if (ata_check_drive_blacklist(&ata_drvp->ad_id, ATA_BL_1SECTOR))
1246 		ata_drvp->ad_flags |= AD_1SECTOR;
1247 	else
1248 		ata_drvp->ad_flags &= ~AD_1SECTOR;
1249 
1250 	if (ata_check_drive_blacklist(&ata_drvp->ad_id, ATA_BL_LBA48))
1251 		ata_drvp->ad_flags |= AD_BLLBA48;
1252 	else
1253 		ata_drvp->ad_flags &= ~AD_BLLBA48;
1254 
1255 	/* Check if this drive has the "revert to defaults" bug */
1256 	if (!ata_check_revert_to_defaults(ata_drvp))
1257 		ata_drvp->ad_flags |= AD_NORVRT;
1258 
1259 	/* Dump the drive info */
1260 	(void) strncpy(buf, aidp->ai_model, sizeof (aidp->ai_model));
1261 	buf[sizeof (aidp->ai_model)-1] = '\0';
1262 	for (i = sizeof (aidp->ai_model) - 2; buf[i] == ' '; i--)
1263 		buf[i] = '\0';
1264 
1265 	ATAPRT(("?\t%s device at targ %d, lun %d lastlun 0x%x\n",
1266 	    (ATAPIDRV(ata_drvp) ? "ATAPI":"IDE"),
1267 	    ata_drvp->ad_targ, ata_drvp->ad_lun, aidp->ai_lastlun));
1268 
1269 	ATAPRT(("?\tmodel %s\n", buf));
1270 
1271 	if (aidp->ai_majorversion != 0 && aidp->ai_majorversion != 0xffff) {
1272 		for (i = 14; i >= 2; i--) {
1273 			if (aidp->ai_majorversion & (1 << i)) {
1274 				valid_version = i;
1275 				break;
1276 			}
1277 		}
1278 		ATAPRT((
1279 		    "?\tATA/ATAPI-%d supported, majver 0x%x minver 0x%x\n",
1280 		    valid_version,
1281 		    aidp->ai_majorversion,
1282 		    aidp->ai_minorversion));
1283 	}
1284 
1285 	if (ata_capability_data) {
1286 
1287 		ATAPRT(("?\t\tstat %x, err %x\n",
1288 		    ddi_get8(ata_ctlp->ac_iohandle2,
1289 		    ata_ctlp->ac_altstatus),
1290 		    ddi_get8(ata_ctlp->ac_iohandle1, ata_ctlp->ac_error)));
1291 
1292 		ATAPRT(("?\t\tcfg 0x%x, cap 0x%x\n",
1293 		    aidp->ai_config,
1294 		    aidp->ai_cap));
1295 
1296 		/*
1297 		 * Be aware that ATA-6 and later drives may not provide valid
1298 		 * geometry information and other obsoleted info.
1299 		 * Select what is printed based on supported ATA model (skip
1300 		 * anything below ATA/ATAPI-3)
1301 		 */
1302 
1303 		if (valid_version == 0 || aidp->ai_majorversion <
1304 		    ATAC_MAJVER_6) {
1305 			/*
1306 			 * Supported version less then ATA-6
1307 			 */
1308 			ATAPRT(("?\t\tcyl %d, hd %d, sec/trk %d\n",
1309 			    aidp->ai_fixcyls,
1310 			    aidp->ai_heads,
1311 			    aidp->ai_sectors));
1312 		}
1313 		ATAPRT(("?\t\tmult1 0x%x, mult2 0x%x\n",
1314 		    aidp->ai_mult1,
1315 		    aidp->ai_mult2));
1316 		if (valid_version && aidp->ai_majorversion < ATAC_MAJVER_4) {
1317 			ATAPRT((
1318 			"?\t\tpiomode 0x%x, dmamode 0x%x, advpiomode 0x%x\n",
1319 			    aidp->ai_piomode,
1320 			    aidp->ai_dmamode,
1321 			    aidp->ai_advpiomode));
1322 		} else {
1323 			ATAPRT(("?\t\tadvpiomode 0x%x\n",
1324 			    aidp->ai_advpiomode));
1325 		}
1326 		ATAPRT(("?\t\tminpio %d, minpioflow %d\n",
1327 		    aidp->ai_minpio,
1328 		    aidp->ai_minpioflow));
1329 		if (valid_version && aidp->ai_majorversion >= ATAC_MAJVER_4 &&
1330 		    (aidp->ai_validinfo & ATAC_VALIDINFO_83)) {
1331 			ATAPRT(("?\t\tdwdma 0x%x, ultradma 0x%x\n",
1332 			    aidp->ai_dworddma,
1333 			    aidp->ai_ultradma));
1334 		} else {
1335 			ATAPRT(("?\t\tdwdma 0x%x\n",
1336 			    aidp->ai_dworddma));
1337 		}
1338 	}
1339 
1340 	if (ATAPIDRV(ata_drvp)) {
1341 		if (!atapi_init_drive(ata_drvp))
1342 			goto errout;
1343 	} else {
1344 		if (!ata_disk_init_drive(ata_drvp))
1345 			goto errout;
1346 	}
1347 
1348 	/*
1349 	 * store pointer in controller struct
1350 	 */
1351 	CTL2DRV(ata_ctlp, targ, lun) = ata_drvp;
1352 
1353 	/*
1354 	 * lock the drive's current settings in case I have to
1355 	 * reset the drive due to some sort of error
1356 	 */
1357 	(void) ata_set_feature(ata_ctlp, ata_drvp, ATSF_DIS_REVPOD, 0);
1358 
1359 	return (ata_drvp);
1360 
1361 errout:
1362 	ata_uninit_drive(ata_drvp);
1363 	return (NULL);
1364 }
1365 
1366 /* destroy a drive */
1367 
1368 static void
1369 ata_uninit_drive(
1370 	ata_drv_t *ata_drvp)
1371 {
1372 #if 0
1373 	ata_ctl_t *ata_ctlp = ata_drvp->ad_ctlp;
1374 #endif
1375 
1376 	ADBG_TRACE(("ata_uninit_drive entered\n"));
1377 
1378 #if 0
1379 	/*
1380 	 * DON'T DO THIS. disabling interrupts floats the IRQ line
1381 	 * which generates spurious interrupts
1382 	 */
1383 
1384 	/*
1385 	 * Select the correct drive
1386 	 */
1387 	ddi_put8(ata_ctlp->ac_iohandle1, ata_ctlp->ac_drvhd,
1388 	    ata_drvp->ad_drive_bits);
1389 	ata_nsecwait(400);
1390 
1391 	/*
1392 	 * Disable interrupts from the drive
1393 	 */
1394 	ddi_put8(ata_ctlp->ac_iohandle2, ata_ctlp->ac_devctl,
1395 	    (ATDC_D3 | ATDC_NIEN));
1396 #endif
1397 
1398 	/* interface specific clean-ups */
1399 
1400 	if (ata_drvp->ad_flags & AD_ATAPI)
1401 		atapi_uninit_drive(ata_drvp);
1402 	else if (ata_drvp->ad_flags & AD_DISK)
1403 		ata_disk_uninit_drive(ata_drvp);
1404 
1405 	/* free drive struct */
1406 
1407 	kmem_free(ata_drvp, sizeof (ata_drv_t));
1408 }
1409 
1410 
1411 /*
1412  * ata_drive_type()
1413  *
1414  * The timeout values and exact sequence of checking is critical
1415  * especially for atapi device detection, and should not be changed lightly.
1416  *
1417  */
1418 static int
1419 ata_drive_type(
1420 	uchar_t		 drvhd,
1421 	ddi_acc_handle_t io_hdl1,
1422 	caddr_t		 ioaddr1,
1423 	ddi_acc_handle_t io_hdl2,
1424 	caddr_t		 ioaddr2,
1425 	struct ata_id	*ata_id_bufp)
1426 {
1427 	uchar_t	status;
1428 
1429 	ADBG_TRACE(("ata_drive_type entered\n"));
1430 
1431 	/*
1432 	 * select the appropriate drive and LUN
1433 	 */
1434 	ddi_put8(io_hdl1, (uchar_t *)ioaddr1 + AT_DRVHD, drvhd);
1435 	ata_nsecwait(400);
1436 
1437 	/*
1438 	 * make certain the drive is selected, and wait for not busy
1439 	 */
1440 	(void) ata_wait3(io_hdl2, ioaddr2, 0, ATS_BSY, 0x7f, 0, 0x7f, 0,
1441 	    5 * 1000000);
1442 
1443 	status = ddi_get8(io_hdl2, (uchar_t *)ioaddr2 + AT_ALTSTATUS);
1444 
1445 	if (status & ATS_BSY) {
1446 		ADBG_TRACE(("ata_drive_type 0x%p 0x%x\n", ioaddr1, status));
1447 		return (ATA_DEV_NONE);
1448 	}
1449 
1450 	if (ata_disk_id(io_hdl1, ioaddr1, io_hdl2, ioaddr2, ata_id_bufp))
1451 		return (ATA_DEV_DISK);
1452 
1453 	/*
1454 	 * No disk, check for atapi unit.
1455 	 */
1456 	if (!atapi_signature(io_hdl1, ioaddr1)) {
1457 #ifndef ATA_DISABLE_ATAPI_1_7
1458 		/*
1459 		 * Check for old (but prevalent) atapi 1.7B
1460 		 * spec device, the only known example is the
1461 		 * NEC CDR-260 (not 260R which is (mostly) ATAPI 1.2
1462 		 * compliant). This device has no signature
1463 		 * and requires conversion from hex to BCD
1464 		 * for some scsi audio commands.
1465 		 */
1466 		if (atapi_id(io_hdl1, ioaddr1, io_hdl2, ioaddr2, ata_id_bufp)) {
1467 			return (ATA_DEV_ATAPI);
1468 		}
1469 #endif
1470 		return (ATA_DEV_NONE);
1471 	}
1472 
1473 	if (atapi_id(io_hdl1, ioaddr1, io_hdl2, ioaddr2, ata_id_bufp)) {
1474 		return (ATA_DEV_ATAPI);
1475 	}
1476 
1477 	return (ATA_DEV_NONE);
1478 
1479 }
1480 
1481 /*
1482  * nsec-granularity time delay function
1483  */
1484 void
1485 ata_nsecwait(clock_t count)
1486 {
1487 	extern int tsc_gethrtime_initted;
1488 
1489 	if (tsc_gethrtime_initted) {
1490 		hrtime_t end = gethrtime() + count;
1491 
1492 		while (gethrtime() < end) {
1493 			SMT_PAUSE();
1494 		}
1495 	} else {
1496 		drv_usecwait(1 + (count / 1000));
1497 	}
1498 }
1499 
1500 
1501 /*
1502  * Wait for a register of a controller to achieve a specific state.
1503  * To return normally, all the bits in the first sub-mask must be ON,
1504  * all the bits in the second sub-mask must be OFF.
1505  * If timeout_usec microseconds pass without the controller achieving
1506  * the desired bit configuration, we return TRUE, else FALSE.
1507  */
1508 
1509 int ata_usec_delay = 10;
1510 
1511 int
1512 ata_wait(
1513 	ddi_acc_handle_t io_hdl,
1514 	caddr_t		ioaddr,
1515 	uchar_t		onbits,
1516 	uchar_t		offbits,
1517 	uint_t		timeout_usec)
1518 {
1519 	ushort_t val;
1520 	hrtime_t deadline = gethrtime() +
1521 	    (hrtime_t)timeout_usec * (NANOSEC / MICROSEC);
1522 
1523 
1524 	do  {
1525 		val = ddi_get8(io_hdl, (uchar_t *)ioaddr + AT_ALTSTATUS);
1526 		if ((val & onbits) == onbits && (val & offbits) == 0)
1527 			return (TRUE);
1528 		drv_usecwait(ata_usec_delay);
1529 	} while (gethrtime() < deadline);
1530 
1531 	return (FALSE);
1532 }
1533 
1534 
1535 /*
1536  *
1537  * This is a slightly more complicated version that checks
1538  * for error conditions and bails-out rather than looping
1539  * until the timeout expires
1540  */
1541 int
1542 ata_wait3(
1543 	ddi_acc_handle_t io_hdl,
1544 	caddr_t		ioaddr,
1545 	uchar_t		onbits1,
1546 	uchar_t		offbits1,
1547 	uchar_t		failure_onbits2,
1548 	uchar_t		failure_offbits2,
1549 	uchar_t		failure_onbits3,
1550 	uchar_t		failure_offbits3,
1551 	uint_t		timeout_usec)
1552 {
1553 	ushort_t val;
1554 	hrtime_t deadline = gethrtime() +
1555 	    (hrtime_t)timeout_usec * (NANOSEC / MICROSEC);
1556 
1557 	do  {
1558 		val = ddi_get8(io_hdl, (uchar_t *)ioaddr + AT_ALTSTATUS);
1559 
1560 		/*
1561 		 * check for expected condition
1562 		 */
1563 		if ((val & onbits1) == onbits1 && (val & offbits1) == 0)
1564 			return (TRUE);
1565 
1566 		/*
1567 		 * check for error conditions
1568 		 */
1569 		if ((val & failure_onbits2) == failure_onbits2 &&
1570 		    (val & failure_offbits2) == 0) {
1571 			return (FALSE);
1572 		}
1573 
1574 		if ((val & failure_onbits3) == failure_onbits3 &&
1575 		    (val & failure_offbits3) == 0) {
1576 			return (FALSE);
1577 		}
1578 
1579 		drv_usecwait(ata_usec_delay);
1580 	} while (gethrtime() < deadline);
1581 
1582 	return (FALSE);
1583 }
1584 
1585 
1586 /*
1587  *
1588  * low level routine for ata_disk_id() and atapi_id()
1589  *
1590  */
1591 
1592 int
1593 ata_id_common(
1594 	uchar_t		 id_cmd,
1595 	int		 expect_drdy,
1596 	ddi_acc_handle_t io_hdl1,
1597 	caddr_t		 ioaddr1,
1598 	ddi_acc_handle_t io_hdl2,
1599 	caddr_t		 ioaddr2,
1600 	struct ata_id	*aidp)
1601 {
1602 	uchar_t	status;
1603 
1604 	ADBG_TRACE(("ata_id_common entered\n"));
1605 
1606 	bzero(aidp, sizeof (struct ata_id));
1607 
1608 	/*
1609 	 * clear the features register
1610 	 */
1611 	ddi_put8(io_hdl1, (uchar_t *)ioaddr1 + AT_FEATURE, 0);
1612 
1613 	/*
1614 	 * Disable interrupts from the device.  When the ata
1615 	 * hardware is sharing its interrupt with another
1616 	 * device, the shared interrupt might have already been
1617 	 * unmasked in the interrupt controller and
1618 	 * triggering ata device interrupts will result in an
1619 	 * interrupt storm and a hung system.
1620 	 */
1621 	ddi_put8(io_hdl2, (uchar_t *)ioaddr2 + AT_DEVCTL, ATDC_D3 | ATDC_NIEN);
1622 
1623 	/*
1624 	 * issue IDENTIFY DEVICE or IDENTIFY PACKET DEVICE command
1625 	 */
1626 	ddi_put8(io_hdl1, (uchar_t *)ioaddr1 + AT_CMD, id_cmd);
1627 
1628 	/* wait for the busy bit to settle */
1629 	ata_nsecwait(400);
1630 
1631 	/*
1632 	 * read alternate status and check for conditions which
1633 	 * may indicate the drive is not present, to prevent getting
1634 	 * stuck in ata_wait3() below.
1635 	 */
1636 	status = ddi_get8(io_hdl2, (uchar_t *)ioaddr2 + AT_ALTSTATUS);
1637 
1638 	/*
1639 	 * 0x0, 0x7f, or ATS_DF can happen when no drive is present
1640 	 */
1641 	if ((status == 0x0) || (status == 0x7f) ||
1642 	    ((status & (ATS_BSY|ATS_DF)) == ATS_DF)) {
1643 		/* invalid status, can't be an ATA or ATAPI device */
1644 		return (FALSE);
1645 	}
1646 
1647 	/*
1648 	 * According to the ATA specification, some drives may have
1649 	 * to read the media to complete this command.  We need to
1650 	 * make sure we give them enough time to respond.
1651 	 */
1652 	(void) ata_wait3(io_hdl2, ioaddr2, 0, ATS_BSY,
1653 	    ATS_ERR, ATS_BSY, 0x7f, 0, 5 * 1000000);
1654 
1655 	/*
1656 	 * read the status byte and clear the pending interrupt
1657 	 */
1658 	status = ddi_get8(io_hdl1, (uchar_t *)ioaddr1 + AT_STATUS);
1659 
1660 	/*
1661 	 * this happens if there's no drive present
1662 	 */
1663 	if (status == 0xff || status == 0x7f) {
1664 		/* invalid status, can't be an ATA or ATAPI device */
1665 		return (FALSE);
1666 	}
1667 
1668 	if (status & ATS_BSY) {
1669 		ADBG_ERROR(("ata_id_common: BUSY status 0x%x error 0x%x\n",
1670 		    ddi_get8(io_hdl2, (uchar_t *)ioaddr2 +AT_ALTSTATUS),
1671 		    ddi_get8(io_hdl1, (uchar_t *)ioaddr1 + AT_ERROR)));
1672 		return (FALSE);
1673 	}
1674 
1675 	if (!(status & ATS_DRQ)) {
1676 		if (status & (ATS_ERR | ATS_DF)) {
1677 			return (FALSE);
1678 		}
1679 		/*
1680 		 * Give the drive another second to assert DRQ. Some older
1681 		 * drives de-assert BSY before asserting DRQ. Bail out
1682 		 * immediately if the status becomes 0x7f, which is invalid
1683 		 * value. It can happen when no drive is present.
1684 		 */
1685 		if (!ata_wait3(io_hdl2, ioaddr2, ATS_DRQ, ATS_BSY, 0x7f,
1686 		    ATS_BSY, 0x7f, ATS_BSY, 1000000)) {
1687 			ADBG_WARN(("ata_id_common: "
1688 			    "!DRQ status 0x%x error 0x%x\n",
1689 			    ddi_get8(io_hdl2, (uchar_t *)ioaddr2 +AT_ALTSTATUS),
1690 			    ddi_get8(io_hdl1, (uchar_t *)ioaddr1 + AT_ERROR)));
1691 			return (FALSE);
1692 		}
1693 	}
1694 
1695 	/*
1696 	 * transfer the data
1697 	 */
1698 	ddi_rep_get16(io_hdl1, (ushort_t *)aidp, (ushort_t *)ioaddr1 + AT_DATA,
1699 	    NBPSCTR >> 1, DDI_DEV_NO_AUTOINCR);
1700 
1701 	/* wait for the busy bit to settle */
1702 	ata_nsecwait(400);
1703 
1704 
1705 	/*
1706 	 * Wait for the drive to recognize I've read all the data.
1707 	 * Some drives have been observed to take as much as 3msec to
1708 	 * deassert DRQ after reading the data; allow 1 sec just in case.
1709 	 *
1710 	 * Note: some non-compliant ATAPI drives (e.g., NEC Multispin 6V,
1711 	 * CDR-1350A) don't assert DRDY. If we've made it this far we can
1712 	 * safely ignore the DRDY bit since the ATAPI Packet command
1713 	 * actually doesn't require it to ever be asserted.
1714 	 *
1715 	 * Bail out immediately if the status becomes 0x7f, which is invalid
1716 	 * value. It can happen when no drive is present.
1717 	 *
1718 	 */
1719 	if (!ata_wait3(io_hdl2, ioaddr2, (uchar_t)(expect_drdy ? ATS_DRDY : 0),
1720 	    (ATS_BSY | ATS_DRQ), 0x7f, ATS_BSY, 0x7f, ATS_BSY, 1000000)) {
1721 		ADBG_WARN(("ata_id_common: bad status 0x%x error 0x%x\n",
1722 		    ddi_get8(io_hdl2, (uchar_t *)ioaddr2 + AT_ALTSTATUS),
1723 		    ddi_get8(io_hdl1, (uchar_t *)ioaddr1 + AT_ERROR)));
1724 		return (FALSE);
1725 	}
1726 
1727 	/*
1728 	 * Check to see if the command aborted. This happens if
1729 	 * an IDENTIFY DEVICE command is issued to an ATAPI PACKET device,
1730 	 * or if an IDENTIFY PACKET DEVICE command is issued to an ATA
1731 	 * (non-PACKET) device.
1732 	 */
1733 	if (status & (ATS_DF | ATS_ERR)) {
1734 		ADBG_WARN(("ata_id_common: status 0x%x error 0x%x \n",
1735 		    ddi_get8(io_hdl2, (uchar_t *)ioaddr2 + AT_ALTSTATUS),
1736 		    ddi_get8(io_hdl1, (uchar_t *)ioaddr1 + AT_ERROR)));
1737 		return (FALSE);
1738 	}
1739 	return (TRUE);
1740 }
1741 
1742 
1743 /*
1744  * Low level routine to issue a non-data command and busy wait for
1745  * the completion status.
1746  */
1747 
1748 int
1749 ata_command(
1750 	ata_ctl_t *ata_ctlp,
1751 	ata_drv_t *ata_drvp,
1752 	int		 expect_drdy,
1753 	int		 silent,
1754 	uint_t		 busy_wait,
1755 	uchar_t		 cmd,
1756 	uchar_t		 feature,
1757 	uchar_t		 count,
1758 	uchar_t		 sector,
1759 	uchar_t		 head,
1760 	uchar_t		 cyl_low,
1761 	uchar_t		 cyl_hi)
1762 {
1763 	ddi_acc_handle_t io_hdl1 = ata_ctlp->ac_iohandle1;
1764 	ddi_acc_handle_t io_hdl2 = ata_ctlp->ac_iohandle2;
1765 	uchar_t		 status;
1766 
1767 	/* select the drive */
1768 	ddi_put8(io_hdl1, ata_ctlp->ac_drvhd, ata_drvp->ad_drive_bits);
1769 	ata_nsecwait(400);
1770 
1771 	/* make certain the drive selected */
1772 	if (!ata_wait(io_hdl2, ata_ctlp->ac_ioaddr2,
1773 	    (uchar_t)(expect_drdy ? ATS_DRDY : 0),
1774 	    ATS_BSY, busy_wait)) {
1775 		ADBG_ERROR(("ata_command: select failed "
1776 		    "DRDY 0x%x CMD 0x%x F 0x%x N 0x%x  "
1777 		    "S 0x%x H 0x%x CL 0x%x CH 0x%x\n",
1778 		    expect_drdy, cmd, feature, count,
1779 		    sector, head, cyl_low, cyl_hi));
1780 		return (FALSE);
1781 	}
1782 
1783 	/*
1784 	 * set all the regs
1785 	 */
1786 	ddi_put8(io_hdl1, ata_ctlp->ac_drvhd, (head | ata_drvp->ad_drive_bits));
1787 	ddi_put8(io_hdl1, ata_ctlp->ac_sect, sector);
1788 	ddi_put8(io_hdl1, ata_ctlp->ac_count, count);
1789 	ddi_put8(io_hdl1, ata_ctlp->ac_lcyl, cyl_low);
1790 	ddi_put8(io_hdl1, ata_ctlp->ac_hcyl, cyl_hi);
1791 	ddi_put8(io_hdl1, ata_ctlp->ac_feature, feature);
1792 
1793 	/* send the command */
1794 	ddi_put8(io_hdl1, ata_ctlp->ac_cmd, cmd);
1795 
1796 	/* wait for the busy bit to settle */
1797 	ata_nsecwait(400);
1798 
1799 	/* wait for not busy */
1800 	if (!ata_wait(io_hdl2, ata_ctlp->ac_ioaddr2, 0, ATS_BSY, busy_wait)) {
1801 		ADBG_ERROR(("ata_command: BSY too long!"
1802 		    "DRDY 0x%x CMD 0x%x F 0x%x N 0x%x  "
1803 		    "S 0x%x H 0x%x CL 0x%x CH 0x%x\n",
1804 		    expect_drdy, cmd, feature, count,
1805 		    sector, head, cyl_low, cyl_hi));
1806 		return (FALSE);
1807 	}
1808 
1809 	/*
1810 	 * wait for DRDY before continuing
1811 	 */
1812 	(void) ata_wait3(io_hdl2, ata_ctlp->ac_ioaddr2,
1813 	    ATS_DRDY, ATS_BSY, /* okay */
1814 	    ATS_ERR, ATS_BSY, /* cmd failed */
1815 	    ATS_DF, ATS_BSY, /* drive failed */
1816 	    busy_wait);
1817 
1818 	/* read status to clear IRQ, and check for error */
1819 	status =  ddi_get8(io_hdl1, ata_ctlp->ac_status);
1820 
1821 	if ((status & (ATS_BSY | ATS_DF | ATS_ERR)) == 0)
1822 		return (TRUE);
1823 
1824 	if (!silent) {
1825 		ADBG_ERROR(("ata_command status 0x%x error 0x%x "
1826 		    "DRDY 0x%x CMD 0x%x F 0x%x N 0x%x  "
1827 		    "S 0x%x H 0x%x CL 0x%x CH 0x%x\n",
1828 		    ddi_get8(io_hdl1, ata_ctlp->ac_status),
1829 		    ddi_get8(io_hdl1, ata_ctlp->ac_error),
1830 		    expect_drdy, cmd, feature, count,
1831 		    sector, head, cyl_low, cyl_hi));
1832 	}
1833 	return (FALSE);
1834 }
1835 
1836 
1837 
1838 /*
1839  *
1840  * Issue a SET FEATURES command
1841  *
1842  */
1843 
1844 int
1845 ata_set_feature(
1846 	ata_ctl_t *ata_ctlp,
1847 	ata_drv_t *ata_drvp,
1848 	uchar_t    feature,
1849 	uchar_t    value)
1850 {
1851 	int		 rc;
1852 
1853 	rc = ata_command(ata_ctlp, ata_drvp, TRUE, TRUE, ata_set_feature_wait,
1854 	    ATC_SET_FEAT, feature, value, 0, 0, 0, 0);
1855 	/* feature, count, sector, head, cyl_low, cyl_hi */
1856 
1857 	if (rc) {
1858 		return (TRUE);
1859 	}
1860 
1861 	ADBG_ERROR(("?ata_set_feature: (0x%x,0x%x) failed\n", feature, value));
1862 	return (FALSE);
1863 }
1864 
1865 
1866 
1867 /*
1868  *
1869  * Issue a FLUSH CACHE command
1870  *
1871  */
1872 
1873 static int
1874 ata_flush_cache(
1875 	ata_ctl_t *ata_ctlp,
1876 	ata_drv_t *ata_drvp)
1877 {
1878 	/* this command is optional so fail silently */
1879 	return (ata_command(ata_ctlp, ata_drvp, TRUE, TRUE,
1880 	    ata_flush_cache_wait,
1881 	    ATC_FLUSH_CACHE, 0, 0, 0, 0, 0, 0));
1882 }
1883 
1884 /*
1885  * ata_setup_ioaddr()
1886  *
1887  * Map the device registers and return the handles.
1888  *
1889  * If this is a ISA-ATA controller then only two handles are
1890  * initialized and returned.
1891  *
1892  * If this is a PCI-IDE controller than a third handle (for the
1893  * PCI-IDE Bus Mastering registers) is initialized and returned.
1894  *
1895  */
1896 
1897 static int
1898 ata_setup_ioaddr(
1899 	dev_info_t	 *dip,
1900 	ddi_acc_handle_t *handle1p,
1901 	caddr_t		 *addr1p,
1902 	ddi_acc_handle_t *handle2p,
1903 	caddr_t		 *addr2p,
1904 	ddi_acc_handle_t *bm_hdlp,
1905 	caddr_t		 *bm_addrp)
1906 {
1907 	ddi_device_acc_attr_t dev_attr;
1908 	int	 rnumber;
1909 	int	 rc;
1910 	off_t	 regsize;
1911 
1912 	/*
1913 	 * Make certain the controller is enabled and its regs are map-able
1914 	 *
1915 	 */
1916 	rc = ddi_dev_regsize(dip, 0, &regsize);
1917 	if (rc != DDI_SUCCESS || regsize <= AT_CMD) {
1918 		ADBG_INIT(("ata_setup_ioaddr(1): rc %d regsize %lld\n",
1919 		    rc, (long long)regsize));
1920 		return (FALSE);
1921 	}
1922 
1923 	rc = ddi_dev_regsize(dip, 1, &regsize);
1924 	if (rc != DDI_SUCCESS || regsize <= AT_ALTSTATUS) {
1925 		ADBG_INIT(("ata_setup_ioaddr(2): rc %d regsize %lld\n",
1926 		    rc, (long long)regsize));
1927 		return (FALSE);
1928 	}
1929 
1930 	/*
1931 	 * setup the device attribute structure for little-endian,
1932 	 * strict ordering access.
1933 	 */
1934 	dev_attr.devacc_attr_version = DDI_DEVICE_ATTR_V0;
1935 	dev_attr.devacc_attr_endian_flags = DDI_STRUCTURE_LE_ACC;
1936 	dev_attr.devacc_attr_dataorder = DDI_STRICTORDER_ACC;
1937 
1938 	*handle1p = NULL;
1939 	*handle2p = NULL;
1940 	*bm_hdlp = NULL;
1941 
1942 	/*
1943 	 * Determine whether this is a ISA, PNP-ISA, or PCI-IDE device
1944 	 */
1945 	if (ddi_prop_exists(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS, "pnp-csn")) {
1946 		/* it's PNP-ISA, skip over the extra reg tuple */
1947 		rnumber = 1;
1948 		goto not_pciide;
1949 	}
1950 
1951 	/* else, it's ISA or PCI-IDE, check further */
1952 	rnumber = 0;
1953 
1954 	if (!ata_is_pci(dip)) {
1955 		/*
1956 		 * If it's not a PCI-IDE, there are only two reg tuples
1957 		 * and the first one contains the I/O base (170 or 1f0)
1958 		 * rather than the controller instance number.
1959 		 */
1960 		ADBG_TRACE(("ata_setup_ioaddr !pci-ide\n"));
1961 		goto not_pciide;
1962 	}
1963 
1964 
1965 	/*
1966 	 * Map the correct half of the PCI-IDE Bus Master registers.
1967 	 * There's a single BAR that maps these registers for both
1968 	 * controller's in a dual-controller chip and it's upto my
1969 	 * parent nexus, pciide, to adjust which (based on my instance
1970 	 * number) half this call maps.
1971 	 */
1972 	rc = ddi_dev_regsize(dip, 2, &regsize);
1973 	if (rc != DDI_SUCCESS || regsize < 8) {
1974 		ADBG_INIT(("ata_setup_ioaddr(3): rc %d regsize %lld\n",
1975 		    rc, (long long)regsize));
1976 		goto not_pciide;
1977 	}
1978 
1979 	rc = ddi_regs_map_setup(dip, 2, bm_addrp, 0, 0, &dev_attr, bm_hdlp);
1980 
1981 	if (rc != DDI_SUCCESS) {
1982 		/* map failed, try to use in non-pci-ide mode */
1983 		ADBG_WARN(("ata_setup_ioaddr bus master map failed, rc=0x%x\n",
1984 		    rc));
1985 		*bm_hdlp = NULL;
1986 	}
1987 
1988 not_pciide:
1989 	/*
1990 	 * map the lower command block registers
1991 	 */
1992 
1993 	rc = ddi_regs_map_setup(dip, rnumber, addr1p, 0, 0, &dev_attr,
1994 	    handle1p);
1995 
1996 	if (rc != DDI_SUCCESS) {
1997 		cmn_err(CE_WARN, "ata: reg tuple 0 map failed, rc=0x%x\n", rc);
1998 		goto out1;
1999 	}
2000 
2001 	/*
2002 	 * If the controller is being used in compatibility mode
2003 	 * via /devices/isa/ata@1,{1f0,1f0}/..., the reg property
2004 	 * will specify zeros for the I/O ports for the PCI
2005 	 * instance.
2006 	 */
2007 	if (*addr1p == 0) {
2008 		ADBG_TRACE(("ata_setup_ioaddr ioaddr1 0\n"));
2009 		goto out2;
2010 	}
2011 
2012 	/*
2013 	 * map the upper control block registers
2014 	 */
2015 	rc = ddi_regs_map_setup(dip, rnumber + 1, addr2p, 0, 0, &dev_attr,
2016 	    handle2p);
2017 	if (rc == DDI_SUCCESS)
2018 		return (TRUE);
2019 
2020 	cmn_err(CE_WARN, "ata: reg tuple 1 map failed, rc=0x%x", rc);
2021 
2022 out2:
2023 	if (*handle1p != NULL) {
2024 		ddi_regs_map_free(handle1p);
2025 		*handle1p = NULL;
2026 	}
2027 
2028 out1:
2029 	if (*bm_hdlp != NULL) {
2030 		ddi_regs_map_free(bm_hdlp);
2031 		*bm_hdlp = NULL;
2032 	}
2033 	return (FALSE);
2034 
2035 }
2036 
2037 /*
2038  *
2039  * Currently, the only supported controllers are ones which
2040  * support the SFF-8038 Bus Mastering spec.
2041  *
2042  * Check the parent node's IEEE 1275 class-code property to
2043  * determine if it's an PCI-IDE instance which supports SFF-8038
2044  * Bus Mastering. It's perfectly valid to have a PCI-IDE controller
2045  * that doesn't do Bus Mastering. In that case, my interrupt handler
2046  * only uses the interrupt latch bit in PCI-IDE status register.
2047  * The assumption is that the programming interface byte of the
2048  * class-code property reflects the bus master DMA capability of
2049  * the controller.
2050  *
2051  * Whether the drive support supports the DMA option still needs
2052  * to be checked later. Each individual request also has to be
2053  * checked for alignment and size to decide whether to use the
2054  * DMA transfer mode.
2055  */
2056 
2057 static void
2058 ata_init_pciide(
2059 	dev_info_t	 *dip,
2060 	ata_ctl_t *ata_ctlp)
2061 {
2062 	uint_t	 class_code;
2063 	uchar_t	 status;
2064 
2065 	ata_cntrl_DMA_sel_msg = NULL;
2066 
2067 	if (ata_ctlp->ac_bmhandle == NULL) {
2068 		ata_ctlp->ac_pciide = FALSE;
2069 		ata_ctlp->ac_pciide_bm = FALSE;
2070 		ata_cntrl_DMA_sel_msg = "cntrl not Bus Master DMA capable";
2071 		return;
2072 	}
2073 
2074 	/*
2075 	 * check if it's a known bogus PCI-IDE chip
2076 	 */
2077 	if (ata_check_pciide_blacklist(dip, ATA_BL_BOGUS)) {
2078 		ADBG_WARN(("ata_setup_ioaddr pci-ide blacklist\n"));
2079 		ata_ctlp->ac_pciide = FALSE;
2080 		ata_ctlp->ac_pciide_bm = FALSE;
2081 		ata_cntrl_DMA_sel_msg = "cntrl blacklisted";
2082 		return;
2083 	}
2084 	ata_ctlp->ac_pciide = TRUE;
2085 
2086 	if (ata_check_pciide_blacklist(dip, ATA_BL_BMSTATREG_PIO_BROKEN)) {
2087 		ata_ctlp->ac_flags |= AC_BMSTATREG_PIO_BROKEN;
2088 	}
2089 
2090 	/*
2091 	 * check for a PCI-IDE chip with a broken DMA engine
2092 	 */
2093 	if (ata_check_pciide_blacklist(dip, ATA_BL_NODMA)) {
2094 		ata_ctlp->ac_pciide_bm = FALSE;
2095 		ata_cntrl_DMA_sel_msg =
2096 		    "cntrl blacklisted/DMA engine broken";
2097 		return;
2098 	}
2099 
2100 	/*
2101 	 * Check the Programming Interface register to determine
2102 	 * if this device supports PCI-IDE Bus Mastering. Some PCI-IDE
2103 	 * devices don't support Bus Mastering or DMA.
2104 	 * Since we are dealing with pre-qualified pci-ide controller,
2105 	 * check programming interface byte only.
2106 	 */
2107 
2108 	class_code = ddi_prop_get_int(DDI_DEV_T_ANY, ddi_get_parent(dip),
2109 	    DDI_PROP_DONTPASS, "class-code", 0);
2110 	if ((class_code & PCIIDE_BM_CAP_MASK) != PCIIDE_BM_CAP_MASK) {
2111 		ata_ctlp->ac_pciide_bm = FALSE;
2112 		ata_cntrl_DMA_sel_msg =
2113 		    "cntrl not Bus Master DMA capable";
2114 		return;
2115 	}
2116 
2117 	/*
2118 	 * Avoid doing DMA on "simplex" chips which share hardware
2119 	 * between channels
2120 	 */
2121 	status = ddi_get8(ata_ctlp->ac_bmhandle,
2122 	    (uchar_t *)ata_ctlp->ac_bmaddr + PCIIDE_BMISX_REG);
2123 	/*
2124 	 * Some motherboards have CSB5's that are wired "to emulate CSB4 mode".
2125 	 * In such a mode, the simplex bit is asserted,  but in fact testing
2126 	 * on such a motherboard has shown that the devices are not simplex
2127 	 * -- DMA can be used on both channels concurrently with no special
2128 	 * considerations.  For chips like this, we have the ATA_BL_NO_SIMPLEX
2129 	 * flag set to indicate that the value of the simplex bit can be
2130 	 * ignored.
2131 	 */
2132 
2133 	if (status & PCIIDE_BMISX_SIMPLEX) {
2134 		if (ata_check_pciide_blacklist(dip, ATA_BL_NO_SIMPLEX)) {
2135 			cmn_err(CE_WARN, "Ignoring false simplex bit \n");
2136 
2137 		} else {
2138 
2139 			int simplex_dma_channel, *rp, proplen, channel;
2140 			int dma_on = FALSE;
2141 
2142 			/*
2143 			 * By default,use DMA on channel 0 and PIO on channel
2144 			 * 1.  This can be switched by setting
2145 			 * ata-simplex-dma-channel to:
2146 			 *	0  DMA on channel 0 (default without this
2147 			 *			    property)
2148 			 *	1  DMA on channel 1
2149 			 *	any other value: DMA off on both channels.
2150 			 */
2151 			simplex_dma_channel = ata_prop_lookup_int(DDI_DEV_T_ANY,
2152 			    ata_ctlp->ac_dip, 0, "ata-simplex-dma-channel", 0);
2153 
2154 			if (ddi_prop_lookup_int_array(DDI_DEV_T_ANY,
2155 			    ata_ctlp->ac_dip, DDI_PROP_DONTPASS, "reg", &rp,
2156 			    (uint_t *)&proplen) == DDI_PROP_SUCCESS) {
2157 
2158 				channel = *rp;
2159 				ddi_prop_free(rp);
2160 
2161 				if (simplex_dma_channel == channel) {
2162 					cmn_err(CE_CONT, "?ata: simplex "
2163 					    "controller.  DMA on channel"
2164 					    "  %d PIO on channel %d",
2165 					    channel, channel ? 0:1);
2166 					dma_on = TRUE;
2167 				} else {
2168 					ata_cntrl_DMA_sel_msg =
2169 					    "simplex controller";
2170 				}
2171 			}
2172 
2173 			if (dma_on == FALSE) {
2174 				ata_ctlp->ac_pciide_bm = FALSE;
2175 
2176 				return;
2177 			}
2178 		}
2179 	}
2180 
2181 	/*
2182 	 * It's a compatible PCI-IDE Bus Mastering controller,
2183 	 * allocate and map the DMA Scatter/Gather list (PRDE table).
2184 	 */
2185 	if (ata_pciide_alloc(dip, ata_ctlp))
2186 		ata_ctlp->ac_pciide_bm = TRUE;
2187 	else {
2188 		ata_ctlp->ac_pciide_bm = FALSE;
2189 		ata_cntrl_DMA_sel_msg = "unable to init DMA S/G list";
2190 	}
2191 }
2192 
2193 /*
2194  *
2195  * Determine whether to enable DMA support for this drive.
2196  * The controller and the drive both have to support DMA.
2197  * The controller's capabilities were already checked in
2198  * ata_init_pciide(), now just check the drive's capabilities.
2199  *
2200  */
2201 
2202 static int
2203 ata_init_drive_pcidma(
2204 	ata_ctl_t *ata_ctlp,
2205 	ata_drv_t *ata_drvp,
2206 	dev_info_t *tdip)
2207 {
2208 	boolean_t dma;
2209 	boolean_t cd_dma;
2210 	boolean_t disk_dma;
2211 	boolean_t atapi_dma;
2212 	int ata_options;
2213 
2214 	ata_dev_DMA_sel_msg = NULL;
2215 
2216 	if (ata_ctlp->ac_pciide_bm != TRUE) {
2217 		ata_dev_DMA_sel_msg =
2218 		    "controller is not Bus Master capable";
2219 
2220 		return (ATA_DMA_OFF);
2221 	}
2222 
2223 	ata_options = ddi_prop_get_int(DDI_DEV_T_ANY, ata_ctlp->ac_dip,
2224 	    0, "ata-options", 0);
2225 
2226 	if (!(ata_options & ATA_OPTIONS_DMA)) {
2227 		/*
2228 		 * Either the ata-options property was not found or
2229 		 * DMA is not enabled by this property
2230 		 */
2231 		ata_dev_DMA_sel_msg =
2232 		    "disabled by \"ata-options\" property";
2233 
2234 		return (ATA_DMA_OFF);
2235 	}
2236 
2237 	if (ata_check_drive_blacklist(&ata_drvp->ad_id, ATA_BL_NODMA)) {
2238 		ata_dev_DMA_sel_msg = "device not DMA capable; blacklisted";
2239 
2240 		return (ATA_DMA_OFF);
2241 	}
2242 
2243 	/*
2244 	 * DMA mode is mandatory on ATA-3 (or newer) drives but is
2245 	 * optional on ATA-2 (or older) drives.
2246 	 *
2247 	 * On ATA-2 drives the ai_majorversion word will probably
2248 	 * be 0xffff or 0x0000, check the (now obsolete) DMA bit in
2249 	 * the capabilities word instead. The order of these tests
2250 	 * is important since an ATA-3 drive doesn't have to set
2251 	 * the DMA bit in the capabilities word.
2252 	 *
2253 	 */
2254 
2255 	if (!((ata_drvp->ad_id.ai_majorversion & 0x8000) == 0 &&
2256 	    ata_drvp->ad_id.ai_majorversion >= (1 << 2)) &&
2257 	    !(ata_drvp->ad_id.ai_cap & ATAC_DMA_SUPPORT)) {
2258 		ata_dev_DMA_sel_msg = "device not DMA capable";
2259 
2260 		return (ATA_DMA_OFF);
2261 	}
2262 
2263 	/*
2264 	 * Disable DMA for ATAPI devices on controllers known to
2265 	 * have trouble with ATAPI DMA
2266 	 */
2267 
2268 	if (ATAPIDRV(ata_drvp)) {
2269 		if (ata_check_pciide_blacklist(ata_ctlp->ac_dip,
2270 		    ATA_BL_ATAPI_NODMA)) {
2271 			ata_dev_DMA_sel_msg =
2272 			    "controller incapable of DMA for ATAPI device";
2273 
2274 			return (ATA_DMA_OFF);
2275 		}
2276 	}
2277 	dma = ata_prop_lookup_int(DDI_DEV_T_ANY, tdip,
2278 	    0, "ata-dma-enabled", TRUE);
2279 	disk_dma = ata_prop_lookup_int(DDI_DEV_T_ANY, tdip,
2280 	    0, "ata-disk-dma-enabled", TRUE);
2281 	cd_dma = ata_prop_lookup_int(DDI_DEV_T_ANY, tdip,
2282 	    0, "atapi-cd-dma-enabled", FALSE);
2283 	atapi_dma = ata_prop_lookup_int(DDI_DEV_T_ANY, tdip,
2284 	    0, "atapi-other-dma-enabled", TRUE);
2285 
2286 	if (dma == FALSE) {
2287 		cmn_err(CE_CONT, "?ata_init_drive_pcidma: "
2288 		    "DMA disabled by \"ata-dma-enabled\" property");
2289 		ata_dev_DMA_sel_msg = "disabled by prop ata-dma-enabled";
2290 
2291 		return (ATA_DMA_OFF);
2292 	}
2293 
2294 	if (IS_CDROM(ata_drvp) == TRUE) {
2295 		if (cd_dma == FALSE) {
2296 			ata_dev_DMA_sel_msg =
2297 			    "disabled.  Control with \"atapi-cd-dma-enabled\""
2298 			    " property";
2299 
2300 			return (ATA_DMA_OFF);
2301 		}
2302 
2303 	} else if (ATAPIDRV(ata_drvp) == FALSE) {
2304 		if (disk_dma == FALSE) {
2305 			ata_dev_DMA_sel_msg =
2306 			    "disabled by \"ata-disk-dma-enabled\" property";
2307 
2308 			return (ATA_DMA_OFF);
2309 		}
2310 
2311 	} else if (atapi_dma == FALSE) {
2312 			ata_dev_DMA_sel_msg =
2313 			    "disabled by \"atapi-other-dma-enabled\" property";
2314 
2315 			return (ATA_DMA_OFF);
2316 	}
2317 
2318 	return (ATA_DMA_ON);
2319 }
2320 
2321 
2322 
2323 /*
2324  * this compare routine squeezes out extra blanks and
2325  * returns TRUE if p1 matches the leftmost substring of p2
2326  */
2327 
2328 static int
2329 ata_strncmp(
2330 	char *p1,
2331 	char *p2,
2332 	int cnt)
2333 {
2334 
2335 	for (;;) {
2336 		/*
2337 		 * skip over any extra blanks in both strings
2338 		 */
2339 		while (*p1 != '\0' && *p1 == ' ')
2340 			p1++;
2341 
2342 		while (cnt != 0 && *p2 == ' ') {
2343 			p2++;
2344 			cnt--;
2345 		}
2346 
2347 		/*
2348 		 * compare the two strings
2349 		 */
2350 
2351 		if (cnt == 0 || *p1 != *p2)
2352 			break;
2353 
2354 		while (cnt > 0 && *p1 == *p2) {
2355 			p1++;
2356 			p2++;
2357 			cnt--;
2358 		}
2359 
2360 	}
2361 
2362 	/* return TRUE if both strings ended at same point */
2363 	return ((*p1 == '\0') ? TRUE : FALSE);
2364 }
2365 
2366 /*
2367  * Per PSARC/1997/281 create variant="atapi" property (if necessary)
2368  * on the target's dev_info node. Currently, the sd target driver
2369  * is the only driver which refers to this property.
2370  *
2371  * If the flag ata_id_debug is set also create the
2372  * the "ata" or "atapi" property on the target's dev_info node
2373  *
2374  */
2375 
2376 int
2377 ata_prop_create(
2378 	dev_info_t *tgt_dip,
2379 	ata_drv_t  *ata_drvp,
2380 	char	   *name)
2381 {
2382 	int	rc;
2383 
2384 	ADBG_TRACE(("ata_prop_create 0x%p 0x%p %s\n", tgt_dip, ata_drvp, name));
2385 
2386 	if (strcmp("atapi", name) == 0) {
2387 		rc =  ndi_prop_update_string(DDI_DEV_T_NONE, tgt_dip,
2388 		    "variant", name);
2389 		if (rc != DDI_PROP_SUCCESS)
2390 			return (FALSE);
2391 	}
2392 
2393 	if (!ata_id_debug)
2394 		return (TRUE);
2395 
2396 	rc =  ndi_prop_update_byte_array(DDI_DEV_T_NONE, tgt_dip, name,
2397 	    (uchar_t *)&ata_drvp->ad_id, sizeof (ata_drvp->ad_id));
2398 	if (rc != DDI_PROP_SUCCESS) {
2399 		ADBG_ERROR(("ata_prop_create failed, rc=%d\n", rc));
2400 	}
2401 	return (TRUE);
2402 }
2403 
2404 
2405 /* *********************************************************************** */
2406 /* *********************************************************************** */
2407 /* *********************************************************************** */
2408 
2409 /*
2410  * This state machine doesn't implement the ATAPI Optional Overlap
2411  * feature. You need that feature to efficiently support ATAPI
2412  * tape drives. See the 1394-ATA Tailgate spec (D97107), Figure 24,
2413  * for an example of how to add the necessary additional NextActions
2414  * and NextStates to this FSM and the atapi_fsm, in order to support
2415  * the Overlap Feature.
2416  */
2417 
2418 
2419 uchar_t ata_ctlr_fsm_NextAction[ATA_CTLR_NSTATES][ATA_CTLR_NFUNCS] = {
2420 /* --------------------- next action --------------------- | - current - */
2421 /* start0 --- start1 ---- intr ------ fini --- reset --- */
2422 { AC_START,   AC_START,	  AC_NADA,    AC_NADA, AC_RESET_I }, /* idle	 */
2423 { AC_BUSY,    AC_BUSY,	  AC_INTR,    AC_FINI, AC_RESET_A }, /* active0  */
2424 { AC_BUSY,    AC_BUSY,	  AC_INTR,    AC_FINI, AC_RESET_A }, /* active1  */
2425 };
2426 
2427 uchar_t ata_ctlr_fsm_NextState[ATA_CTLR_NSTATES][ATA_CTLR_NFUNCS] = {
2428 
2429 /* --------------------- next state --------------------- | - current - */
2430 /* start0 --- start1 ---- intr ------ fini --- reset --- */
2431 { AS_ACTIVE0, AS_ACTIVE1, AS_IDLE,    AS_IDLE, AS_IDLE	  }, /* idle    */
2432 { AS_ACTIVE0, AS_ACTIVE0, AS_ACTIVE0, AS_IDLE, AS_ACTIVE0 }, /* active0 */
2433 { AS_ACTIVE1, AS_ACTIVE1, AS_ACTIVE1, AS_IDLE, AS_ACTIVE1 }, /* active1 */
2434 };
2435 
2436 
2437 static int
2438 ata_ctlr_fsm(
2439 	uchar_t		 fsm_func,
2440 	ata_ctl_t	*ata_ctlp,
2441 	ata_drv_t	*ata_drvp,
2442 	ata_pkt_t	*ata_pktp,
2443 	int		*DoneFlgp)
2444 {
2445 	uchar_t	   action;
2446 	uchar_t	   current_state;
2447 	uchar_t	   next_state;
2448 	int	   rc;
2449 
2450 	current_state = ata_ctlp->ac_state;
2451 	action = ata_ctlr_fsm_NextAction[current_state][fsm_func];
2452 	next_state = ata_ctlr_fsm_NextState[current_state][fsm_func];
2453 
2454 	/*
2455 	 * Set the controller's new state
2456 	 */
2457 	ata_ctlp->ac_state = next_state;
2458 	switch (action) {
2459 
2460 	case AC_BUSY:
2461 		return (ATA_FSM_RC_BUSY);
2462 
2463 	case AC_NADA:
2464 		return (ATA_FSM_RC_OKAY);
2465 
2466 	case AC_START:
2467 		ASSERT(ata_ctlp->ac_active_pktp == NULL);
2468 		ASSERT(ata_ctlp->ac_active_drvp == NULL);
2469 
2470 		ata_ctlp->ac_active_pktp = ata_pktp;
2471 		ata_ctlp->ac_active_drvp = ata_drvp;
2472 
2473 		rc = (*ata_pktp->ap_start)(ata_ctlp, ata_drvp, ata_pktp);
2474 
2475 		if (rc == ATA_FSM_RC_BUSY) {
2476 			/* the request didn't start, GHD will requeue it */
2477 			ata_ctlp->ac_state = AS_IDLE;
2478 			ata_ctlp->ac_active_pktp = NULL;
2479 			ata_ctlp->ac_active_drvp = NULL;
2480 		}
2481 		return (rc);
2482 
2483 	case AC_INTR:
2484 		ASSERT(ata_ctlp->ac_active_pktp != NULL);
2485 		ASSERT(ata_ctlp->ac_active_drvp != NULL);
2486 
2487 		ata_drvp = ata_ctlp->ac_active_drvp;
2488 		ata_pktp = ata_ctlp->ac_active_pktp;
2489 		return ((*ata_pktp->ap_intr)(ata_ctlp, ata_drvp, ata_pktp));
2490 
2491 	case AC_RESET_A: /* Reset, controller active */
2492 		ASSERT(ata_ctlp->ac_active_pktp != NULL);
2493 		ASSERT(ata_ctlp->ac_active_drvp != NULL);
2494 
2495 		/* clean up the active request */
2496 		ata_pktp = ata_ctlp->ac_active_pktp;
2497 		ata_pktp->ap_flags |= AP_DEV_RESET | AP_BUS_RESET;
2498 
2499 		/* halt the DMA engine */
2500 		if (ata_pktp->ap_pciide_dma) {
2501 			ata_pciide_dma_stop(ata_ctlp);
2502 			(void) ata_pciide_status_clear(ata_ctlp);
2503 		}
2504 
2505 		/* Do a Software Reset to unwedge the bus */
2506 		if (!ata_software_reset(ata_ctlp)) {
2507 			return (ATA_FSM_RC_BUSY);
2508 		}
2509 
2510 		/* Then send a DEVICE RESET cmd to each ATAPI device */
2511 		atapi_fsm_reset(ata_ctlp);
2512 		return (ATA_FSM_RC_FINI);
2513 
2514 	case AC_RESET_I: /* Reset, controller idle */
2515 		/* Do a Software Reset to unwedge the bus */
2516 		if (!ata_software_reset(ata_ctlp)) {
2517 			return (ATA_FSM_RC_BUSY);
2518 		}
2519 
2520 		/* Then send a DEVICE RESET cmd to each ATAPI device */
2521 		atapi_fsm_reset(ata_ctlp);
2522 		return (ATA_FSM_RC_OKAY);
2523 
2524 	case AC_FINI:
2525 		break;
2526 	}
2527 
2528 	/*
2529 	 * AC_FINI, check ARQ needs to be started or finished
2530 	 */
2531 
2532 	ASSERT(action == AC_FINI);
2533 	ASSERT(ata_ctlp->ac_active_pktp != NULL);
2534 	ASSERT(ata_ctlp->ac_active_drvp != NULL);
2535 
2536 	/*
2537 	 * The active request is done now.
2538 	 * Disconnect the request from the controller and
2539 	 * add it to the done queue.
2540 	 */
2541 	ata_drvp = ata_ctlp->ac_active_drvp;
2542 	ata_pktp = ata_ctlp->ac_active_pktp;
2543 
2544 	/*
2545 	 * If ARQ pkt is done, get ptr to original pkt and wrap it up.
2546 	 */
2547 	if (ata_pktp == ata_ctlp->ac_arq_pktp) {
2548 		ata_pkt_t *arq_pktp;
2549 
2550 		ADBG_ARQ(("ata_ctlr_fsm 0x%p ARQ done\n", ata_ctlp));
2551 
2552 		arq_pktp = ata_pktp;
2553 		ata_pktp = ata_ctlp->ac_fault_pktp;
2554 		ata_ctlp->ac_fault_pktp = NULL;
2555 		if (arq_pktp->ap_flags & (AP_ERROR | AP_BUS_RESET))
2556 			ata_pktp->ap_flags |= AP_ARQ_ERROR;
2557 		else
2558 			ata_pktp->ap_flags |= AP_ARQ_OKAY;
2559 		goto all_done;
2560 	}
2561 
2562 
2563 #define	AP_ARQ_NEEDED	(AP_ARQ_ON_ERROR | AP_GOT_STATUS | AP_ERROR)
2564 
2565 	/*
2566 	 * Start ARQ pkt if necessary
2567 	 */
2568 	if ((ata_pktp->ap_flags & AP_ARQ_NEEDED) == AP_ARQ_NEEDED &&
2569 	    (ata_pktp->ap_status & ATS_ERR)) {
2570 
2571 		/* set controller state back to active */
2572 		ata_ctlp->ac_state = current_state;
2573 
2574 		/* try to start the ARQ pkt */
2575 		rc = ata_start_arq(ata_ctlp, ata_drvp, ata_pktp);
2576 
2577 		if (rc == ATA_FSM_RC_BUSY) {
2578 			ADBG_ARQ(("ata_ctlr_fsm 0x%p ARQ BUSY\n", ata_ctlp));
2579 			/* let the target driver handle the problem */
2580 			ata_ctlp->ac_state = AS_IDLE;
2581 			ata_ctlp->ac_active_pktp = NULL;
2582 			ata_ctlp->ac_active_drvp = NULL;
2583 			ata_ctlp->ac_fault_pktp = NULL;
2584 			goto all_done;
2585 		}
2586 
2587 		ADBG_ARQ(("ata_ctlr_fsm 0x%p ARQ started\n", ata_ctlp));
2588 		return (rc);
2589 	}
2590 
2591 	/*
2592 	 * Normal completion, no error status, and not an ARQ pkt,
2593 	 * just fall through.
2594 	 */
2595 
2596 all_done:
2597 
2598 	/*
2599 	 * wrap everything up and tie a ribbon around it
2600 	 */
2601 	ata_ctlp->ac_active_pktp = NULL;
2602 	ata_ctlp->ac_active_drvp = NULL;
2603 	if (APKT2GCMD(ata_pktp) != (gcmd_t *)0) {
2604 		ghd_complete(&ata_ctlp->ac_ccc, APKT2GCMD(ata_pktp));
2605 		if (DoneFlgp)
2606 			*DoneFlgp = TRUE;
2607 	}
2608 
2609 	return (ATA_FSM_RC_OKAY);
2610 }
2611 
2612 
2613 static int
2614 ata_start_arq(
2615 	ata_ctl_t *ata_ctlp,
2616 	ata_drv_t *ata_drvp,
2617 	ata_pkt_t *ata_pktp)
2618 {
2619 	ata_pkt_t		*arq_pktp;
2620 	int			 bytes;
2621 	uint_t			 senselen;
2622 
2623 	ADBG_ARQ(("ata_start_arq 0x%p ARQ needed\n", ata_ctlp));
2624 
2625 	/*
2626 	 * Determine just the size of the Request Sense Data buffer within
2627 	 * the scsi_arq_status structure.
2628 	 */
2629 #define	SIZEOF_ARQ_HEADER	(sizeof (struct scsi_arq_status)	\
2630 				- sizeof (struct scsi_extended_sense))
2631 	senselen = ata_pktp->ap_statuslen - SIZEOF_ARQ_HEADER;
2632 	ASSERT(senselen > 0);
2633 
2634 
2635 	/* save ptr to original pkt */
2636 	ata_ctlp->ac_fault_pktp = ata_pktp;
2637 
2638 	/* switch the controller's active pkt to the ARQ pkt */
2639 	arq_pktp = ata_ctlp->ac_arq_pktp;
2640 	ata_ctlp->ac_active_pktp = arq_pktp;
2641 
2642 	/* finish initializing the ARQ CDB */
2643 	ata_ctlp->ac_arq_cdb[1] = ata_drvp->ad_lun << 4;
2644 	ata_ctlp->ac_arq_cdb[4] = (uchar_t)senselen;
2645 
2646 	/* finish initializing the ARQ pkt */
2647 	arq_pktp->ap_v_addr = (caddr_t)&ata_pktp->ap_scbp->sts_sensedata;
2648 
2649 	arq_pktp->ap_resid = senselen;
2650 	arq_pktp->ap_flags = AP_ATAPI | AP_READ;
2651 	arq_pktp->ap_cdb_pad =
2652 	    ((unsigned)(ata_drvp->ad_cdb_len - arq_pktp->ap_cdb_len)) >> 1;
2653 
2654 	bytes = min(senselen, ATAPI_MAX_BYTES_PER_DRQ);
2655 	arq_pktp->ap_hicyl = (uchar_t)(bytes >> 8);
2656 	arq_pktp->ap_lwcyl = (uchar_t)bytes;
2657 
2658 	/*
2659 	 * This packet is shared by all drives on this controller
2660 	 * therefore we need to init the drive number on every ARQ.
2661 	 */
2662 	arq_pktp->ap_hd = ata_drvp->ad_drive_bits;
2663 
2664 	/* start it up */
2665 	return ((*arq_pktp->ap_start)(ata_ctlp, ata_drvp, arq_pktp));
2666 }
2667 
2668 /*
2669  *
2670  * reset the bus
2671  *
2672  */
2673 
2674 static int
2675 ata_reset_bus(
2676 	ata_ctl_t *ata_ctlp)
2677 {
2678 	int	watchdog;
2679 	uchar_t	drive;
2680 	int	rc = FALSE;
2681 	uchar_t	fsm_func;
2682 	int	DoneFlg = FALSE;
2683 
2684 	/*
2685 	 * Do a Software Reset to unwedge the bus, and send
2686 	 * ATAPI DEVICE RESET to each ATAPI drive.
2687 	 */
2688 	fsm_func = ATA_FSM_RESET;
2689 	for (watchdog = ata_reset_bus_watchdog; watchdog > 0; watchdog--) {
2690 		switch (ata_ctlr_fsm(fsm_func, ata_ctlp, NULL, NULL,
2691 		    &DoneFlg)) {
2692 		case ATA_FSM_RC_OKAY:
2693 			rc = TRUE;
2694 			goto fsm_done;
2695 
2696 		case ATA_FSM_RC_BUSY:
2697 			return (FALSE);
2698 
2699 		case ATA_FSM_RC_INTR:
2700 			fsm_func = ATA_FSM_INTR;
2701 			rc = TRUE;
2702 			continue;
2703 
2704 		case ATA_FSM_RC_FINI:
2705 			fsm_func = ATA_FSM_FINI;
2706 			rc = TRUE;
2707 			continue;
2708 		}
2709 	}
2710 	ADBG_WARN(("ata_reset_bus: watchdog\n"));
2711 
2712 fsm_done:
2713 
2714 	/*
2715 	 * Reinitialize the ATA drives
2716 	 */
2717 	for (drive = 0; drive < ATA_MAXTARG; drive++) {
2718 		ata_drv_t *ata_drvp;
2719 
2720 		if ((ata_drvp = CTL2DRV(ata_ctlp, drive, 0)) == NULL)
2721 			continue;
2722 
2723 		if (ATAPIDRV(ata_drvp))
2724 			continue;
2725 
2726 		/*
2727 		 * Reprogram the Read/Write Multiple block factor
2728 		 * and current geometry into the drive.
2729 		 */
2730 		if (!ata_disk_setup_parms(ata_ctlp, ata_drvp))
2731 			rc = FALSE;
2732 	}
2733 
2734 	/* If DoneFlg is TRUE, it means that ghd_complete() function */
2735 	/* has been already called. In this case ignore any errors and */
2736 	/* return TRUE to the caller, otherwise return the value of rc */
2737 	/* to the caller */
2738 	if (DoneFlg)
2739 		return (TRUE);
2740 	else
2741 		return (rc);
2742 }
2743 
2744 
2745 /*
2746  *
2747  * Low level routine to toggle the Software Reset bit
2748  *
2749  */
2750 
2751 static int
2752 ata_software_reset(
2753 	ata_ctl_t *ata_ctlp)
2754 {
2755 	ddi_acc_handle_t io_hdl1 = ata_ctlp->ac_iohandle1;
2756 	ddi_acc_handle_t io_hdl2 = ata_ctlp->ac_iohandle2;
2757 	hrtime_t deadline;
2758 	uint_t usecs_left;
2759 
2760 	ADBG_TRACE(("ata_reset_bus entered\n"));
2761 
2762 	/* disable interrupts and turn the software reset bit on */
2763 	ddi_put8(io_hdl2, ata_ctlp->ac_devctl, (ATDC_D3 | ATDC_SRST));
2764 
2765 	/* why 30 milliseconds, the ATA/ATAPI-4 spec says 5 usec. */
2766 	drv_usecwait(30000);
2767 
2768 	/* turn the software reset bit back off */
2769 	ddi_put8(io_hdl2, ata_ctlp->ac_devctl, ATDC_D3);
2770 
2771 	/*
2772 	 * Wait for the controller to assert BUSY status.
2773 	 * I don't think 300 msecs is correct. The ATA/ATAPI-4
2774 	 * spec says 400 nsecs, (and 2 msecs if device
2775 	 * was in sleep mode; but we don't put drives to sleep
2776 	 * so it probably doesn't matter).
2777 	 */
2778 	drv_usecwait(300000);
2779 
2780 	/*
2781 	 * If drive 0 exists the test for completion is simple
2782 	 */
2783 	deadline = gethrtime() + ((hrtime_t)31 * NANOSEC);
2784 
2785 	if (CTL2DRV(ata_ctlp, 0, 0)) {
2786 		goto wait_for_not_busy;
2787 	}
2788 
2789 	ASSERT(CTL2DRV(ata_ctlp, 1, 0) != NULL);
2790 
2791 	/*
2792 	 * This must be a single device configuration, with drive 1
2793 	 * only. This complicates the test for completion because
2794 	 * issuing the software reset just caused drive 1 to
2795 	 * deselect. With drive 1 deselected, if I just read the
2796 	 * status register to test the BSY bit I get garbage, but
2797 	 * I can't re-select drive 1 until I'm certain the BSY bit
2798 	 * is de-asserted. Catch-22.
2799 	 *
2800 	 * In ATA/ATAPI-4, rev 15, section 9.16.2, it says to handle
2801 	 * this situation like this:
2802 	 */
2803 
2804 	/* give up if the drive doesn't settle within 31 seconds */
2805 	while (gethrtime() < deadline) {
2806 		/*
2807 		 * delay 10msec each time around the loop
2808 		 */
2809 		drv_usecwait(10000);
2810 
2811 		/*
2812 		 * try to select drive 1
2813 		 */
2814 		ddi_put8(io_hdl1, ata_ctlp->ac_drvhd, ATDH_DRIVE1);
2815 
2816 		ddi_put8(io_hdl1, ata_ctlp->ac_sect, 0x55);
2817 		ddi_put8(io_hdl1, ata_ctlp->ac_sect, 0xaa);
2818 		if (ddi_get8(io_hdl1, ata_ctlp->ac_sect) != 0xaa)
2819 			continue;
2820 
2821 		ddi_put8(io_hdl1, ata_ctlp->ac_count, 0x55);
2822 		ddi_put8(io_hdl1, ata_ctlp->ac_count, 0xaa);
2823 		if (ddi_get8(io_hdl1, ata_ctlp->ac_count) != 0xaa)
2824 			continue;
2825 
2826 		goto wait_for_not_busy;
2827 	}
2828 	return (FALSE);
2829 
2830 wait_for_not_busy:
2831 
2832 	/*
2833 	 * Now wait up to 31 seconds for BUSY to clear.
2834 	 */
2835 	usecs_left = (deadline - gethrtime()) / 1000;
2836 	(void) ata_wait3(io_hdl2, ata_ctlp->ac_ioaddr2, 0, ATS_BSY,
2837 	    ATS_ERR, ATS_BSY, ATS_DF, ATS_BSY, usecs_left);
2838 
2839 	return (TRUE);
2840 }
2841 
2842 /*
2843  *
2844  * DDI interrupt handler
2845  *
2846  */
2847 
2848 static uint_t
2849 ata_intr(
2850 	caddr_t arg)
2851 {
2852 	ata_ctl_t *ata_ctlp;
2853 	int	   one_shot = 1;
2854 
2855 	ata_ctlp = (ata_ctl_t *)arg;
2856 
2857 	return (ghd_intr(&ata_ctlp->ac_ccc, (void *)&one_shot));
2858 }
2859 
2860 
2861 /*
2862  *
2863  * GHD ccc_get_status callback
2864  *
2865  */
2866 
2867 static int
2868 ata_get_status(
2869 	void *hba_handle,
2870 	void *intr_status)
2871 {
2872 	ata_ctl_t *ata_ctlp = (ata_ctl_t *)hba_handle;
2873 	uchar_t	   status;
2874 
2875 	ADBG_TRACE(("ata_get_status entered\n"));
2876 
2877 	/*
2878 	 * ignore interrupts before ata_attach completes
2879 	 */
2880 	if (!(ata_ctlp->ac_flags & AC_ATTACHED))
2881 		return (FALSE);
2882 
2883 	/*
2884 	 * can't be interrupt pending if nothing active
2885 	 */
2886 	switch (ata_ctlp->ac_state) {
2887 	case AS_IDLE:
2888 		return (FALSE);
2889 	case AS_ACTIVE0:
2890 	case AS_ACTIVE1:
2891 		ASSERT(ata_ctlp->ac_active_drvp != NULL);
2892 		ASSERT(ata_ctlp->ac_active_pktp != NULL);
2893 		break;
2894 	}
2895 
2896 	/*
2897 	 * If this is a PCI-IDE controller, check the PCI-IDE controller's
2898 	 * interrupt status latch. But don't clear it yet.
2899 	 *
2900 	 * AC_BMSTATREG_PIO_BROKEN flag is used currently for
2901 	 * CMD chips with device id 0x646. Since the interrupt bit on
2902 	 * Bus master IDE register is not usable when in PIO mode,
2903 	 * this chip is treated as a legacy device for interrupt
2904 	 * indication.  The following code for CMD
2905 	 * chips may need to be revisited when we enable support for dma.
2906 	 *
2907 	 * CHANGE: DMA is not disabled for these devices. BM intr bit is
2908 	 * checked only if there was DMA used or BM intr is useable on PIO,
2909 	 * else treat it as before - as legacy device.
2910 	 */
2911 
2912 	if ((ata_ctlp->ac_pciide) &&
2913 	    ((ata_ctlp->ac_pciide_bm != FALSE) &&
2914 	    ((ata_ctlp->ac_active_pktp->ap_pciide_dma == TRUE) ||
2915 	    !(ata_ctlp->ac_flags & AC_BMSTATREG_PIO_BROKEN)))) {
2916 
2917 		if (!ata_pciide_status_pending(ata_ctlp))
2918 			return (FALSE);
2919 	} else {
2920 		/*
2921 		 * Interrupts from legacy ATA/IDE controllers are
2922 		 * edge-triggered but the dumb legacy ATA/IDE controllers
2923 		 * and drives don't have an interrupt status bit.
2924 		 *
2925 		 * Use a one_shot variable to make sure we only return
2926 		 * one status per interrupt.
2927 		 */
2928 		if (intr_status != NULL) {
2929 			int *one_shot = (int *)intr_status;
2930 
2931 			if (*one_shot == 1)
2932 				*one_shot = 0;
2933 			else
2934 				return (FALSE);
2935 		}
2936 	}
2937 
2938 	/* check if device is still busy */
2939 
2940 	status = ddi_get8(ata_ctlp->ac_iohandle2, ata_ctlp->ac_altstatus);
2941 	if (status & ATS_BSY)
2942 		return (FALSE);
2943 	return (TRUE);
2944 }
2945 
2946 
2947 /*
2948  *
2949  * get the current status and clear the IRQ
2950  *
2951  */
2952 
2953 int
2954 ata_get_status_clear_intr(
2955 	ata_ctl_t *ata_ctlp,
2956 	ata_pkt_t *ata_pktp)
2957 {
2958 	uchar_t	status;
2959 
2960 	/*
2961 	 * Here's where we clear the PCI-IDE interrupt latch. If this
2962 	 * request used DMA mode then we also have to check and clear
2963 	 * the DMA error latch at the same time.
2964 	 */
2965 
2966 	if (ata_pktp->ap_pciide_dma) {
2967 		if (ata_pciide_status_dmacheck_clear(ata_ctlp))
2968 			ata_pktp->ap_flags |= AP_ERROR | AP_TRAN_ERROR;
2969 	} else if ((ata_ctlp->ac_pciide) &&
2970 	    !(ata_ctlp->ac_flags & AC_BMSTATREG_PIO_BROKEN)) {
2971 		/*
2972 		 * Some requests don't use DMA mode and therefore won't
2973 		 * set the DMA error latch, but we still have to clear
2974 		 * the interrupt latch.
2975 		 * Controllers with broken BM intr in PIO mode do not go
2976 		 * through this path.
2977 		 */
2978 		(void) ata_pciide_status_clear(ata_ctlp);
2979 	}
2980 
2981 	/*
2982 	 * this clears the drive's interrupt
2983 	 */
2984 	status = ddi_get8(ata_ctlp->ac_iohandle1, ata_ctlp->ac_status);
2985 	ADBG_TRACE(("ata_get_status_clear_intr: 0x%x\n", status));
2986 	return (status);
2987 }
2988 
2989 
2990 
2991 /*
2992  *
2993  * GHD interrupt handler
2994  *
2995  */
2996 
2997 /* ARGSUSED */
2998 static void
2999 ata_process_intr(
3000 	void *hba_handle,
3001 	void *intr_status)
3002 {
3003 	ata_ctl_t *ata_ctlp = (ata_ctl_t *)hba_handle;
3004 	int	   watchdog;
3005 	uchar_t	   fsm_func;
3006 	int	   rc;
3007 
3008 	ADBG_TRACE(("ata_process_intr entered\n"));
3009 
3010 	/*
3011 	 * process the ATA or ATAPI interrupt
3012 	 */
3013 
3014 	fsm_func = ATA_FSM_INTR;
3015 	for (watchdog = ata_process_intr_watchdog; watchdog > 0; watchdog--) {
3016 		rc =  ata_ctlr_fsm(fsm_func, ata_ctlp, NULL, NULL, NULL);
3017 
3018 		switch (rc) {
3019 		case ATA_FSM_RC_OKAY:
3020 			return;
3021 
3022 		case ATA_FSM_RC_BUSY:	/* wait for the next interrupt */
3023 			return;
3024 
3025 		case ATA_FSM_RC_INTR:	/* re-invoke the FSM */
3026 			fsm_func = ATA_FSM_INTR;
3027 			break;
3028 
3029 		case ATA_FSM_RC_FINI:	/* move a request to done Q */
3030 			fsm_func = ATA_FSM_FINI;
3031 			break;
3032 		}
3033 	}
3034 	ADBG_WARN(("ata_process_intr: watchdog\n"));
3035 }
3036 
3037 
3038 
3039 /*
3040  *
3041  * GHD ccc_hba_start callback
3042  *
3043  */
3044 
3045 static int
3046 ata_hba_start(
3047 	void *hba_handle,
3048 	gcmd_t *gcmdp)
3049 {
3050 	ata_ctl_t *ata_ctlp;
3051 	ata_drv_t *ata_drvp;
3052 	ata_pkt_t *ata_pktp;
3053 	uchar_t	   fsm_func;
3054 	int	   request_started;
3055 	int	   watchdog;
3056 
3057 	ADBG_TRACE(("ata_hba_start entered\n"));
3058 
3059 	ata_ctlp = (ata_ctl_t *)hba_handle;
3060 
3061 	if (ata_ctlp->ac_active_drvp != NULL) {
3062 		ADBG_WARN(("ata_hba_start drvp not null\n"));
3063 		return (FALSE);
3064 	}
3065 	if (ata_ctlp->ac_active_pktp != NULL) {
3066 		ADBG_WARN(("ata_hba_start pktp not null\n"));
3067 		return (FALSE);
3068 	}
3069 
3070 	ata_pktp = GCMD2APKT(gcmdp);
3071 	ata_drvp = GCMD2DRV(gcmdp);
3072 
3073 	/*
3074 	 * which drive?
3075 	 */
3076 	if (ata_drvp->ad_targ == 0)
3077 		fsm_func = ATA_FSM_START0;
3078 	else
3079 		fsm_func = ATA_FSM_START1;
3080 
3081 	/*
3082 	 * start the request
3083 	 */
3084 	request_started = FALSE;
3085 	for (watchdog = ata_hba_start_watchdog; watchdog > 0; watchdog--) {
3086 		switch (ata_ctlr_fsm(fsm_func, ata_ctlp, ata_drvp, ata_pktp,
3087 		    NULL)) {
3088 		case ATA_FSM_RC_OKAY:
3089 			request_started = TRUE;
3090 			goto fsm_done;
3091 
3092 		case ATA_FSM_RC_BUSY:
3093 			/* if first time, tell GHD to requeue the request */
3094 			goto fsm_done;
3095 
3096 		case ATA_FSM_RC_INTR:
3097 			/*
3098 			 * The start function polled for the next
3099 			 * bus phase, now fake an interrupt to process
3100 			 * the next action.
3101 			 */
3102 			request_started = TRUE;
3103 			fsm_func = ATA_FSM_INTR;
3104 			ata_drvp = NULL;
3105 			ata_pktp = NULL;
3106 			break;
3107 
3108 		case ATA_FSM_RC_FINI: /* move request to the done queue */
3109 			request_started = TRUE;
3110 			fsm_func = ATA_FSM_FINI;
3111 			ata_drvp = NULL;
3112 			ata_pktp = NULL;
3113 			break;
3114 		}
3115 	}
3116 	ADBG_WARN(("ata_hba_start: watchdog\n"));
3117 
3118 fsm_done:
3119 	return (request_started);
3120 
3121 }
3122 
3123 static int
3124 ata_check_pciide_blacklist(
3125 	dev_info_t *dip,
3126 	uint_t flags)
3127 {
3128 	ushort_t vendorid;
3129 	ushort_t deviceid;
3130 	pcibl_t	*blp;
3131 	int	*propp;
3132 	uint_t	 count;
3133 	int	 rc;
3134 
3135 
3136 	vendorid = ddi_prop_get_int(DDI_DEV_T_ANY, ddi_get_parent(dip),
3137 	    DDI_PROP_DONTPASS, "vendor-id", 0);
3138 	deviceid = ddi_prop_get_int(DDI_DEV_T_ANY, ddi_get_parent(dip),
3139 	    DDI_PROP_DONTPASS, "device-id", 0);
3140 
3141 	/*
3142 	 * first check for a match in the "pci-ide-blacklist" property
3143 	 */
3144 	rc = ddi_prop_lookup_int_array(DDI_DEV_T_ANY, dip, 0,
3145 	    "pci-ide-blacklist", &propp, &count);
3146 
3147 	if (rc == DDI_PROP_SUCCESS) {
3148 		count = (count * sizeof (uint_t)) / sizeof (pcibl_t);
3149 		blp = (pcibl_t *)propp;
3150 		while (count--) {
3151 			/* check for matching ID */
3152 			if ((vendorid & blp->b_vmask)
3153 			    != (blp->b_vendorid & blp->b_vmask)) {
3154 				blp++;
3155 				continue;
3156 			}
3157 			if ((deviceid & blp->b_dmask)
3158 			    != (blp->b_deviceid & blp->b_dmask)) {
3159 				blp++;
3160 				continue;
3161 			}
3162 
3163 			/* got a match */
3164 			if (blp->b_flags & flags) {
3165 				ddi_prop_free(propp);
3166 				return (TRUE);
3167 			} else {
3168 				ddi_prop_free(propp);
3169 				return (FALSE);
3170 			}
3171 		}
3172 		ddi_prop_free(propp);
3173 	}
3174 
3175 	/*
3176 	 * then check the built-in blacklist
3177 	 */
3178 	for (blp = ata_pciide_blacklist; blp->b_vendorid; blp++) {
3179 		if ((vendorid & blp->b_vmask) != blp->b_vendorid)
3180 			continue;
3181 		if ((deviceid & blp->b_dmask) != blp->b_deviceid)
3182 			continue;
3183 		if (!(blp->b_flags & flags))
3184 			continue;
3185 		return (TRUE);
3186 	}
3187 	return (FALSE);
3188 }
3189 
3190 int
3191 ata_check_drive_blacklist(
3192 	struct ata_id *aidp,
3193 	uint_t flags)
3194 {
3195 	atabl_t	*blp;
3196 
3197 	for (blp = ata_drive_blacklist; blp->b_model != NULL; blp++) {
3198 		if (!ata_strncmp(blp->b_model, aidp->ai_model,
3199 		    sizeof (aidp->ai_model)))
3200 			continue;
3201 		if (blp->b_fw != NULL) {
3202 			if (!ata_strncmp(blp->b_fw, aidp->ai_fw,
3203 			    sizeof (aidp->ai_fw)))
3204 				continue;
3205 		}
3206 		if (blp->b_flags & flags)
3207 			return (TRUE);
3208 		return (FALSE);
3209 	}
3210 	return (FALSE);
3211 }
3212 
3213 /*
3214  * Queue a request to perform some sort of internally
3215  * generated command. When this request packet reaches
3216  * the front of the queue (*func)() is invoked.
3217  *
3218  */
3219 
3220 int
3221 ata_queue_cmd(
3222 	int	  (*func)(ata_ctl_t *, ata_drv_t *, ata_pkt_t *),
3223 	void	  *arg,
3224 	ata_ctl_t *ata_ctlp,
3225 	ata_drv_t *ata_drvp,
3226 	gtgt_t	  *gtgtp)
3227 {
3228 	ata_pkt_t	*ata_pktp;
3229 	gcmd_t		*gcmdp;
3230 	int		 rc;
3231 
3232 	if (!(gcmdp = ghd_gcmd_alloc(gtgtp, sizeof (*ata_pktp), TRUE))) {
3233 		ADBG_ERROR(("atapi_id_update alloc failed\n"));
3234 		return (FALSE);
3235 	}
3236 
3237 
3238 	/* set the back ptr from the ata_pkt to the gcmd_t */
3239 	ata_pktp = GCMD2APKT(gcmdp);
3240 	ata_pktp->ap_gcmdp = gcmdp;
3241 	ata_pktp->ap_hd = ata_drvp->ad_drive_bits;
3242 	ata_pktp->ap_bytes_per_block = ata_drvp->ad_bytes_per_block;
3243 
3244 	/*
3245 	 * over-ride the default start function
3246 	 */
3247 	ata_pktp = GCMD2APKT(gcmdp);
3248 	ata_pktp->ap_start = func;
3249 	ata_pktp->ap_complete = NULL;
3250 	ata_pktp->ap_v_addr = (caddr_t)arg;
3251 
3252 	/*
3253 	 * add it to the queue, when it gets to the front the
3254 	 * ap_start function is called.
3255 	 */
3256 	rc = ghd_transport(&ata_ctlp->ac_ccc, gcmdp, gcmdp->cmd_gtgtp,
3257 	    0, TRUE, NULL);
3258 
3259 	if (rc != TRAN_ACCEPT) {
3260 		/* this should never, ever happen */
3261 		return (FALSE);
3262 	}
3263 
3264 	if (ata_pktp->ap_flags & AP_ERROR)
3265 		return (FALSE);
3266 	return (TRUE);
3267 }
3268 
3269 /*
3270  * Check if this drive has the "revert to defaults" bug
3271  * PSARC 2001/500 and 2001/xxx - check for the properties
3272  * ata-revert-to-defaults and atarvrt-<diskmodel> before
3273  * examining the blacklist.
3274  * <diskmodel> is made from the model number reported by Identify Drive
3275  * with uppercase letters converted to lowercase and all characters
3276  * except letters, digits, ".", "_", and "-" deleted.
3277  * Return value:
3278  *	TRUE:	enable revert to defaults
3279  *	FALSE:	disable revert to defaults
3280  *
3281  * NOTE: revert to power on defaults that includes reverting to MDMA
3282  * mode is allowed by ATA-6 & ATA-7 specs.
3283  * Therefore drives exhibiting this behaviour are not violating the spec.
3284  * Furthermore, the spec explicitly says that after the soft reset
3285  * host should check the current setting of the device features.
3286  * Correctly working BIOS would therefore reprogram either the drive
3287  * and/or the host controller to match transfer modes.
3288  * Devices with ATA_BL_NORVRT flag will be removed from
3289  * the ata_blacklist.
3290  * The default behaviour will be - no revert to power-on defaults
3291  * for all devices. The property is retained in case the user
3292  * explicitly requests revert-to-defaults before reboot.
3293  */
3294 
3295 #define	ATA_REVERT_PROP_PREFIX "revert-"
3296 #define	ATA_REVERT_PROP_GLOBAL	"ata-revert-to-defaults"
3297 /* room for prefix + model number + terminating NUL character */
3298 #define	PROP_BUF_SIZE	(sizeof (ATA_REVERT_PROP_PREFIX) + \
3299 				sizeof (aidp->ai_model) + 1)
3300 #define	PROP_LEN_MAX	(31)
3301 
3302 static int
3303 ata_check_revert_to_defaults(
3304 	ata_drv_t *ata_drvp)
3305 {
3306 	struct ata_id	*aidp = &ata_drvp->ad_id;
3307 	ata_ctl_t	*ata_ctlp = ata_drvp->ad_ctlp;
3308 	char	 prop_buf[PROP_BUF_SIZE];
3309 	int	 i, j;
3310 	int	 propval;
3311 
3312 	/* put prefix into the buffer */
3313 	(void) strcpy(prop_buf, ATA_REVERT_PROP_PREFIX);
3314 	j = strlen(prop_buf);
3315 
3316 	/* append the model number, leaving out invalid characters */
3317 	for (i = 0;  i < sizeof (aidp->ai_model);  ++i) {
3318 		char c = aidp->ai_model[i];
3319 		if (c >= 'A' && c <= 'Z')	/* uppercase -> lower */
3320 			c = c - 'A' + 'a';
3321 		if (c >= 'a' && c <= 'z' || c >= '0' && c <= '9' ||
3322 		    c == '.' || c == '_' || c == '-')
3323 			prop_buf[j++] = c;
3324 		if (c == '\0')
3325 			break;
3326 	}
3327 
3328 	/* make sure there's a terminating NUL character */
3329 	if (j >= PROP_LEN_MAX)
3330 		j =  PROP_LEN_MAX;
3331 	prop_buf[j] = '\0';
3332 
3333 	/* look for a disk-specific "revert" property" */
3334 	propval = ddi_getprop(DDI_DEV_T_ANY, ata_ctlp->ac_dip,
3335 	    DDI_PROP_DONTPASS, prop_buf, -1);
3336 	if (propval == 0)
3337 		return (FALSE);
3338 	else if (propval != -1)
3339 		return (TRUE);
3340 
3341 	/* look for a global "revert" property" */
3342 	propval = ddi_getprop(DDI_DEV_T_ANY, ata_ctlp->ac_dip,
3343 	    0, ATA_REVERT_PROP_GLOBAL, -1);
3344 	if (propval == 0)
3345 		return (FALSE);
3346 	else if (propval != -1)
3347 		return (TRUE);
3348 
3349 	return (FALSE);
3350 }
3351 
3352 void
3353 ata_show_transfer_mode(ata_ctl_t *ata_ctlp, ata_drv_t *ata_drvp)
3354 {
3355 	int i;
3356 
3357 	if (ata_ctlp->ac_pciide_bm == FALSE ||
3358 	    ata_drvp->ad_pciide_dma != ATA_DMA_ON) {
3359 		if (ata_cntrl_DMA_sel_msg) {
3360 			ATAPRT((
3361 			    "?\tATA DMA off: %s\n", ata_cntrl_DMA_sel_msg));
3362 		} else if (ata_dev_DMA_sel_msg) {
3363 			ATAPRT(("?\tATA DMA off: %s\n", ata_dev_DMA_sel_msg));
3364 		}
3365 		ATAPRT(("?\tPIO mode %d selected\n",
3366 		    (ata_drvp->ad_id.ai_advpiomode & ATAC_ADVPIO_4_SUP) ==
3367 		    ATAC_ADVPIO_4_SUP ? 4 : 3));
3368 	} else {
3369 		/* Using DMA */
3370 		if (ata_drvp->ad_id.ai_dworddma & ATAC_MDMA_SEL_MASK) {
3371 			/*
3372 			 * Rely on the fact that either dwdma or udma is
3373 			 * selected, not both.
3374 			 */
3375 			ATAPRT(("?\tMultiwordDMA mode %d selected\n",
3376 			    (ata_drvp->ad_id.ai_dworddma & ATAC_MDMA_2_SEL) ==
3377 			    ATAC_MDMA_2_SEL ? 2 :
3378 			    (ata_drvp->ad_id.ai_dworddma & ATAC_MDMA_1_SEL) ==
3379 			    ATAC_MDMA_1_SEL ? 1 : 0));
3380 		} else {
3381 			for (i = 0; i <= 6; i++) {
3382 				if (ata_drvp->ad_id.ai_ultradma &
3383 				    (1 << (i + 8))) {
3384 					ATAPRT((
3385 					    "?\tUltraDMA mode %d selected\n",
3386 					    i));
3387 					break;
3388 				}
3389 			}
3390 		}
3391 	}
3392 }
3393 
3394 /*
3395  * Controller-specific operation pointers.
3396  * Should be extended as needed - init only for now
3397  */
3398 struct ata_ctl_spec_ops {
3399 	uint_t	(*cs_init)(dev_info_t *, ushort_t, ushort_t); /* ctlr init */
3400 };
3401 
3402 
3403 struct ata_ctl_spec {
3404 	ushort_t		cs_vendor_id;
3405 	ushort_t		cs_device_id;
3406 	struct ata_ctl_spec_ops	*cs_ops;
3407 };
3408 
3409 /* Sil3XXX-specific functions (init only for now) */
3410 struct ata_ctl_spec_ops sil3xxx_ops = {
3411 	&sil3xxx_init_controller	/* Sil3XXX cntrl initialization */
3412 };
3413 
3414 
3415 struct ata_ctl_spec ata_cntrls_spec[] = {
3416 	{0x1095, 0x3114, &sil3xxx_ops},
3417 	{0x1095, 0x3512, &sil3xxx_ops},
3418 	{0x1095, 0x3112, &sil3xxx_ops},
3419 	{0, 0, NULL}		/* List must end with cs_ops set to NULL */
3420 };
3421 
3422 /*
3423  * Do controller specific initialization if necessary.
3424  * Pick-up controller specific functions.
3425  */
3426 
3427 int
3428 ata_spec_init_controller(dev_info_t *dip)
3429 {
3430 	ushort_t		vendor_id;
3431 	ushort_t		device_id;
3432 	struct ata_ctl_spec	*ctlsp;
3433 
3434 	vendor_id = ddi_prop_get_int(DDI_DEV_T_ANY, ddi_get_parent(dip),
3435 	    DDI_PROP_DONTPASS, "vendor-id", 0);
3436 	device_id = ddi_prop_get_int(DDI_DEV_T_ANY, ddi_get_parent(dip),
3437 	    DDI_PROP_DONTPASS, "device-id", 0);
3438 
3439 	/* Locate controller specific ops, if they exist */
3440 	ctlsp = ata_cntrls_spec;
3441 	while (ctlsp->cs_ops != NULL) {
3442 		if (ctlsp->cs_vendor_id == vendor_id &&
3443 		    ctlsp->cs_device_id == device_id)
3444 			break;
3445 		ctlsp++;
3446 	}
3447 
3448 	if (ctlsp->cs_ops != NULL) {
3449 		if (ctlsp->cs_ops->cs_init != NULL) {
3450 			/* Initialize controller */
3451 			if ((*(ctlsp->cs_ops->cs_init))
3452 			    (dip, vendor_id, device_id) != TRUE) {
3453 				cmn_err(CE_WARN,
3454 				    "pci%4x,%4x cntrl specific "
3455 				    "initialization failed",
3456 				    vendor_id, device_id);
3457 				return (FALSE);
3458 			}
3459 		}
3460 	}
3461 	return (TRUE);
3462 }
3463 
3464 /*
3465  * this routine works like ddi_prop_get_int, except that it works on
3466  * a string property that contains ascii representations
3467  * of an integer.
3468  * If the property is not found, the default value is returned.
3469  */
3470 static int
3471 ata_prop_lookup_int(dev_t match_dev, dev_info_t *dip,
3472 	uint_t flags, char *name, int defvalue)
3473 {
3474 
3475 	char *bufp, *cp;
3476 	int rc = defvalue;
3477 	int proprc;
3478 
3479 	proprc = ddi_prop_lookup_string(match_dev, dip,
3480 	    flags, name, &bufp);
3481 
3482 	if (proprc == DDI_PROP_SUCCESS) {
3483 		cp = bufp;
3484 		rc = stoi(&cp);
3485 		ddi_prop_free(bufp);
3486 	} else {
3487 		/*
3488 		 * see if property is encoded as an int instead of string.
3489 		 */
3490 		rc = ddi_prop_get_int(match_dev, dip, flags, name, defvalue);
3491 	}
3492 
3493 	return (rc);
3494 }
3495 
3496 /*
3497  * Initialize the power management components
3498  */
3499 static void
3500 ata_init_pm(dev_info_t *dip)
3501 {
3502 	char		pmc_name[16];
3503 	char		*pmc[] = {
3504 				NULL,
3505 				"0=Sleep (PCI D3 State)",
3506 				"3=PowerOn (PCI D0 State)",
3507 				NULL
3508 			};
3509 	int		instance;
3510 	ata_ctl_t 	*ata_ctlp;
3511 
3512 
3513 	instance = ddi_get_instance(dip);
3514 	ata_ctlp = ddi_get_soft_state(ata_state, instance);
3515 	ata_ctlp->ac_pm_support = 0;
3516 
3517 	/* check PCI capabilities */
3518 	if (!ata_is_pci(dip))
3519 		return;
3520 
3521 	(void) sprintf(pmc_name, "NAME=ata%d", instance);
3522 	pmc[0] = pmc_name;
3523 
3524 #ifdef	ATA_USE_AUTOPM
3525 	if (ddi_prop_update_string_array(DDI_DEV_T_NONE, dip,
3526 	    "pm-components", pmc, 3) != DDI_PROP_SUCCESS) {
3527 		return;
3528 	}
3529 #endif
3530 
3531 	ata_ctlp->ac_pm_support = 1;
3532 	ata_ctlp->ac_pm_level = PM_LEVEL_D0;
3533 
3534 	ATA_BUSY_COMPONENT(dip, 0);
3535 	if (ATA_RAISE_POWER(dip, 0, PM_LEVEL_D0) != DDI_SUCCESS) {
3536 		(void) ddi_prop_remove(DDI_DEV_T_NONE, dip, "pm-components");
3537 	}
3538 	ATA_IDLE_COMPONENT(dip, 0);
3539 }
3540 
3541 /*
3542  * resume the hard drive
3543  */
3544 static void
3545 ata_resume_drive(ata_drv_t *ata_drvp)
3546 {
3547 	ata_ctl_t *ata_ctlp = ata_drvp->ad_ctlp;
3548 	int drive_type;
3549 	struct ata_id id;
3550 
3551 	ADBG_TRACE(("ata_resume_drive entered\n"));
3552 
3553 	drive_type = ata_drive_type(ata_drvp->ad_drive_bits,
3554 	    ata_ctlp->ac_iohandle1, ata_ctlp->ac_ioaddr1,
3555 	    ata_ctlp->ac_iohandle2, ata_ctlp->ac_ioaddr2,
3556 	    &id);
3557 	if (drive_type == ATA_DEV_NONE)
3558 		return;
3559 
3560 	if (!ATAPIDRV(ata_drvp)) {
3561 		/* Reset Ultra DMA mode */
3562 		ata_reset_dma_mode(ata_drvp);
3563 		if (!ata_disk_setup_parms(ata_ctlp, ata_drvp))
3564 			return;
3565 	} else {
3566 		(void) atapi_init_drive(ata_drvp);
3567 		if (ata_drvp->ad_dma_mode != 0) {
3568 			(void) atapi_reset_dma_mode(ata_drvp, FALSE);
3569 			if (!ata_check_dma_mode(ata_drvp))
3570 				atapi_reset_dma_mode(ata_drvp, TRUE);
3571 			if (ata_drvp->ad_id.ai_ultradma !=
3572 			    ata_drvp->ad_dma_mode) {
3573 				ata_drvp->ad_pciide_dma = ATA_DMA_OFF;
3574 			} else {
3575 				ata_drvp->ad_pciide_dma = ATA_DMA_ON;
3576 			}
3577 		}
3578 	}
3579 	(void) ata_set_feature(ata_ctlp, ata_drvp, ATSF_DIS_REVPOD, 0);
3580 
3581 }
3582 
3583 /*
3584  * resume routine, it will be run when get the command
3585  * DDI_RESUME at attach(9E) from system power management
3586  */
3587 static int
3588 ata_resume(dev_info_t *dip)
3589 {
3590 	int		instance;
3591 	ata_ctl_t 	*ata_ctlp;
3592 	ddi_acc_handle_t io_hdl2;
3593 	caddr_t		ioaddr2;
3594 
3595 	instance = ddi_get_instance(dip);
3596 	ata_ctlp = ddi_get_soft_state(ata_state, instance);
3597 
3598 	if (!ata_ctlp->ac_pm_support)
3599 		return (DDI_FAILURE);
3600 	if (ata_ctlp->ac_pm_level == PM_LEVEL_D0)
3601 		return (DDI_SUCCESS);
3602 
3603 	ATA_BUSY_COMPONENT(dip, 0);
3604 	if (ATA_RAISE_POWER(dip, 0, PM_LEVEL_D0) == DDI_FAILURE)
3605 		return (DDI_FAILURE);
3606 	ATA_IDLE_COMPONENT(dip, 0);
3607 
3608 	/* enable interrupts from the device */
3609 	io_hdl2 = ata_ctlp->ac_iohandle2;
3610 	ioaddr2 = ata_ctlp->ac_ioaddr2;
3611 	ddi_put8(io_hdl2, (uchar_t *)ioaddr2 + AT_DEVCTL, ATDC_D3);
3612 	ata_ctlp->ac_pm_level = PM_LEVEL_D0;
3613 
3614 	return (DDI_SUCCESS);
3615 }
3616 
3617 /*
3618  * suspend routine, it will be run when get the command
3619  * DDI_SUSPEND at detach(9E) from system power management
3620  */
3621 static int
3622 ata_suspend(dev_info_t *dip)
3623 {
3624 	int		instance;
3625 	ata_ctl_t 	*ata_ctlp;
3626 	ddi_acc_handle_t io_hdl2;
3627 
3628 	instance = ddi_get_instance(dip);
3629 	ata_ctlp = ddi_get_soft_state(ata_state, instance);
3630 
3631 	if (!ata_ctlp->ac_pm_support)
3632 		return (DDI_FAILURE);
3633 	if (ata_ctlp->ac_pm_level == PM_LEVEL_D3)
3634 		return (DDI_SUCCESS);
3635 
3636 	/* disable interrupts and turn the software reset bit on */
3637 	io_hdl2 = ata_ctlp->ac_iohandle2;
3638 	ddi_put8(io_hdl2, ata_ctlp->ac_devctl, (ATDC_D3 | ATDC_SRST));
3639 
3640 	(void) ata_reset_bus(ata_ctlp);
3641 	(void) ata_change_power(dip, ATC_SLEEP);
3642 	ata_ctlp->ac_pm_level = PM_LEVEL_D3;
3643 	return (DDI_SUCCESS);
3644 }
3645 
3646 int ata_save_pci_config = 0;
3647 /*
3648  * ata specific power management entry point, it was
3649  * used to change the power management component
3650  */
3651 static int
3652 ata_power(dev_info_t *dip, int component, int level)
3653 {
3654 	int		instance;
3655 	ata_ctl_t 	*ata_ctlp;
3656 	uint8_t		cmd;
3657 
3658 	ADBG_TRACE(("ata_power entered, component = %d, level = %d\n",
3659 	    component, level));
3660 
3661 	instance = ddi_get_instance(dip);
3662 	ata_ctlp = ddi_get_soft_state(ata_state, instance);
3663 	if (ata_ctlp == NULL || component != 0)
3664 		return (DDI_FAILURE);
3665 
3666 	if (!ata_ctlp->ac_pm_support)
3667 		return (DDI_FAILURE);
3668 
3669 	if (ata_ctlp->ac_pm_level == level)
3670 		return (DDI_SUCCESS);
3671 
3672 	switch (level) {
3673 	case PM_LEVEL_D0:
3674 		if (ata_save_pci_config)
3675 			(void) pci_restore_config_regs(dip);
3676 		ata_ctlp->ac_pm_level = PM_LEVEL_D0;
3677 		cmd = ATC_IDLE_IMMED;
3678 		break;
3679 	case PM_LEVEL_D3:
3680 		if (ata_save_pci_config)
3681 			(void) pci_save_config_regs(dip);
3682 		ata_ctlp->ac_pm_level = PM_LEVEL_D3;
3683 		cmd = ATC_SLEEP;
3684 		break;
3685 	default:
3686 		return (DDI_FAILURE);
3687 	}
3688 	return (ata_change_power(dip, cmd));
3689 }
3690 
3691 /*
3692  * sent commands to ata controller to change the power level
3693  */
3694 static int
3695 ata_change_power(dev_info_t *dip, uint8_t cmd)
3696 {
3697 	int		instance;
3698 	ata_ctl_t	*ata_ctlp;
3699 	ata_drv_t	*ata_drvp;
3700 	uchar_t		targ;
3701 	struct ata_id	id;
3702 	uchar_t		lun;
3703 	uchar_t		lastlun;
3704 	struct ata_id	*aidp;
3705 
3706 	ADBG_TRACE(("ata_change_power entered, cmd = %d\n", cmd));
3707 
3708 	instance = ddi_get_instance(dip);
3709 	ata_ctlp = ddi_get_soft_state(ata_state, instance);
3710 
3711 	/*
3712 	 * Issue command on each disk device on the bus.
3713 	 */
3714 	if (cmd == ATC_SLEEP) {
3715 		for (targ = 0; targ < ATA_MAXTARG; targ++) {
3716 			ata_drvp = CTL2DRV(ata_ctlp, targ, 0);
3717 			if (ata_drvp == NULL)
3718 				continue;
3719 			if (ata_drvp->ad_dma_cap == 0 &&
3720 			    ata_drvp->ad_pciide_dma == ATA_DMA_ON) {
3721 				aidp = &ata_drvp->ad_id;
3722 				if ((aidp->ai_validinfo & ATAC_VALIDINFO_83) &&
3723 				    (aidp->ai_ultradma & ATAC_UDMA_SEL_MASK)) {
3724 					ata_drvp->ad_dma_cap =
3725 					    ATA_DMA_ULTRAMODE;
3726 					ata_drvp->ad_dma_mode =
3727 					    aidp->ai_ultradma;
3728 				} else if (aidp->ai_dworddma &
3729 				    ATAC_MDMA_SEL_MASK) {
3730 					ata_drvp->ad_dma_cap =
3731 					    ATA_DMA_MWORDMODE;
3732 					ata_drvp->ad_dma_mode =
3733 					    aidp->ai_dworddma;
3734 				}
3735 			}
3736 			if (ata_drive_type(ata_drvp->ad_drive_bits,
3737 			    ata_ctlp->ac_iohandle1, ata_ctlp->ac_ioaddr1,
3738 			    ata_ctlp->ac_iohandle2, ata_ctlp->ac_ioaddr2,
3739 			    &id) != ATA_DEV_DISK)
3740 				continue;
3741 			(void) ata_flush_cache(ata_ctlp, ata_drvp);
3742 			if (!ata_command(ata_ctlp, ata_drvp, TRUE, TRUE,
3743 			    5 * 1000000, cmd, 0, 0, 0, 0, 0, 0)) {
3744 				cmn_err(CE_WARN, "!ata_controller - Can not "
3745 				    "put drive %d in to power mode %u",
3746 				    targ, cmd);
3747 				(void) ata_devo_reset(dip, DDI_RESET_FORCE);
3748 				return (DDI_FAILURE);
3749 			}
3750 		}
3751 		return (DDI_SUCCESS);
3752 	}
3753 
3754 	(void) ata_software_reset(ata_ctlp);
3755 	for (targ = 0; targ < ATA_MAXTARG; targ++) {
3756 		ata_drvp = CTL2DRV(ata_ctlp, targ, 0);
3757 		if (ata_drvp == NULL)
3758 			continue;
3759 		ata_resume_drive(ata_drvp);
3760 
3761 		if (ATAPIDRV(ata_drvp))
3762 			lastlun = ata_drvp->ad_id.ai_lastlun;
3763 		else
3764 			lastlun = 0;
3765 		if (!ata_enable_atapi_luns)
3766 			lastlun = 0;
3767 		for (lun = 1; lun <= lastlun && lun < ATA_MAXLUN; lun++) {
3768 			ata_drvp = CTL2DRV(ata_ctlp, targ, lun);
3769 			if (ata_drvp != NULL)
3770 				ata_resume_drive(ata_drvp);
3771 		}
3772 	}
3773 
3774 	return (DDI_SUCCESS);
3775 }
3776 
3777 /*
3778  * return 1 when ata controller is a pci device,
3779  * otherwise return 0
3780  */
3781 static int
3782 ata_is_pci(dev_info_t *dip)
3783 {
3784 	int rc;
3785 	char *bufp;
3786 	int ispci;
3787 
3788 	rc = ddi_prop_lookup_string(DDI_DEV_T_ANY, ddi_get_parent(dip),
3789 	    DDI_PROP_DONTPASS, "device_type", &bufp);
3790 
3791 	if (rc != DDI_PROP_SUCCESS) {
3792 		ADBG_ERROR(("ata_is_pci !device_type\n"));
3793 		return (0);
3794 	}
3795 
3796 	ispci = (strcmp(bufp, "pci-ide") == 0);
3797 
3798 	ddi_prop_free(bufp);
3799 
3800 	return (ispci);
3801 }
3802 
3803 /*
3804  * Disable DMA for this drive
3805  */
3806 static void
3807 ata_disable_DMA(ata_drv_t *ata_drvp)
3808 {
3809 	struct ata_id *aidp;
3810 	char buf[sizeof (aidp->ai_model) +2];
3811 	int i;
3812 
3813 	if (ata_drvp == NULL)
3814 		return;
3815 
3816 	if (ata_drvp->ad_pciide_dma == ATA_DMA_OFF)
3817 		return;
3818 
3819 	ata_drvp->ad_pciide_dma = ATA_DMA_OFF;
3820 
3821 	/* Print the message */
3822 	buf[0] = '\0';
3823 	aidp = &ata_drvp->ad_id;
3824 	if (aidp != NULL) {
3825 		(void) strncpy(buf, aidp->ai_model, sizeof (aidp->ai_model));
3826 		buf[sizeof (aidp->ai_model) -1] = '\0';
3827 		for (i = sizeof (aidp->ai_model) - 2; buf[i] == ' '; i--)
3828 			buf[i] = '\0';
3829 	}
3830 	cmn_err(CE_CONT,
3831 	    "?DMA disabled on %s target=%d, lun=%d due to DMA errors,",
3832 	    buf, ata_drvp->ad_targ, ata_drvp->ad_lun);
3833 	cmn_err(CE_CONT, "?most likely due to the CF-to-IDE adapter.");
3834 }
3835 
3836 /*
3837  * Check and select DMA mode
3838  *
3839  * TRUE is returned when set feature is called successfully,
3840  * otherwise return FALSE
3841  */
3842 int
3843 ata_set_dma_mode(ata_ctl_t *ata_ctlp, ata_drv_t *ata_drvp)
3844 {
3845 	struct ata_id *aidp;
3846 	int mode, rval = FALSE;
3847 	uint8_t subcmd;
3848 
3849 	aidp = &ata_drvp->ad_id;
3850 
3851 	/* Return directly if DMA is not supported */
3852 	if (!(aidp->ai_cap & ATAC_DMA_SUPPORT))
3853 		return (rval);
3854 
3855 	/* Return if DMA mode is already selected */
3856 	if (((aidp->ai_validinfo & ATAC_VALIDINFO_83) &&
3857 	    (aidp->ai_ultradma & ATAC_UDMA_SEL_MASK)) ||
3858 	    (aidp->ai_dworddma & ATAC_MDMA_SEL_MASK))
3859 		return (rval);
3860 
3861 	/* First check Ultra DMA mode if no DMA is selected */
3862 	if ((aidp->ai_validinfo & ATAC_VALIDINFO_83) &&
3863 	    (aidp->ai_ultradma & ATAC_UDMA_SUP_MASK)) {
3864 		for (mode = 6; mode >= 0; --mode) {
3865 			if (aidp->ai_ultradma & (1 << mode))
3866 				break;
3867 		}
3868 		subcmd = ATF_XFRMOD_UDMA;
3869 
3870 	} else if (aidp->ai_dworddma & ATAC_MDMA_SUP_MASK) {
3871 		/* Then check multi-word DMA mode */
3872 		for (mode = 2; mode >= 0; --mode) {
3873 			if (aidp->ai_dworddma & (1 << mode))
3874 				break;
3875 		}
3876 		subcmd = ATF_XFRMOD_MDMA;
3877 
3878 	} else {
3879 		return (rval);
3880 	}
3881 
3882 	rval = ata_set_feature(ata_ctlp, ata_drvp, ATSF_SET_XFRMOD,
3883 	    subcmd|mode);
3884 
3885 	return (rval);
3886 }
3887 
3888 /*
3889  * Reset Ultra DMA mode / MWDMA mode
3890  */
3891 void
3892 ata_reset_dma_mode(ata_drv_t *ata_drvp)
3893 {
3894 	uint8_t	subcmd;
3895 	int	mode;
3896 	ata_ctl_t *ata_ctlp = ata_drvp->ad_ctlp;
3897 
3898 	switch (ata_drvp->ad_dma_cap) {
3899 	case ATA_DMA_ULTRAMODE:
3900 		subcmd = ATF_XFRMOD_UDMA;
3901 		for (mode = 0; mode <= 6; mode++) {
3902 			if (ata_drvp->ad_dma_mode & (1 << (mode + 8)))
3903 				break;
3904 		}
3905 		break;
3906 	case ATA_DMA_MWORDMODE:
3907 		subcmd = ATF_XFRMOD_MDMA;
3908 		mode = ((ata_drvp->ad_dma_mode & ATAC_MDMA_2_SEL) ==
3909 		    ATAC_MDMA_2_SEL ? 2 :
3910 		    (ata_drvp->ad_dma_mode & ATAC_MDMA_1_SEL) ==
3911 		    ATAC_MDMA_1_SEL ? 1 : 0);
3912 		break;
3913 	default:
3914 		return;
3915 	}
3916 
3917 	(void) ata_set_feature(ata_ctlp, ata_drvp, ATSF_SET_XFRMOD,
3918 	    (subcmd | mode));
3919 }
3920 
3921 /*
3922  * Check DMA mode is the same with saved info
3923  * return value: 0 - not same
3924  *		 1 - same
3925  */
3926 static int
3927 ata_check_dma_mode(ata_drv_t *ata_drvp)
3928 {
3929 	struct ata_id	*aidp;
3930 
3931 	aidp = &ata_drvp->ad_id;
3932 	switch (ata_drvp->ad_dma_cap) {
3933 	case ATA_DMA_ULTRAMODE:
3934 		if ((aidp->ai_validinfo & ATAC_VALIDINFO_83) &&
3935 		    (aidp->ai_ultradma & ATAC_UDMA_SEL_MASK) &&
3936 		    (aidp->ai_ultradma == ata_drvp->ad_dma_mode))
3937 			break;
3938 		else
3939 			return (0);
3940 	case ATA_DMA_MWORDMODE:
3941 		if ((aidp->ai_dworddma & ATAC_MDMA_SEL_MASK) &&
3942 		    (aidp->ai_dworddma == ata_drvp->ad_dma_mode))
3943 			break;
3944 		else
3945 			return (0);
3946 	default:
3947 		return (0);
3948 	}
3949 	return (1);
3950 }
3951