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, >GTP2ATAP(gtgtp)->ac_ccc, gtgtp); 878 879 ddi_set_driver_private(cdip, NULL); 880 ddi_set_name_addr(cdip, NULL); 881 return (DDI_SUCCESS); 882 } 883 884 default: 885 return (DDI_FAILURE); 886 } 887 } 888 889 890 /* 891 * 892 * DADA abort entry point - not currently used by dadk 893 * 894 */ 895 896 /* ARGSUSED */ 897 static int 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(>GTP2ATAP(gtgtp)->ac_ccc, gcmdp, bp, flags, 1420 callback, arg, >GTP2ATATGTP(gtgtp)->at_dma_attr)) { 1421 ata_pktp->ap_v_addr = 0; 1422 return (pktp); 1423 } 1424 1425 skip_dma_setup: 1426 bp_mapin(bp); 1427 ata_pktp->ap_v_addr = bp->b_un.b_addr; 1428 return (pktp); 1429 } 1430 1431 1432 1433 /* 1434 * 1435 * DADA memfree entry point 1436 * 1437 */ 1438 1439 /* 1440 * 1157317 sez that drivers shouldn't call bp_mapout(), as either 1441 * biodone() or biowait() will end up doing it, but after they 1442 * call bp->b_iodone(), which is a necessary sequence for 1443 * Online Disk Suite. However, the DDI group wants to rethink 1444 * bp_mapin()/bp_mapout() and how they should behave in the 1445 * presence of layered drivers, etc. For the moment, fix 1446 * the OLDS problem by removing the bp_mapout() call. 1447 */ 1448 1449 #define BUG_1157317 1450 1451 /* ARGSUSED */ 1452 static void 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(>GTP2ATAP(gtgtp)->ac_ccc, gcmdp, 1569 byte_count, ATA_DMA_NSEGS, &byte_count) == FALSE) || 1570 (byte_count == 0)) { 1571 ADBG_ERROR(("ata_disk_iosetup: byte count zero\n")); 1572 return (NULL); 1573 } 1574 sec_count = byte_count >> SCTRSHFT; 1575 } 1576 1577 /* 1578 * In the non-48-bit mode addressing (CHS and LBA28) the sector 1579 * count is a 8-bit value and the sector count 0 represents 256 1580 * sectors. 1581 * In the extended addressing (LBA48) the sector count is a 16-bit 1582 * value, so max_transfer 0x100 cannot be truncated to 8-bits 1583 * because this would represent a zero sector count. 1584 */ 1585 ata_pktp->ap_count = (ushort_t)sec_count; 1586 if (!(ata_drvp->ad_flags & AD_EXT48)) { 1587 ata_pktp->ap_count &= 0xff; 1588 } 1589 ata_pktp->ap_startsec = start_sec; 1590 1591 #ifdef DADKIO_RWCMD_READ 1592 if (pktp->cp_passthru) { 1593 switch (RWCMDP(pktp)->cmd) { 1594 case DADKIO_RWCMD_READ: 1595 if (ata_pktp->ap_sg_cnt) { 1596 ata_pktp->ap_cmd = ATC_READ_DMA; 1597 ata_pktp->ap_pciide_dma = TRUE; 1598 ata_pktp->ap_start = ata_disk_start_dma_in; 1599 ata_pktp->ap_intr = ata_disk_intr_dma; 1600 } else { 1601 ata_pktp->ap_cmd = ATC_RDSEC; 1602 ata_pktp->ap_start = ata_disk_start_pio_in; 1603 ata_pktp->ap_intr = ata_disk_intr_pio_in; 1604 } 1605 ata_pktp->ap_flags |= AP_READ; 1606 break; 1607 case DADKIO_RWCMD_WRITE: 1608 if (ata_pktp->ap_sg_cnt) { 1609 ata_pktp->ap_cmd = ATC_WRITE_DMA; 1610 ata_pktp->ap_pciide_dma = TRUE; 1611 ata_pktp->ap_start = ata_disk_start_dma_out; 1612 ata_pktp->ap_intr = ata_disk_intr_dma; 1613 } else { 1614 ata_pktp->ap_cmd = ATC_WRSEC; 1615 ata_pktp->ap_start = ata_disk_start_pio_out; 1616 ata_pktp->ap_intr = ata_disk_intr_pio_out; 1617 } 1618 ata_pktp->ap_flags |= AP_WRITE; 1619 break; 1620 } 1621 1622 byte_count = RWCMDP(pktp)->buflen; 1623 pktp->cp_bytexfer = byte_count; 1624 pktp->cp_resid = byte_count; 1625 ata_pktp->ap_resid = byte_count; 1626 1627 /* 1628 * since we're not using READ/WRITE MULTIPLE, we 1629 * should set bytes_per_block to one sector 1630 * XXX- why wasn't this in the old driver?? 1631 */ 1632 ata_pktp->ap_bytes_per_block = NBPSCTR; 1633 } else 1634 #endif 1635 { 1636 byte_count = sec_count << SCTRSHFT; 1637 pktp->cp_bytexfer = byte_count; 1638 pktp->cp_resid = byte_count; 1639 ata_pktp->ap_resid = byte_count; 1640 1641 /* setup the task file registers */ 1642 1643 switch (ata_pktp->ap_cdb) { 1644 case DCMD_READ: 1645 if (ata_pktp->ap_sg_cnt) { 1646 ata_pktp->ap_cmd = ATC_READ_DMA; 1647 ata_pktp->ap_pciide_dma = TRUE; 1648 ata_pktp->ap_start = ata_disk_start_dma_in; 1649 ata_pktp->ap_intr = ata_disk_intr_dma; 1650 } else { 1651 ata_pktp->ap_cmd = ata_drvp->ad_rd_cmd; 1652 ata_pktp->ap_start = ata_disk_start_pio_in; 1653 ata_pktp->ap_intr = ata_disk_intr_pio_in; 1654 } 1655 ata_pktp->ap_flags |= AP_READ; 1656 break; 1657 1658 case DCMD_WRITE: 1659 if (ata_pktp->ap_sg_cnt) { 1660 ata_pktp->ap_cmd = ATC_WRITE_DMA; 1661 ata_pktp->ap_pciide_dma = TRUE; 1662 ata_pktp->ap_start = ata_disk_start_dma_out; 1663 ata_pktp->ap_intr = ata_disk_intr_dma; 1664 } else { 1665 ata_pktp->ap_cmd = ata_drvp->ad_wr_cmd; 1666 ata_pktp->ap_start = ata_disk_start_pio_out; 1667 ata_pktp->ap_intr = ata_disk_intr_pio_out; 1668 } 1669 ata_pktp->ap_flags |= AP_WRITE; 1670 break; 1671 1672 default: 1673 ADBG_WARN(("ata_disk_iosetup: unknown command 0x%x\n", 1674 ata_pktp->ap_cdb)); 1675 pktp = NULL; 1676 break; 1677 } 1678 } 1679 1680 /* If 48-bit mode is used, convert command to 48-bit mode cmd */ 1681 if (pktp != NULL && ata_drvp->ad_flags & AD_EXT48) { 1682 switch (ata_pktp->ap_cmd) { 1683 case ATC_RDSEC: 1684 ata_pktp->ap_cmd = ATC_RDSEC_EXT; 1685 break; 1686 case ATC_WRSEC: 1687 ata_pktp->ap_cmd = ATC_WRSEC_EXT; 1688 break; 1689 case ATC_RDMULT: 1690 ata_pktp->ap_cmd = ATC_RDMULT_EXT; 1691 break; 1692 case ATC_WRMULT: 1693 ata_pktp->ap_cmd = ATC_WRMULT_EXT; 1694 break; 1695 case ATC_READ_DMA: 1696 ata_pktp->ap_cmd = ATC_RDDMA_EXT; 1697 break; 1698 case ATC_WRITE_DMA: 1699 ata_pktp->ap_cmd = ATC_WRDMA_EXT; 1700 break; 1701 } 1702 } 1703 1704 return (pktp); 1705 } 1706 1707 1708 1709 /* 1710 * 1711 * DADA transport entry point 1712 * 1713 */ 1714 1715 static int 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