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