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