1 /*- 2 * Common functions for CAM "type" (peripheral) drivers. 3 * 4 * Copyright (c) 1997, 1998 Justin T. Gibbs. 5 * Copyright (c) 1997, 1998, 1999, 2000 Kenneth D. Merry. 6 * All rights reserved. 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions 10 * are met: 11 * 1. Redistributions of source code must retain the above copyright 12 * notice, this list of conditions, and the following disclaimer, 13 * without modification, immediately at the beginning of the file. 14 * 2. The name of the author may not be used to endorse or promote products 15 * derived from this software without specific prior written permission. 16 * 17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR 21 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27 * SUCH DAMAGE. 28 */ 29 30 #include <sys/cdefs.h> 31 __FBSDID("$FreeBSD$"); 32 33 #include <sys/param.h> 34 #include <sys/systm.h> 35 #include <sys/types.h> 36 #include <sys/malloc.h> 37 #include <sys/kernel.h> 38 #include <sys/linker_set.h> 39 #include <sys/bio.h> 40 #include <sys/lock.h> 41 #include <sys/mutex.h> 42 #include <sys/buf.h> 43 #include <sys/proc.h> 44 #include <sys/devicestat.h> 45 #include <sys/bus.h> 46 #include <vm/vm.h> 47 #include <vm/vm_extern.h> 48 49 #include <cam/cam.h> 50 #include <cam/cam_ccb.h> 51 #include <cam/cam_xpt_periph.h> 52 #include <cam/cam_periph.h> 53 #include <cam/cam_debug.h> 54 55 #include <cam/scsi/scsi_all.h> 56 #include <cam/scsi/scsi_message.h> 57 #include <cam/scsi/scsi_pass.h> 58 59 static u_int camperiphnextunit(struct periph_driver *p_drv, 60 u_int newunit, int wired, 61 path_id_t pathid, target_id_t target, 62 lun_id_t lun); 63 static u_int camperiphunit(struct periph_driver *p_drv, 64 path_id_t pathid, target_id_t target, 65 lun_id_t lun); 66 static void camperiphdone(struct cam_periph *periph, 67 union ccb *done_ccb); 68 static void camperiphfree(struct cam_periph *periph); 69 static int camperiphscsistatuserror(union ccb *ccb, 70 cam_flags camflags, 71 u_int32_t sense_flags, 72 union ccb *save_ccb, 73 int *openings, 74 u_int32_t *relsim_flags, 75 u_int32_t *timeout); 76 static int camperiphscsisenseerror(union ccb *ccb, 77 cam_flags camflags, 78 u_int32_t sense_flags, 79 union ccb *save_ccb, 80 int *openings, 81 u_int32_t *relsim_flags, 82 u_int32_t *timeout); 83 84 static int nperiph_drivers; 85 struct periph_driver **periph_drivers; 86 87 MALLOC_DEFINE(M_CAMPERIPH, "CAM periph", "CAM peripheral buffers"); 88 89 static int periph_selto_delay = 1000; 90 TUNABLE_INT("kern.cam.periph_selto_delay", &periph_selto_delay); 91 static int periph_noresrc_delay = 500; 92 TUNABLE_INT("kern.cam.periph_noresrc_delay", &periph_noresrc_delay); 93 static int periph_busy_delay = 500; 94 TUNABLE_INT("kern.cam.periph_busy_delay", &periph_busy_delay); 95 96 97 void 98 periphdriver_register(void *data) 99 { 100 struct periph_driver **newdrivers, **old; 101 int ndrivers; 102 103 ndrivers = nperiph_drivers + 2; 104 newdrivers = malloc(sizeof(*newdrivers) * ndrivers, M_TEMP, M_WAITOK); 105 if (periph_drivers) 106 bcopy(periph_drivers, newdrivers, 107 sizeof(*newdrivers) * nperiph_drivers); 108 newdrivers[nperiph_drivers] = (struct periph_driver *)data; 109 newdrivers[nperiph_drivers + 1] = NULL; 110 old = periph_drivers; 111 periph_drivers = newdrivers; 112 if (old) 113 free(old, M_TEMP); 114 nperiph_drivers++; 115 } 116 117 cam_status 118 cam_periph_alloc(periph_ctor_t *periph_ctor, 119 periph_oninv_t *periph_oninvalidate, 120 periph_dtor_t *periph_dtor, periph_start_t *periph_start, 121 char *name, cam_periph_type type, struct cam_path *path, 122 ac_callback_t *ac_callback, ac_code code, void *arg) 123 { 124 struct periph_driver **p_drv; 125 struct cam_periph *periph; 126 struct cam_periph *cur_periph; 127 path_id_t path_id; 128 target_id_t target_id; 129 lun_id_t lun_id; 130 cam_status status; 131 u_int init_level; 132 int s; 133 134 init_level = 0; 135 /* 136 * Handle Hot-Plug scenarios. If there is already a peripheral 137 * of our type assigned to this path, we are likely waiting for 138 * final close on an old, invalidated, peripheral. If this is 139 * the case, queue up a deferred call to the peripheral's async 140 * handler. If it looks like a mistaken re-allocation, complain. 141 */ 142 if ((periph = cam_periph_find(path, name)) != NULL) { 143 144 if ((periph->flags & CAM_PERIPH_INVALID) != 0 145 && (periph->flags & CAM_PERIPH_NEW_DEV_FOUND) == 0) { 146 periph->flags |= CAM_PERIPH_NEW_DEV_FOUND; 147 periph->deferred_callback = ac_callback; 148 periph->deferred_ac = code; 149 return (CAM_REQ_INPROG); 150 } else { 151 printf("cam_periph_alloc: attempt to re-allocate " 152 "valid device %s%d rejected\n", 153 periph->periph_name, periph->unit_number); 154 } 155 return (CAM_REQ_INVALID); 156 } 157 158 periph = (struct cam_periph *)malloc(sizeof(*periph), M_CAMPERIPH, 159 M_NOWAIT); 160 161 if (periph == NULL) 162 return (CAM_RESRC_UNAVAIL); 163 164 init_level++; 165 166 for (p_drv = periph_drivers; *p_drv != NULL; p_drv++) { 167 if (strcmp((*p_drv)->driver_name, name) == 0) 168 break; 169 } 170 171 path_id = xpt_path_path_id(path); 172 target_id = xpt_path_target_id(path); 173 lun_id = xpt_path_lun_id(path); 174 bzero(periph, sizeof(*periph)); 175 cam_init_pinfo(&periph->pinfo); 176 periph->periph_start = periph_start; 177 periph->periph_dtor = periph_dtor; 178 periph->periph_oninval = periph_oninvalidate; 179 periph->type = type; 180 periph->periph_name = name; 181 periph->unit_number = camperiphunit(*p_drv, path_id, target_id, lun_id); 182 periph->immediate_priority = CAM_PRIORITY_NONE; 183 periph->refcount = 0; 184 SLIST_INIT(&periph->ccb_list); 185 status = xpt_create_path(&path, periph, path_id, target_id, lun_id); 186 if (status != CAM_REQ_CMP) 187 goto failure; 188 189 periph->path = path; 190 init_level++; 191 192 status = xpt_add_periph(periph); 193 194 if (status != CAM_REQ_CMP) 195 goto failure; 196 197 s = splsoftcam(); 198 cur_periph = TAILQ_FIRST(&(*p_drv)->units); 199 while (cur_periph != NULL 200 && cur_periph->unit_number < periph->unit_number) 201 cur_periph = TAILQ_NEXT(cur_periph, unit_links); 202 203 if (cur_periph != NULL) 204 TAILQ_INSERT_BEFORE(cur_periph, periph, unit_links); 205 else { 206 TAILQ_INSERT_TAIL(&(*p_drv)->units, periph, unit_links); 207 (*p_drv)->generation++; 208 } 209 210 splx(s); 211 212 init_level++; 213 214 status = periph_ctor(periph, arg); 215 216 if (status == CAM_REQ_CMP) 217 init_level++; 218 219 failure: 220 switch (init_level) { 221 case 4: 222 /* Initialized successfully */ 223 break; 224 case 3: 225 s = splsoftcam(); 226 TAILQ_REMOVE(&(*p_drv)->units, periph, unit_links); 227 splx(s); 228 xpt_remove_periph(periph); 229 /* FALLTHROUGH */ 230 case 2: 231 xpt_free_path(periph->path); 232 /* FALLTHROUGH */ 233 case 1: 234 free(periph, M_CAMPERIPH); 235 /* FALLTHROUGH */ 236 case 0: 237 /* No cleanup to perform. */ 238 break; 239 default: 240 panic("cam_periph_alloc: Unkown init level"); 241 } 242 return(status); 243 } 244 245 /* 246 * Find a peripheral structure with the specified path, target, lun, 247 * and (optionally) type. If the name is NULL, this function will return 248 * the first peripheral driver that matches the specified path. 249 */ 250 struct cam_periph * 251 cam_periph_find(struct cam_path *path, char *name) 252 { 253 struct periph_driver **p_drv; 254 struct cam_periph *periph; 255 int s; 256 257 for (p_drv = periph_drivers; *p_drv != NULL; p_drv++) { 258 259 if (name != NULL && (strcmp((*p_drv)->driver_name, name) != 0)) 260 continue; 261 262 s = splsoftcam(); 263 TAILQ_FOREACH(periph, &(*p_drv)->units, unit_links) { 264 if (xpt_path_comp(periph->path, path) == 0) { 265 splx(s); 266 return(periph); 267 } 268 } 269 splx(s); 270 if (name != NULL) 271 return(NULL); 272 } 273 return(NULL); 274 } 275 276 cam_status 277 cam_periph_acquire(struct cam_periph *periph) 278 { 279 int s; 280 281 if (periph == NULL) 282 return(CAM_REQ_CMP_ERR); 283 284 s = splsoftcam(); 285 periph->refcount++; 286 splx(s); 287 288 return(CAM_REQ_CMP); 289 } 290 291 void 292 cam_periph_release(struct cam_periph *periph) 293 { 294 int s; 295 296 if (periph == NULL) 297 return; 298 299 s = splsoftcam(); 300 if ((--periph->refcount == 0) 301 && (periph->flags & CAM_PERIPH_INVALID)) { 302 camperiphfree(periph); 303 } 304 splx(s); 305 306 } 307 308 /* 309 * Look for the next unit number that is not currently in use for this 310 * peripheral type starting at "newunit". Also exclude unit numbers that 311 * are reserved by for future "hardwiring" unless we already know that this 312 * is a potential wired device. Only assume that the device is "wired" the 313 * first time through the loop since after that we'll be looking at unit 314 * numbers that did not match a wiring entry. 315 */ 316 static u_int 317 camperiphnextunit(struct periph_driver *p_drv, u_int newunit, int wired, 318 path_id_t pathid, target_id_t target, lun_id_t lun) 319 { 320 struct cam_periph *periph; 321 char *periph_name; 322 int s; 323 int i, val, dunit, r; 324 const char *dname, *strval; 325 326 s = splsoftcam(); 327 periph_name = p_drv->driver_name; 328 for (;;newunit++) { 329 330 for (periph = TAILQ_FIRST(&p_drv->units); 331 periph != NULL && periph->unit_number != newunit; 332 periph = TAILQ_NEXT(periph, unit_links)) 333 ; 334 335 if (periph != NULL && periph->unit_number == newunit) { 336 if (wired != 0) { 337 xpt_print(periph->path, "Duplicate Wired " 338 "Device entry!\n"); 339 xpt_print(periph->path, "Second device (%s " 340 "device at scbus%d target %d lun %d) will " 341 "not be wired\n", periph_name, pathid, 342 target, lun); 343 wired = 0; 344 } 345 continue; 346 } 347 if (wired) 348 break; 349 350 /* 351 * Don't match entries like "da 4" as a wired down 352 * device, but do match entries like "da 4 target 5" 353 * or even "da 4 scbus 1". 354 */ 355 i = 0; 356 dname = periph_name; 357 for (;;) { 358 r = resource_find_dev(&i, dname, &dunit, NULL, NULL); 359 if (r != 0) 360 break; 361 /* if no "target" and no specific scbus, skip */ 362 if (resource_int_value(dname, dunit, "target", &val) && 363 (resource_string_value(dname, dunit, "at",&strval)|| 364 strcmp(strval, "scbus") == 0)) 365 continue; 366 if (newunit == dunit) 367 break; 368 } 369 if (r != 0) 370 break; 371 } 372 splx(s); 373 return (newunit); 374 } 375 376 static u_int 377 camperiphunit(struct periph_driver *p_drv, path_id_t pathid, 378 target_id_t target, lun_id_t lun) 379 { 380 u_int unit; 381 int wired, i, val, dunit; 382 const char *dname, *strval; 383 char pathbuf[32], *periph_name; 384 385 periph_name = p_drv->driver_name; 386 snprintf(pathbuf, sizeof(pathbuf), "scbus%d", pathid); 387 unit = 0; 388 i = 0; 389 dname = periph_name; 390 for (wired = 0; resource_find_dev(&i, dname, &dunit, NULL, NULL) == 0; 391 wired = 0) { 392 if (resource_string_value(dname, dunit, "at", &strval) == 0) { 393 if (strcmp(strval, pathbuf) != 0) 394 continue; 395 wired++; 396 } 397 if (resource_int_value(dname, dunit, "target", &val) == 0) { 398 if (val != target) 399 continue; 400 wired++; 401 } 402 if (resource_int_value(dname, dunit, "lun", &val) == 0) { 403 if (val != lun) 404 continue; 405 wired++; 406 } 407 if (wired != 0) { 408 unit = dunit; 409 break; 410 } 411 } 412 413 /* 414 * Either start from 0 looking for the next unit or from 415 * the unit number given in the resource config. This way, 416 * if we have wildcard matches, we don't return the same 417 * unit number twice. 418 */ 419 unit = camperiphnextunit(p_drv, unit, wired, pathid, target, lun); 420 421 return (unit); 422 } 423 424 void 425 cam_periph_invalidate(struct cam_periph *periph) 426 { 427 int s; 428 429 s = splsoftcam(); 430 /* 431 * We only call this routine the first time a peripheral is 432 * invalidated. The oninvalidate() routine is always called at 433 * splsoftcam(). 434 */ 435 if (((periph->flags & CAM_PERIPH_INVALID) == 0) 436 && (periph->periph_oninval != NULL)) 437 periph->periph_oninval(periph); 438 439 periph->flags |= CAM_PERIPH_INVALID; 440 periph->flags &= ~CAM_PERIPH_NEW_DEV_FOUND; 441 442 if (periph->refcount == 0) 443 camperiphfree(periph); 444 else if (periph->refcount < 0) 445 printf("cam_invalidate_periph: refcount < 0!!\n"); 446 splx(s); 447 } 448 449 static void 450 camperiphfree(struct cam_periph *periph) 451 { 452 int s; 453 struct periph_driver **p_drv; 454 455 for (p_drv = periph_drivers; *p_drv != NULL; p_drv++) { 456 if (strcmp((*p_drv)->driver_name, periph->periph_name) == 0) 457 break; 458 } 459 if (*p_drv == NULL) { 460 printf("camperiphfree: attempt to free non-existant periph\n"); 461 return; 462 } 463 464 if (periph->periph_dtor != NULL) 465 periph->periph_dtor(periph); 466 467 s = splsoftcam(); 468 TAILQ_REMOVE(&(*p_drv)->units, periph, unit_links); 469 (*p_drv)->generation++; 470 splx(s); 471 472 xpt_remove_periph(periph); 473 474 if (periph->flags & CAM_PERIPH_NEW_DEV_FOUND) { 475 union ccb ccb; 476 void *arg; 477 478 switch (periph->deferred_ac) { 479 case AC_FOUND_DEVICE: 480 ccb.ccb_h.func_code = XPT_GDEV_TYPE; 481 xpt_setup_ccb(&ccb.ccb_h, periph->path, /*priority*/ 1); 482 xpt_action(&ccb); 483 arg = &ccb; 484 break; 485 case AC_PATH_REGISTERED: 486 ccb.ccb_h.func_code = XPT_PATH_INQ; 487 xpt_setup_ccb(&ccb.ccb_h, periph->path, /*priority*/ 1); 488 xpt_action(&ccb); 489 arg = &ccb; 490 break; 491 default: 492 arg = NULL; 493 break; 494 } 495 periph->deferred_callback(NULL, periph->deferred_ac, 496 periph->path, arg); 497 } 498 xpt_free_path(periph->path); 499 free(periph, M_CAMPERIPH); 500 } 501 502 /* 503 * Wait interruptibly for an exclusive lock. 504 */ 505 int 506 cam_periph_lock(struct cam_periph *periph, int priority) 507 { 508 int error; 509 510 /* 511 * Increment the reference count on the peripheral 512 * while we wait for our lock attempt to succeed 513 * to ensure the peripheral doesn't disappear out 514 * from under us while we sleep. 515 */ 516 if (cam_periph_acquire(periph) != CAM_REQ_CMP) 517 return(ENXIO); 518 519 while ((periph->flags & CAM_PERIPH_LOCKED) != 0) { 520 periph->flags |= CAM_PERIPH_LOCK_WANTED; 521 if ((error = tsleep(periph, priority, "caplck", 0)) != 0) { 522 cam_periph_release(periph); 523 return error; 524 } 525 } 526 527 periph->flags |= CAM_PERIPH_LOCKED; 528 return 0; 529 } 530 531 /* 532 * Unlock and wake up any waiters. 533 */ 534 void 535 cam_periph_unlock(struct cam_periph *periph) 536 { 537 periph->flags &= ~CAM_PERIPH_LOCKED; 538 if ((periph->flags & CAM_PERIPH_LOCK_WANTED) != 0) { 539 periph->flags &= ~CAM_PERIPH_LOCK_WANTED; 540 wakeup(periph); 541 } 542 543 cam_periph_release(periph); 544 } 545 546 /* 547 * Map user virtual pointers into kernel virtual address space, so we can 548 * access the memory. This won't work on physical pointers, for now it's 549 * up to the caller to check for that. (XXX KDM -- should we do that here 550 * instead?) This also only works for up to MAXPHYS memory. Since we use 551 * buffers to map stuff in and out, we're limited to the buffer size. 552 */ 553 int 554 cam_periph_mapmem(union ccb *ccb, struct cam_periph_map_info *mapinfo) 555 { 556 int numbufs, i, j; 557 int flags[CAM_PERIPH_MAXMAPS]; 558 u_int8_t **data_ptrs[CAM_PERIPH_MAXMAPS]; 559 u_int32_t lengths[CAM_PERIPH_MAXMAPS]; 560 u_int32_t dirs[CAM_PERIPH_MAXMAPS]; 561 562 switch(ccb->ccb_h.func_code) { 563 case XPT_DEV_MATCH: 564 if (ccb->cdm.match_buf_len == 0) { 565 printf("cam_periph_mapmem: invalid match buffer " 566 "length 0\n"); 567 return(EINVAL); 568 } 569 if (ccb->cdm.pattern_buf_len > 0) { 570 data_ptrs[0] = (u_int8_t **)&ccb->cdm.patterns; 571 lengths[0] = ccb->cdm.pattern_buf_len; 572 dirs[0] = CAM_DIR_OUT; 573 data_ptrs[1] = (u_int8_t **)&ccb->cdm.matches; 574 lengths[1] = ccb->cdm.match_buf_len; 575 dirs[1] = CAM_DIR_IN; 576 numbufs = 2; 577 } else { 578 data_ptrs[0] = (u_int8_t **)&ccb->cdm.matches; 579 lengths[0] = ccb->cdm.match_buf_len; 580 dirs[0] = CAM_DIR_IN; 581 numbufs = 1; 582 } 583 break; 584 case XPT_SCSI_IO: 585 case XPT_CONT_TARGET_IO: 586 if ((ccb->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_NONE) 587 return(0); 588 589 data_ptrs[0] = &ccb->csio.data_ptr; 590 lengths[0] = ccb->csio.dxfer_len; 591 dirs[0] = ccb->ccb_h.flags & CAM_DIR_MASK; 592 numbufs = 1; 593 break; 594 default: 595 return(EINVAL); 596 break; /* NOTREACHED */ 597 } 598 599 /* 600 * Check the transfer length and permissions first, so we don't 601 * have to unmap any previously mapped buffers. 602 */ 603 for (i = 0; i < numbufs; i++) { 604 605 flags[i] = 0; 606 607 /* 608 * The userland data pointer passed in may not be page 609 * aligned. vmapbuf() truncates the address to a page 610 * boundary, so if the address isn't page aligned, we'll 611 * need enough space for the given transfer length, plus 612 * whatever extra space is necessary to make it to the page 613 * boundary. 614 */ 615 if ((lengths[i] + 616 (((vm_offset_t)(*data_ptrs[i])) & PAGE_MASK)) > DFLTPHYS){ 617 printf("cam_periph_mapmem: attempt to map %lu bytes, " 618 "which is greater than DFLTPHYS(%d)\n", 619 (long)(lengths[i] + 620 (((vm_offset_t)(*data_ptrs[i])) & PAGE_MASK)), 621 DFLTPHYS); 622 return(E2BIG); 623 } 624 625 if (dirs[i] & CAM_DIR_OUT) { 626 flags[i] = BIO_WRITE; 627 } 628 629 if (dirs[i] & CAM_DIR_IN) { 630 flags[i] = BIO_READ; 631 } 632 633 } 634 635 /* this keeps the current process from getting swapped */ 636 /* 637 * XXX KDM should I use P_NOSWAP instead? 638 */ 639 PHOLD(curproc); 640 641 for (i = 0; i < numbufs; i++) { 642 /* 643 * Get the buffer. 644 */ 645 mapinfo->bp[i] = getpbuf(NULL); 646 647 /* save the buffer's data address */ 648 mapinfo->bp[i]->b_saveaddr = mapinfo->bp[i]->b_data; 649 650 /* put our pointer in the data slot */ 651 mapinfo->bp[i]->b_data = *data_ptrs[i]; 652 653 /* set the transfer length, we know it's < DFLTPHYS */ 654 mapinfo->bp[i]->b_bufsize = lengths[i]; 655 656 /* set the direction */ 657 mapinfo->bp[i]->b_iocmd = flags[i]; 658 659 /* 660 * Map the buffer into kernel memory. 661 * 662 * Note that useracc() alone is not a sufficient test. 663 * vmapbuf() can still fail due to a smaller file mapped 664 * into a larger area of VM, or if userland races against 665 * vmapbuf() after the useracc() check. 666 */ 667 if (vmapbuf(mapinfo->bp[i]) < 0) { 668 for (j = 0; j < i; ++j) { 669 *data_ptrs[j] = mapinfo->bp[j]->b_saveaddr; 670 vunmapbuf(mapinfo->bp[j]); 671 relpbuf(mapinfo->bp[j], NULL); 672 } 673 relpbuf(mapinfo->bp[i], NULL); 674 PRELE(curproc); 675 return(EACCES); 676 } 677 678 /* set our pointer to the new mapped area */ 679 *data_ptrs[i] = mapinfo->bp[i]->b_data; 680 681 mapinfo->num_bufs_used++; 682 } 683 684 /* 685 * Now that we've gotten this far, change ownership to the kernel 686 * of the buffers so that we don't run afoul of returning to user 687 * space with locks (on the buffer) held. 688 */ 689 for (i = 0; i < numbufs; i++) { 690 BUF_KERNPROC(mapinfo->bp[i]); 691 } 692 693 694 return(0); 695 } 696 697 /* 698 * Unmap memory segments mapped into kernel virtual address space by 699 * cam_periph_mapmem(). 700 */ 701 void 702 cam_periph_unmapmem(union ccb *ccb, struct cam_periph_map_info *mapinfo) 703 { 704 int numbufs, i; 705 u_int8_t **data_ptrs[CAM_PERIPH_MAXMAPS]; 706 707 if (mapinfo->num_bufs_used <= 0) { 708 /* allow ourselves to be swapped once again */ 709 PRELE(curproc); 710 return; 711 } 712 713 switch (ccb->ccb_h.func_code) { 714 case XPT_DEV_MATCH: 715 numbufs = min(mapinfo->num_bufs_used, 2); 716 717 if (numbufs == 1) { 718 data_ptrs[0] = (u_int8_t **)&ccb->cdm.matches; 719 } else { 720 data_ptrs[0] = (u_int8_t **)&ccb->cdm.patterns; 721 data_ptrs[1] = (u_int8_t **)&ccb->cdm.matches; 722 } 723 break; 724 case XPT_SCSI_IO: 725 case XPT_CONT_TARGET_IO: 726 data_ptrs[0] = &ccb->csio.data_ptr; 727 numbufs = min(mapinfo->num_bufs_used, 1); 728 break; 729 default: 730 /* allow ourselves to be swapped once again */ 731 PRELE(curproc); 732 return; 733 break; /* NOTREACHED */ 734 } 735 736 for (i = 0; i < numbufs; i++) { 737 /* Set the user's pointer back to the original value */ 738 *data_ptrs[i] = mapinfo->bp[i]->b_saveaddr; 739 740 /* unmap the buffer */ 741 vunmapbuf(mapinfo->bp[i]); 742 743 /* release the buffer */ 744 relpbuf(mapinfo->bp[i], NULL); 745 } 746 747 /* allow ourselves to be swapped once again */ 748 PRELE(curproc); 749 } 750 751 union ccb * 752 cam_periph_getccb(struct cam_periph *periph, u_int32_t priority) 753 { 754 struct ccb_hdr *ccb_h; 755 int s; 756 757 CAM_DEBUG(periph->path, CAM_DEBUG_TRACE, ("entering cdgetccb\n")); 758 759 s = splsoftcam(); 760 761 while (SLIST_FIRST(&periph->ccb_list) == NULL) { 762 if (periph->immediate_priority > priority) 763 periph->immediate_priority = priority; 764 xpt_schedule(periph, priority); 765 if ((SLIST_FIRST(&periph->ccb_list) != NULL) 766 && (SLIST_FIRST(&periph->ccb_list)->pinfo.priority == priority)) 767 break; 768 tsleep(&periph->ccb_list, PRIBIO, "cgticb", 0); 769 } 770 771 ccb_h = SLIST_FIRST(&periph->ccb_list); 772 SLIST_REMOVE_HEAD(&periph->ccb_list, periph_links.sle); 773 splx(s); 774 return ((union ccb *)ccb_h); 775 } 776 777 void 778 cam_periph_ccbwait(union ccb *ccb) 779 { 780 int s; 781 782 s = splsoftcam(); 783 if ((ccb->ccb_h.pinfo.index != CAM_UNQUEUED_INDEX) 784 || ((ccb->ccb_h.status & CAM_STATUS_MASK) == CAM_REQ_INPROG)) 785 tsleep(&ccb->ccb_h.cbfcnp, PRIBIO, "cbwait", 0); 786 787 splx(s); 788 } 789 790 int 791 cam_periph_ioctl(struct cam_periph *periph, int cmd, caddr_t addr, 792 int (*error_routine)(union ccb *ccb, 793 cam_flags camflags, 794 u_int32_t sense_flags)) 795 { 796 union ccb *ccb; 797 int error; 798 int found; 799 800 error = found = 0; 801 802 switch(cmd){ 803 case CAMGETPASSTHRU: 804 ccb = cam_periph_getccb(periph, /* priority */ 1); 805 xpt_setup_ccb(&ccb->ccb_h, 806 ccb->ccb_h.path, 807 /*priority*/1); 808 ccb->ccb_h.func_code = XPT_GDEVLIST; 809 810 /* 811 * Basically, the point of this is that we go through 812 * getting the list of devices, until we find a passthrough 813 * device. In the current version of the CAM code, the 814 * only way to determine what type of device we're dealing 815 * with is by its name. 816 */ 817 while (found == 0) { 818 ccb->cgdl.index = 0; 819 ccb->cgdl.status = CAM_GDEVLIST_MORE_DEVS; 820 while (ccb->cgdl.status == CAM_GDEVLIST_MORE_DEVS) { 821 822 /* we want the next device in the list */ 823 xpt_action(ccb); 824 if (strncmp(ccb->cgdl.periph_name, 825 "pass", 4) == 0){ 826 found = 1; 827 break; 828 } 829 } 830 if ((ccb->cgdl.status == CAM_GDEVLIST_LAST_DEVICE) && 831 (found == 0)) { 832 ccb->cgdl.periph_name[0] = '\0'; 833 ccb->cgdl.unit_number = 0; 834 break; 835 } 836 } 837 838 /* copy the result back out */ 839 bcopy(ccb, addr, sizeof(union ccb)); 840 841 /* and release the ccb */ 842 xpt_release_ccb(ccb); 843 844 break; 845 default: 846 error = ENOTTY; 847 break; 848 } 849 return(error); 850 } 851 852 int 853 cam_periph_runccb(union ccb *ccb, 854 int (*error_routine)(union ccb *ccb, 855 cam_flags camflags, 856 u_int32_t sense_flags), 857 cam_flags camflags, u_int32_t sense_flags, 858 struct devstat *ds) 859 { 860 int error; 861 862 error = 0; 863 864 /* 865 * If the user has supplied a stats structure, and if we understand 866 * this particular type of ccb, record the transaction start. 867 */ 868 if ((ds != NULL) && (ccb->ccb_h.func_code == XPT_SCSI_IO)) 869 devstat_start_transaction(ds, NULL); 870 871 xpt_action(ccb); 872 873 do { 874 cam_periph_ccbwait(ccb); 875 if ((ccb->ccb_h.status & CAM_STATUS_MASK) == CAM_REQ_CMP) 876 error = 0; 877 else if (error_routine != NULL) 878 error = (*error_routine)(ccb, camflags, sense_flags); 879 else 880 error = 0; 881 882 } while (error == ERESTART); 883 884 if ((ccb->ccb_h.status & CAM_DEV_QFRZN) != 0) 885 cam_release_devq(ccb->ccb_h.path, 886 /* relsim_flags */0, 887 /* openings */0, 888 /* timeout */0, 889 /* getcount_only */ FALSE); 890 891 if ((ds != NULL) && (ccb->ccb_h.func_code == XPT_SCSI_IO)) 892 devstat_end_transaction(ds, 893 ccb->csio.dxfer_len, 894 ccb->csio.tag_action & 0xf, 895 ((ccb->ccb_h.flags & CAM_DIR_MASK) == 896 CAM_DIR_NONE) ? DEVSTAT_NO_DATA : 897 (ccb->ccb_h.flags & CAM_DIR_OUT) ? 898 DEVSTAT_WRITE : 899 DEVSTAT_READ, NULL, NULL); 900 901 return(error); 902 } 903 904 void 905 cam_freeze_devq(struct cam_path *path) 906 { 907 struct ccb_hdr ccb_h; 908 909 xpt_setup_ccb(&ccb_h, path, /*priority*/1); 910 ccb_h.func_code = XPT_NOOP; 911 ccb_h.flags = CAM_DEV_QFREEZE; 912 xpt_action((union ccb *)&ccb_h); 913 } 914 915 u_int32_t 916 cam_release_devq(struct cam_path *path, u_int32_t relsim_flags, 917 u_int32_t openings, u_int32_t timeout, 918 int getcount_only) 919 { 920 struct ccb_relsim crs; 921 922 xpt_setup_ccb(&crs.ccb_h, path, 923 /*priority*/1); 924 crs.ccb_h.func_code = XPT_REL_SIMQ; 925 crs.ccb_h.flags = getcount_only ? CAM_DEV_QFREEZE : 0; 926 crs.release_flags = relsim_flags; 927 crs.openings = openings; 928 crs.release_timeout = timeout; 929 xpt_action((union ccb *)&crs); 930 return (crs.qfrozen_cnt); 931 } 932 933 #define saved_ccb_ptr ppriv_ptr0 934 static void 935 camperiphdone(struct cam_periph *periph, union ccb *done_ccb) 936 { 937 union ccb *saved_ccb; 938 cam_status status; 939 int frozen; 940 int sense; 941 struct scsi_start_stop_unit *scsi_cmd; 942 u_int32_t relsim_flags, timeout; 943 u_int32_t qfrozen_cnt; 944 int xpt_done_ccb; 945 946 xpt_done_ccb = FALSE; 947 status = done_ccb->ccb_h.status; 948 frozen = (status & CAM_DEV_QFRZN) != 0; 949 sense = (status & CAM_AUTOSNS_VALID) != 0; 950 status &= CAM_STATUS_MASK; 951 952 timeout = 0; 953 relsim_flags = 0; 954 saved_ccb = (union ccb *)done_ccb->ccb_h.saved_ccb_ptr; 955 956 /* 957 * Unfreeze the queue once if it is already frozen.. 958 */ 959 if (frozen != 0) { 960 qfrozen_cnt = cam_release_devq(done_ccb->ccb_h.path, 961 /*relsim_flags*/0, 962 /*openings*/0, 963 /*timeout*/0, 964 /*getcount_only*/0); 965 } 966 967 switch (status) { 968 case CAM_REQ_CMP: 969 { 970 /* 971 * If we have successfully taken a device from the not 972 * ready to ready state, re-scan the device and re-get 973 * the inquiry information. Many devices (mostly disks) 974 * don't properly report their inquiry information unless 975 * they are spun up. 976 * 977 * If we manually retrieved sense into a CCB and got 978 * something other than "NO SENSE" send the updated CCB 979 * back to the client via xpt_done() to be processed via 980 * the error recovery code again. 981 */ 982 if (done_ccb->ccb_h.func_code == XPT_SCSI_IO) { 983 scsi_cmd = (struct scsi_start_stop_unit *) 984 &done_ccb->csio.cdb_io.cdb_bytes; 985 986 if (scsi_cmd->opcode == START_STOP_UNIT) 987 xpt_async(AC_INQ_CHANGED, 988 done_ccb->ccb_h.path, NULL); 989 if (scsi_cmd->opcode == REQUEST_SENSE) { 990 u_int sense_key; 991 992 sense_key = saved_ccb->csio.sense_data.flags; 993 sense_key &= SSD_KEY; 994 if (sense_key != SSD_KEY_NO_SENSE) { 995 saved_ccb->ccb_h.status |= 996 CAM_AUTOSNS_VALID; 997 #if 0 998 xpt_print(saved_ccb->ccb_h.path, 999 "Recovered Sense\n"); 1000 scsi_sense_print(&saved_ccb->csio); 1001 cam_error_print(saved_ccb, CAM_ESF_ALL, 1002 CAM_EPF_ALL); 1003 #endif 1004 xpt_done_ccb = TRUE; 1005 } 1006 } 1007 } 1008 bcopy(done_ccb->ccb_h.saved_ccb_ptr, done_ccb, 1009 sizeof(union ccb)); 1010 1011 periph->flags &= ~CAM_PERIPH_RECOVERY_INPROG; 1012 1013 if (xpt_done_ccb == FALSE) 1014 xpt_action(done_ccb); 1015 1016 break; 1017 } 1018 case CAM_SCSI_STATUS_ERROR: 1019 scsi_cmd = (struct scsi_start_stop_unit *) 1020 &done_ccb->csio.cdb_io.cdb_bytes; 1021 if (sense != 0) { 1022 struct ccb_getdev cgd; 1023 struct scsi_sense_data *sense; 1024 int error_code, sense_key, asc, ascq; 1025 scsi_sense_action err_action; 1026 1027 sense = &done_ccb->csio.sense_data; 1028 scsi_extract_sense(sense, &error_code, 1029 &sense_key, &asc, &ascq); 1030 1031 /* 1032 * Grab the inquiry data for this device. 1033 */ 1034 xpt_setup_ccb(&cgd.ccb_h, done_ccb->ccb_h.path, 1035 /*priority*/ 1); 1036 cgd.ccb_h.func_code = XPT_GDEV_TYPE; 1037 xpt_action((union ccb *)&cgd); 1038 err_action = scsi_error_action(&done_ccb->csio, 1039 &cgd.inq_data, 0); 1040 1041 /* 1042 * If the error is "invalid field in CDB", 1043 * and the load/eject flag is set, turn the 1044 * flag off and try again. This is just in 1045 * case the drive in question barfs on the 1046 * load eject flag. The CAM code should set 1047 * the load/eject flag by default for 1048 * removable media. 1049 */ 1050 1051 /* XXX KDM 1052 * Should we check to see what the specific 1053 * scsi status is?? Or does it not matter 1054 * since we already know that there was an 1055 * error, and we know what the specific 1056 * error code was, and we know what the 1057 * opcode is.. 1058 */ 1059 if ((scsi_cmd->opcode == START_STOP_UNIT) && 1060 ((scsi_cmd->how & SSS_LOEJ) != 0) && 1061 (asc == 0x24) && (ascq == 0x00) && 1062 (done_ccb->ccb_h.retry_count > 0)) { 1063 1064 scsi_cmd->how &= ~SSS_LOEJ; 1065 1066 xpt_action(done_ccb); 1067 1068 } else if ((done_ccb->ccb_h.retry_count > 1) 1069 && ((err_action & SS_MASK) != SS_FAIL)) { 1070 1071 /* 1072 * In this case, the error recovery 1073 * command failed, but we've got 1074 * some retries left on it. Give 1075 * it another try unless this is an 1076 * unretryable error. 1077 */ 1078 1079 /* set the timeout to .5 sec */ 1080 relsim_flags = 1081 RELSIM_RELEASE_AFTER_TIMEOUT; 1082 timeout = 500; 1083 1084 xpt_action(done_ccb); 1085 1086 break; 1087 1088 } else { 1089 /* 1090 * Perform the final retry with the original 1091 * CCB so that final error processing is 1092 * performed by the owner of the CCB. 1093 */ 1094 bcopy(done_ccb->ccb_h.saved_ccb_ptr, 1095 done_ccb, sizeof(union ccb)); 1096 1097 periph->flags &= ~CAM_PERIPH_RECOVERY_INPROG; 1098 1099 xpt_action(done_ccb); 1100 } 1101 } else { 1102 /* 1103 * Eh?? The command failed, but we don't 1104 * have any sense. What's up with that? 1105 * Fire the CCB again to return it to the 1106 * caller. 1107 */ 1108 bcopy(done_ccb->ccb_h.saved_ccb_ptr, 1109 done_ccb, sizeof(union ccb)); 1110 1111 periph->flags &= ~CAM_PERIPH_RECOVERY_INPROG; 1112 1113 xpt_action(done_ccb); 1114 1115 } 1116 break; 1117 default: 1118 bcopy(done_ccb->ccb_h.saved_ccb_ptr, done_ccb, 1119 sizeof(union ccb)); 1120 1121 periph->flags &= ~CAM_PERIPH_RECOVERY_INPROG; 1122 1123 xpt_action(done_ccb); 1124 1125 break; 1126 } 1127 1128 /* decrement the retry count */ 1129 /* 1130 * XXX This isn't appropriate in all cases. Restructure, 1131 * so that the retry count is only decremented on an 1132 * actual retry. Remeber that the orignal ccb had its 1133 * retry count dropped before entering recovery, so 1134 * doing it again is a bug. 1135 */ 1136 if (done_ccb->ccb_h.retry_count > 0) 1137 done_ccb->ccb_h.retry_count--; 1138 1139 qfrozen_cnt = cam_release_devq(done_ccb->ccb_h.path, 1140 /*relsim_flags*/relsim_flags, 1141 /*openings*/0, 1142 /*timeout*/timeout, 1143 /*getcount_only*/0); 1144 if (xpt_done_ccb == TRUE) 1145 (*done_ccb->ccb_h.cbfcnp)(periph, done_ccb); 1146 } 1147 1148 /* 1149 * Generic Async Event handler. Peripheral drivers usually 1150 * filter out the events that require personal attention, 1151 * and leave the rest to this function. 1152 */ 1153 void 1154 cam_periph_async(struct cam_periph *periph, u_int32_t code, 1155 struct cam_path *path, void *arg) 1156 { 1157 switch (code) { 1158 case AC_LOST_DEVICE: 1159 cam_periph_invalidate(periph); 1160 break; 1161 case AC_SENT_BDR: 1162 case AC_BUS_RESET: 1163 { 1164 cam_periph_bus_settle(periph, scsi_delay); 1165 break; 1166 } 1167 default: 1168 break; 1169 } 1170 } 1171 1172 void 1173 cam_periph_bus_settle(struct cam_periph *periph, u_int bus_settle) 1174 { 1175 struct ccb_getdevstats cgds; 1176 1177 xpt_setup_ccb(&cgds.ccb_h, periph->path, /*priority*/1); 1178 cgds.ccb_h.func_code = XPT_GDEV_STATS; 1179 xpt_action((union ccb *)&cgds); 1180 cam_periph_freeze_after_event(periph, &cgds.last_reset, bus_settle); 1181 } 1182 1183 void 1184 cam_periph_freeze_after_event(struct cam_periph *periph, 1185 struct timeval* event_time, u_int duration_ms) 1186 { 1187 struct timeval delta; 1188 struct timeval duration_tv; 1189 int s; 1190 1191 s = splclock(); 1192 microtime(&delta); 1193 splx(s); 1194 timevalsub(&delta, event_time); 1195 duration_tv.tv_sec = duration_ms / 1000; 1196 duration_tv.tv_usec = (duration_ms % 1000) * 1000; 1197 if (timevalcmp(&delta, &duration_tv, <)) { 1198 timevalsub(&duration_tv, &delta); 1199 1200 duration_ms = duration_tv.tv_sec * 1000; 1201 duration_ms += duration_tv.tv_usec / 1000; 1202 cam_freeze_devq(periph->path); 1203 cam_release_devq(periph->path, 1204 RELSIM_RELEASE_AFTER_TIMEOUT, 1205 /*reduction*/0, 1206 /*timeout*/duration_ms, 1207 /*getcount_only*/0); 1208 } 1209 1210 } 1211 1212 static int 1213 camperiphscsistatuserror(union ccb *ccb, cam_flags camflags, 1214 u_int32_t sense_flags, union ccb *save_ccb, 1215 int *openings, u_int32_t *relsim_flags, 1216 u_int32_t *timeout) 1217 { 1218 int error; 1219 1220 switch (ccb->csio.scsi_status) { 1221 case SCSI_STATUS_OK: 1222 case SCSI_STATUS_COND_MET: 1223 case SCSI_STATUS_INTERMED: 1224 case SCSI_STATUS_INTERMED_COND_MET: 1225 error = 0; 1226 break; 1227 case SCSI_STATUS_CMD_TERMINATED: 1228 case SCSI_STATUS_CHECK_COND: 1229 error = camperiphscsisenseerror(ccb, 1230 camflags, 1231 sense_flags, 1232 save_ccb, 1233 openings, 1234 relsim_flags, 1235 timeout); 1236 break; 1237 case SCSI_STATUS_QUEUE_FULL: 1238 { 1239 /* no decrement */ 1240 struct ccb_getdevstats cgds; 1241 1242 /* 1243 * First off, find out what the current 1244 * transaction counts are. 1245 */ 1246 xpt_setup_ccb(&cgds.ccb_h, 1247 ccb->ccb_h.path, 1248 /*priority*/1); 1249 cgds.ccb_h.func_code = XPT_GDEV_STATS; 1250 xpt_action((union ccb *)&cgds); 1251 1252 /* 1253 * If we were the only transaction active, treat 1254 * the QUEUE FULL as if it were a BUSY condition. 1255 */ 1256 if (cgds.dev_active != 0) { 1257 int total_openings; 1258 1259 /* 1260 * Reduce the number of openings to 1261 * be 1 less than the amount it took 1262 * to get a queue full bounded by the 1263 * minimum allowed tag count for this 1264 * device. 1265 */ 1266 total_openings = cgds.dev_active + cgds.dev_openings; 1267 *openings = cgds.dev_active; 1268 if (*openings < cgds.mintags) 1269 *openings = cgds.mintags; 1270 if (*openings < total_openings) 1271 *relsim_flags = RELSIM_ADJUST_OPENINGS; 1272 else { 1273 /* 1274 * Some devices report queue full for 1275 * temporary resource shortages. For 1276 * this reason, we allow a minimum 1277 * tag count to be entered via a 1278 * quirk entry to prevent the queue 1279 * count on these devices from falling 1280 * to a pessimisticly low value. We 1281 * still wait for the next successful 1282 * completion, however, before queueing 1283 * more transactions to the device. 1284 */ 1285 *relsim_flags = RELSIM_RELEASE_AFTER_CMDCMPLT; 1286 } 1287 *timeout = 0; 1288 error = ERESTART; 1289 if (bootverbose) { 1290 xpt_print(ccb->ccb_h.path, "Queue Full\n"); 1291 } 1292 break; 1293 } 1294 /* FALLTHROUGH */ 1295 } 1296 case SCSI_STATUS_BUSY: 1297 /* 1298 * Restart the queue after either another 1299 * command completes or a 1 second timeout. 1300 */ 1301 if (bootverbose) { 1302 xpt_print(ccb->ccb_h.path, "Device Busy\n"); 1303 } 1304 if (ccb->ccb_h.retry_count > 0) { 1305 ccb->ccb_h.retry_count--; 1306 error = ERESTART; 1307 *relsim_flags = RELSIM_RELEASE_AFTER_TIMEOUT 1308 | RELSIM_RELEASE_AFTER_CMDCMPLT; 1309 *timeout = 1000; 1310 } else { 1311 error = EIO; 1312 } 1313 break; 1314 case SCSI_STATUS_RESERV_CONFLICT: 1315 xpt_print(ccb->ccb_h.path, "Reservation Conflict\n"); 1316 error = EIO; 1317 break; 1318 default: 1319 xpt_print(ccb->ccb_h.path, "SCSI Status 0x%x\n", 1320 ccb->csio.scsi_status); 1321 error = EIO; 1322 break; 1323 } 1324 return (error); 1325 } 1326 1327 static int 1328 camperiphscsisenseerror(union ccb *ccb, cam_flags camflags, 1329 u_int32_t sense_flags, union ccb *save_ccb, 1330 int *openings, u_int32_t *relsim_flags, 1331 u_int32_t *timeout) 1332 { 1333 struct cam_periph *periph; 1334 int error; 1335 1336 periph = xpt_path_periph(ccb->ccb_h.path); 1337 if (periph->flags & CAM_PERIPH_RECOVERY_INPROG) { 1338 1339 /* 1340 * If error recovery is already in progress, don't attempt 1341 * to process this error, but requeue it unconditionally 1342 * and attempt to process it once error recovery has 1343 * completed. This failed command is probably related to 1344 * the error that caused the currently active error recovery 1345 * action so our current recovery efforts should also 1346 * address this command. Be aware that the error recovery 1347 * code assumes that only one recovery action is in progress 1348 * on a particular peripheral instance at any given time 1349 * (e.g. only one saved CCB for error recovery) so it is 1350 * imperitive that we don't violate this assumption. 1351 */ 1352 error = ERESTART; 1353 } else { 1354 scsi_sense_action err_action; 1355 struct ccb_getdev cgd; 1356 const char *action_string; 1357 union ccb* print_ccb; 1358 1359 /* A description of the error recovery action performed */ 1360 action_string = NULL; 1361 1362 /* 1363 * The location of the orignal ccb 1364 * for sense printing purposes. 1365 */ 1366 print_ccb = ccb; 1367 1368 /* 1369 * Grab the inquiry data for this device. 1370 */ 1371 xpt_setup_ccb(&cgd.ccb_h, ccb->ccb_h.path, /*priority*/ 1); 1372 cgd.ccb_h.func_code = XPT_GDEV_TYPE; 1373 xpt_action((union ccb *)&cgd); 1374 1375 if ((ccb->ccb_h.status & CAM_AUTOSNS_VALID) != 0) 1376 err_action = scsi_error_action(&ccb->csio, 1377 &cgd.inq_data, 1378 sense_flags); 1379 else if ((ccb->ccb_h.flags & CAM_DIS_AUTOSENSE) == 0) 1380 err_action = SS_REQSENSE; 1381 else 1382 err_action = SS_RETRY|SSQ_DECREMENT_COUNT|EIO; 1383 1384 error = err_action & SS_ERRMASK; 1385 1386 /* 1387 * If the recovery action will consume a retry, 1388 * make sure we actually have retries available. 1389 */ 1390 if ((err_action & SSQ_DECREMENT_COUNT) != 0) { 1391 if (ccb->ccb_h.retry_count > 0) 1392 ccb->ccb_h.retry_count--; 1393 else { 1394 action_string = "Retries Exhausted"; 1395 goto sense_error_done; 1396 } 1397 } 1398 1399 if ((err_action & SS_MASK) >= SS_START) { 1400 /* 1401 * Do common portions of commands that 1402 * use recovery CCBs. 1403 */ 1404 if (save_ccb == NULL) { 1405 action_string = "No recovery CCB supplied"; 1406 goto sense_error_done; 1407 } 1408 bcopy(ccb, save_ccb, sizeof(*save_ccb)); 1409 print_ccb = save_ccb; 1410 periph->flags |= CAM_PERIPH_RECOVERY_INPROG; 1411 } 1412 1413 switch (err_action & SS_MASK) { 1414 case SS_NOP: 1415 action_string = "No Recovery Action Needed"; 1416 error = 0; 1417 break; 1418 case SS_RETRY: 1419 action_string = "Retrying Command (per Sense Data)"; 1420 error = ERESTART; 1421 break; 1422 case SS_FAIL: 1423 action_string = "Unretryable error"; 1424 break; 1425 case SS_START: 1426 { 1427 int le; 1428 1429 /* 1430 * Send a start unit command to the device, and 1431 * then retry the command. 1432 */ 1433 action_string = "Attempting to Start Unit"; 1434 1435 /* 1436 * Check for removable media and set 1437 * load/eject flag appropriately. 1438 */ 1439 if (SID_IS_REMOVABLE(&cgd.inq_data)) 1440 le = TRUE; 1441 else 1442 le = FALSE; 1443 1444 scsi_start_stop(&ccb->csio, 1445 /*retries*/1, 1446 camperiphdone, 1447 MSG_SIMPLE_Q_TAG, 1448 /*start*/TRUE, 1449 /*load/eject*/le, 1450 /*immediate*/FALSE, 1451 SSD_FULL_SIZE, 1452 /*timeout*/50000); 1453 break; 1454 } 1455 case SS_TUR: 1456 { 1457 /* 1458 * Send a Test Unit Ready to the device. 1459 * If the 'many' flag is set, we send 120 1460 * test unit ready commands, one every half 1461 * second. Otherwise, we just send one TUR. 1462 * We only want to do this if the retry 1463 * count has not been exhausted. 1464 */ 1465 int retries; 1466 1467 if ((err_action & SSQ_MANY) != 0) { 1468 action_string = "Polling device for readiness"; 1469 retries = 120; 1470 } else { 1471 action_string = "Testing device for readiness"; 1472 retries = 1; 1473 } 1474 scsi_test_unit_ready(&ccb->csio, 1475 retries, 1476 camperiphdone, 1477 MSG_SIMPLE_Q_TAG, 1478 SSD_FULL_SIZE, 1479 /*timeout*/5000); 1480 1481 /* 1482 * Accomplish our 500ms delay by deferring 1483 * the release of our device queue appropriately. 1484 */ 1485 *relsim_flags = RELSIM_RELEASE_AFTER_TIMEOUT; 1486 *timeout = 500; 1487 break; 1488 } 1489 case SS_REQSENSE: 1490 { 1491 /* 1492 * Send a Request Sense to the device. We 1493 * assume that we are in a contingent allegiance 1494 * condition so we do not tag this request. 1495 */ 1496 scsi_request_sense(&ccb->csio, /*retries*/1, 1497 camperiphdone, 1498 &save_ccb->csio.sense_data, 1499 sizeof(save_ccb->csio.sense_data), 1500 CAM_TAG_ACTION_NONE, 1501 /*sense_len*/SSD_FULL_SIZE, 1502 /*timeout*/5000); 1503 break; 1504 } 1505 default: 1506 panic("Unhandled error action %x", err_action); 1507 } 1508 1509 if ((err_action & SS_MASK) >= SS_START) { 1510 /* 1511 * Drop the priority to 0 so that the recovery 1512 * CCB is the first to execute. Freeze the queue 1513 * after this command is sent so that we can 1514 * restore the old csio and have it queued in 1515 * the proper order before we release normal 1516 * transactions to the device. 1517 */ 1518 ccb->ccb_h.pinfo.priority = 0; 1519 ccb->ccb_h.flags |= CAM_DEV_QFREEZE; 1520 ccb->ccb_h.saved_ccb_ptr = save_ccb; 1521 error = ERESTART; 1522 } 1523 1524 sense_error_done: 1525 if ((err_action & SSQ_PRINT_SENSE) != 0 1526 && (ccb->ccb_h.status & CAM_AUTOSNS_VALID) != 0) { 1527 cam_error_print(print_ccb, CAM_ESF_ALL, CAM_EPF_ALL); 1528 xpt_print_path(ccb->ccb_h.path); 1529 if (bootverbose) 1530 scsi_sense_print(&print_ccb->csio); 1531 printf("%s\n", action_string); 1532 } 1533 } 1534 return (error); 1535 } 1536 1537 /* 1538 * Generic error handler. Peripheral drivers usually filter 1539 * out the errors that they handle in a unique mannor, then 1540 * call this function. 1541 */ 1542 int 1543 cam_periph_error(union ccb *ccb, cam_flags camflags, 1544 u_int32_t sense_flags, union ccb *save_ccb) 1545 { 1546 const char *action_string; 1547 cam_status status; 1548 int frozen; 1549 int error, printed = 0; 1550 int openings; 1551 u_int32_t relsim_flags; 1552 u_int32_t timeout = 0; 1553 1554 action_string = NULL; 1555 status = ccb->ccb_h.status; 1556 frozen = (status & CAM_DEV_QFRZN) != 0; 1557 status &= CAM_STATUS_MASK; 1558 openings = relsim_flags = 0; 1559 1560 switch (status) { 1561 case CAM_REQ_CMP: 1562 error = 0; 1563 break; 1564 case CAM_SCSI_STATUS_ERROR: 1565 error = camperiphscsistatuserror(ccb, 1566 camflags, 1567 sense_flags, 1568 save_ccb, 1569 &openings, 1570 &relsim_flags, 1571 &timeout); 1572 break; 1573 case CAM_AUTOSENSE_FAIL: 1574 xpt_print(ccb->ccb_h.path, "AutoSense Failed\n"); 1575 error = EIO; /* we have to kill the command */ 1576 break; 1577 case CAM_REQ_CMP_ERR: 1578 if (bootverbose && printed == 0) { 1579 xpt_print(ccb->ccb_h.path, 1580 "Request completed with CAM_REQ_CMP_ERR\n"); 1581 printed++; 1582 } 1583 /* FALLTHROUGH */ 1584 case CAM_CMD_TIMEOUT: 1585 if (bootverbose && printed == 0) { 1586 xpt_print(ccb->ccb_h.path, "Command timed out\n"); 1587 printed++; 1588 } 1589 /* FALLTHROUGH */ 1590 case CAM_UNEXP_BUSFREE: 1591 if (bootverbose && printed == 0) { 1592 xpt_print(ccb->ccb_h.path, "Unexpected Bus Free\n"); 1593 printed++; 1594 } 1595 /* FALLTHROUGH */ 1596 case CAM_UNCOR_PARITY: 1597 if (bootverbose && printed == 0) { 1598 xpt_print(ccb->ccb_h.path, 1599 "Uncorrected Parity Error\n"); 1600 printed++; 1601 } 1602 /* FALLTHROUGH */ 1603 case CAM_DATA_RUN_ERR: 1604 if (bootverbose && printed == 0) { 1605 xpt_print(ccb->ccb_h.path, "Data Overrun\n"); 1606 printed++; 1607 } 1608 error = EIO; /* we have to kill the command */ 1609 /* decrement the number of retries */ 1610 if (ccb->ccb_h.retry_count > 0) { 1611 ccb->ccb_h.retry_count--; 1612 error = ERESTART; 1613 } else { 1614 action_string = "Retries Exausted"; 1615 error = EIO; 1616 } 1617 break; 1618 case CAM_UA_ABORT: 1619 case CAM_UA_TERMIO: 1620 case CAM_MSG_REJECT_REC: 1621 /* XXX Don't know that these are correct */ 1622 error = EIO; 1623 break; 1624 case CAM_SEL_TIMEOUT: 1625 { 1626 struct cam_path *newpath; 1627 1628 if ((camflags & CAM_RETRY_SELTO) != 0) { 1629 if (ccb->ccb_h.retry_count > 0) { 1630 1631 ccb->ccb_h.retry_count--; 1632 error = ERESTART; 1633 if (bootverbose && printed == 0) { 1634 xpt_print(ccb->ccb_h.path, 1635 "Selection Timeout\n"); 1636 printed++; 1637 } 1638 1639 /* 1640 * Wait a bit to give the device 1641 * time to recover before we try again. 1642 */ 1643 relsim_flags = RELSIM_RELEASE_AFTER_TIMEOUT; 1644 timeout = periph_selto_delay; 1645 break; 1646 } 1647 } 1648 error = ENXIO; 1649 /* Should we do more if we can't create the path?? */ 1650 if (xpt_create_path(&newpath, xpt_path_periph(ccb->ccb_h.path), 1651 xpt_path_path_id(ccb->ccb_h.path), 1652 xpt_path_target_id(ccb->ccb_h.path), 1653 CAM_LUN_WILDCARD) != CAM_REQ_CMP) 1654 break; 1655 1656 /* 1657 * Let peripheral drivers know that this device has gone 1658 * away. 1659 */ 1660 xpt_async(AC_LOST_DEVICE, newpath, NULL); 1661 xpt_free_path(newpath); 1662 break; 1663 } 1664 case CAM_REQ_INVALID: 1665 case CAM_PATH_INVALID: 1666 case CAM_DEV_NOT_THERE: 1667 case CAM_NO_HBA: 1668 case CAM_PROVIDE_FAIL: 1669 case CAM_REQ_TOO_BIG: 1670 case CAM_LUN_INVALID: 1671 case CAM_TID_INVALID: 1672 error = EINVAL; 1673 break; 1674 case CAM_SCSI_BUS_RESET: 1675 case CAM_BDR_SENT: 1676 /* 1677 * Commands that repeatedly timeout and cause these 1678 * kinds of error recovery actions, should return 1679 * CAM_CMD_TIMEOUT, which allows us to safely assume 1680 * that this command was an innocent bystander to 1681 * these events and should be unconditionally 1682 * retried. 1683 */ 1684 if (bootverbose && printed == 0) { 1685 xpt_print_path(ccb->ccb_h.path); 1686 if (status == CAM_BDR_SENT) 1687 printf("Bus Device Reset sent\n"); 1688 else 1689 printf("Bus Reset issued\n"); 1690 printed++; 1691 } 1692 /* FALLTHROUGH */ 1693 case CAM_REQUEUE_REQ: 1694 /* Unconditional requeue */ 1695 error = ERESTART; 1696 if (bootverbose && printed == 0) { 1697 xpt_print(ccb->ccb_h.path, "Request Requeued\n"); 1698 printed++; 1699 } 1700 break; 1701 case CAM_RESRC_UNAVAIL: 1702 /* Wait a bit for the resource shortage to abate. */ 1703 timeout = periph_noresrc_delay; 1704 /* FALLTHROUGH */ 1705 case CAM_BUSY: 1706 if (timeout == 0) { 1707 /* Wait a bit for the busy condition to abate. */ 1708 timeout = periph_busy_delay; 1709 } 1710 relsim_flags = RELSIM_RELEASE_AFTER_TIMEOUT; 1711 /* FALLTHROUGH */ 1712 default: 1713 /* decrement the number of retries */ 1714 if (ccb->ccb_h.retry_count > 0) { 1715 ccb->ccb_h.retry_count--; 1716 error = ERESTART; 1717 if (bootverbose && printed == 0) { 1718 xpt_print(ccb->ccb_h.path, "CAM Status 0x%x\n", 1719 status); 1720 printed++; 1721 } 1722 } else { 1723 error = EIO; 1724 action_string = "Retries Exhausted"; 1725 } 1726 break; 1727 } 1728 1729 /* Attempt a retry */ 1730 if (error == ERESTART || error == 0) { 1731 if (frozen != 0) 1732 ccb->ccb_h.status &= ~CAM_DEV_QFRZN; 1733 1734 if (error == ERESTART) { 1735 action_string = "Retrying Command"; 1736 xpt_action(ccb); 1737 } 1738 1739 if (frozen != 0) 1740 cam_release_devq(ccb->ccb_h.path, 1741 relsim_flags, 1742 openings, 1743 timeout, 1744 /*getcount_only*/0); 1745 } 1746 1747 /* 1748 * If we have and error and are booting verbosely, whine 1749 * *unless* this was a non-retryable selection timeout. 1750 */ 1751 if (error != 0 && bootverbose && 1752 !(status == CAM_SEL_TIMEOUT && (camflags & CAM_RETRY_SELTO) == 0)) { 1753 1754 1755 if (action_string == NULL) 1756 action_string = "Unretryable Error"; 1757 if (error != ERESTART) { 1758 xpt_print(ccb->ccb_h.path, "error %d\n", error); 1759 } 1760 xpt_print(ccb->ccb_h.path, "%s\n", action_string); 1761 } 1762 1763 return (error); 1764 } 1765