Lines Matching +full:sense +full:- +full:mode

1 /*-
2 * SPDX-License-Identifier: BSD-4-Clause
5 * Copyright (c) 1998-2002 Katsushi Kobayashi and Hidetoshi Shimokawa
75 #define SBP_QUEUE_LEN ((SBP_DMA_SIZE - SBP_LOGIN_SIZE) / sizeof(struct sbp_ocb))
81 *-----------------------
82 * 0- 1( 2): 0 (alignment)
83 * 2- 7( 6): target
84 * 8-15( 8): lun
85 * 16-31( 8): reserved
86 * 32-47(16): SBP_BIND_HI
87 * 48-64(16): bus_id, node_id
104 static int max_speed = -1;
114 "SBP-II Subsystem");
151 #define OCB_MATCH(o,s) ((o)->bus_addr == ntohl((s)->orb_lo))
219 #define SBP_LOCK(sbp) mtx_lock(&(sbp)->mtx)
220 #define SBP_UNLOCK(sbp) mtx_unlock(&(sbp)->mtx)
221 #define SBP_LOCK_ASSERT(sbp) mtx_assert(&(sbp)->mtx, MA_OWNED)
247 static MALLOC_DEFINE(M_SBP, "sbp", "SBP-II/FireWire");
283 /* 2 */ "Time-out error",
321 device_set_desc(dev, "SBP-2/SCSI over FireWire"); in sbp_probe()
339 fwdev = sdev->target->fwdev; in sbp_show_sdev_info()
340 device_printf(sdev->target->sbp->fd.dev, in sbp_show_sdev_info()
344 sdev->bustgtlun, in sbp_show_sdev_info()
345 (sdev->type & 0x40) >> 6, in sbp_show_sdev_info()
346 (sdev->type & 0x1f), in sbp_show_sdev_info()
347 fwdev->eui.hi, in sbp_show_sdev_info()
348 fwdev->eui.lo, in sbp_show_sdev_info()
349 fwdev->dst, in sbp_show_sdev_info()
350 fwdev->speed, in sbp_show_sdev_info()
351 fwdev->maxrec); in sbp_show_sdev_info()
353 device_printf(sdev->target->sbp->fd.dev, in sbp_show_sdev_info()
356 sdev->bustgtlun, in sbp_show_sdev_info()
357 sdev->vendor, in sbp_show_sdev_info()
358 sdev->product, in sbp_show_sdev_info()
359 sdev->revision); in sbp_show_sdev_info()
373 {-1, -1, {0,0}}
379 int bus, i, target=-1; in sbp_new_target()
383 bus = device_get_unit(sbp->fd.dev); in sbp_new_target()
385 /* XXX wired-down configuration should be gotten from in sbp_new_target()
390 if (wired[i].eui.hi == fwdev->eui.hi && in sbp_new_target()
391 wired[i].eui.lo == fwdev->eui.lo) in sbp_new_target()
397 sbp->targets[target].fwdev == NULL) in sbp_new_target()
399 device_printf(sbp->fd.dev, in sbp_new_target()
401 target, fwdev->eui.hi, fwdev->eui.lo); in sbp_new_target()
402 target = -1; in sbp_new_target()
404 /* non-wired target */ in sbp_new_target()
406 if (sbp->targets[i].fwdev == NULL && w[i] == 0) { in sbp_new_target()
423 sbp = target->sbp; in sbp_alloc_lun()
424 crom_init_context(&cc, target->fwdev->csrrom); in sbp_alloc_lun()
426 maxlun = -1; in sbp_alloc_lun()
431 lun = reg->val & 0xffff; in sbp_alloc_lun()
433 printf("target %d lun %d found\n", target->target_id, lun); in sbp_alloc_lun()
440 device_printf(target->sbp->fd.dev, "%d no LUN found\n", in sbp_alloc_lun()
441 target->target_id); in sbp_alloc_lun()
448 for (lun = 0; lun < target->num_lun; lun++) { in sbp_alloc_lun()
449 sdev = target->luns[lun]; in sbp_alloc_lun()
452 sdev->flags &= ~VALID_LUN; in sbp_alloc_lun()
457 target->luns[lun] = NULL; in sbp_alloc_lun()
462 if (maxlun != target->num_lun) { in sbp_alloc_lun()
463 newluns = (struct sbp_dev **) realloc(target->luns, in sbp_alloc_lun()
469 newluns = target->luns; in sbp_alloc_lun()
470 maxlun = target->num_lun; in sbp_alloc_lun()
477 if (maxlun > target->num_lun) in sbp_alloc_lun()
478 bzero(&newluns[target->num_lun], in sbp_alloc_lun()
480 (maxlun - target->num_lun)); in sbp_alloc_lun()
482 target->luns = newluns; in sbp_alloc_lun()
483 target->num_lun = maxlun; in sbp_alloc_lun()
486 crom_init_context(&cc, target->fwdev->csrrom); in sbp_alloc_lun()
493 lun = reg->val & 0xffff; in sbp_alloc_lun()
499 sdev = target->luns[lun]; in sbp_alloc_lun()
507 target->luns[lun] = sdev; in sbp_alloc_lun()
508 sdev->lun_id = lun; in sbp_alloc_lun()
509 sdev->target = target; in sbp_alloc_lun()
510 STAILQ_INIT(&sdev->ocbs); in sbp_alloc_lun()
511 callout_init_mtx(&sdev->login_callout, &sbp->mtx, 0); in sbp_alloc_lun()
512 sdev->status = SBP_DEV_RESET; in sbp_alloc_lun()
514 snprintf(sdev->bustgtlun, 32, "%s:%d:%d", in sbp_alloc_lun()
515 device_get_nameunit(sdev->target->sbp->fd.dev), in sbp_alloc_lun()
516 sdev->target->target_id, in sbp_alloc_lun()
517 sdev->lun_id); in sbp_alloc_lun()
519 sdev->flags |= VALID_LUN; in sbp_alloc_lun()
520 sdev->type = (reg->val & 0xff0000) >> 16; in sbp_alloc_lun()
525 fwdma_malloc(sbp->fd.fc, in sbp_alloc_lun()
527 SBP_DMA_SIZE, &sdev->dma, BUS_DMA_NOWAIT | in sbp_alloc_lun()
529 if (sdev->dma.v_addr == NULL) { in sbp_alloc_lun()
533 target->luns[lun] = NULL; in sbp_alloc_lun()
536 sdev->login = (struct sbp_login_res *) sdev->dma.v_addr; in sbp_alloc_lun()
537 sdev->ocb = (struct sbp_ocb *) in sbp_alloc_lun()
538 ((char *)sdev->dma.v_addr + SBP_LOGIN_SIZE); in sbp_alloc_lun()
539 bzero((char *)sdev->ocb, in sbp_alloc_lun()
542 STAILQ_INIT(&sdev->free_ocbs); in sbp_alloc_lun()
545 ocb = &sdev->ocb[i]; in sbp_alloc_lun()
546 ocb->bus_addr = sdev->dma.bus_addr in sbp_alloc_lun()
550 if (bus_dmamap_create(sbp->dmat, 0, &ocb->dmamap)) { in sbp_alloc_lun()
555 callout_init_mtx(&ocb->timer, &sbp->mtx, 0); in sbp_alloc_lun()
564 for (lun = 0; lun < target->num_lun; lun++) { in sbp_alloc_lun()
565 sdev = target->luns[lun]; in sbp_alloc_lun()
566 if (sdev != NULL && (sdev->flags & VALID_LUN) == 0) { in sbp_alloc_lun()
569 target->luns[lun] = NULL; in sbp_alloc_lun()
587 device_printf(sbp->fd.dev, "increase SBP_NUM_TARGETS!\n"); in sbp_alloc_target()
591 target = &sbp->targets[i]; in sbp_alloc_target()
592 target->fwdev = fwdev; in sbp_alloc_target()
593 target->target_id = i; in sbp_alloc_target()
596 crom_init_context(&cc, target->fwdev->csrrom); in sbp_alloc_target()
598 if (reg == NULL || reg->val == 0) { in sbp_alloc_target()
600 target->fwdev = NULL; in sbp_alloc_target()
603 target->mgm_hi = 0xffff; in sbp_alloc_target()
604 target->mgm_lo = 0xf0000000 | (reg->val << 2); in sbp_alloc_target()
605 target->mgm_ocb_cur = NULL; in sbp_alloc_target()
607 printf("target:%d mgm_port: %x\n", i, target->mgm_lo); in sbp_alloc_target()
609 STAILQ_INIT(&target->xferlist); in sbp_alloc_target()
610 target->n_xfer = 0; in sbp_alloc_target()
611 STAILQ_INIT(&target->mgm_ocb_queue); in sbp_alloc_target()
612 callout_init_mtx(&target->mgm_ocb_timeout, &sbp->mtx, 0); in sbp_alloc_target()
613 callout_init_mtx(&target->scan_callout, &sbp->mtx, 0); in sbp_alloc_target()
615 target->luns = NULL; in sbp_alloc_target()
616 target->num_lun = 0; in sbp_alloc_target()
627 bzero(sdev->vendor, sizeof(sdev->vendor)); in sbp_probe_lun()
628 bzero(sdev->product, sizeof(sdev->product)); in sbp_probe_lun()
630 fwdev = sdev->target->fwdev; in sbp_probe_lun()
631 crom_init_context(cc, fwdev->csrrom); in sbp_probe_lun()
635 crom_parse_text(cc, sdev->vendor, sizeof(sdev->vendor)); in sbp_probe_lun()
636 /* skip to the unit directory for SBP-2 */ in sbp_probe_lun()
638 if (reg->val == CSRVAL_T10SBP2) in sbp_probe_lun()
645 snprintf(sdev->revision, sizeof(sdev->revision), in sbp_probe_lun()
646 "%06x", reg->val); in sbp_probe_lun()
650 crom_parse_text(cc, sdev->product, sizeof(sdev->product)); in sbp_probe_lun()
657 SBP_LOCK_ASSERT(sdev->target->sbp); in sbp_login_callout()
669 timevalsub(&delta, &sdev->target->sbp->last_busreset); in sbp_login()
679 callout_reset(&sdev->login_callout, ticks, in sbp_login()
683 #define SBP_FWDEV_ALIVE(fwdev) (((fwdev)->status == FWDEVATTACHED) \
684 && crom_has_specver((fwdev)->csrrom, CSRVAL_ANSIT10, CSRVAL_T10SBP2))
689 struct sbp_softc *sbp = target->sbp; in sbp_probe_target()
693 alive = SBP_FWDEV_ALIVE(target->fwdev); in sbp_probe_target()
695 device_printf(sbp->fd.dev, "%s %d%salive\n", in sbp_probe_target()
696 __func__, target->target_id, in sbp_probe_target()
703 for (i=0; i < target->num_lun; i++) { in sbp_probe_target()
704 sdev = target->luns[i]; in sbp_probe_target()
707 if (alive && (sdev->status != SBP_DEV_DEAD)) { in sbp_probe_target()
708 if (sdev->path != NULL) { in sbp_probe_target()
709 xpt_freeze_devq(sdev->path, 1); in sbp_probe_target()
710 sdev->freeze++; in sbp_probe_target()
718 switch (sdev->status) { in sbp_probe_target()
733 switch (sdev->status) { in sbp_probe_target()
737 device_printf(sbp->fd.dev, "%s: lost target\n", in sbp_probe_target()
740 if (sdev->path) { in sbp_probe_target()
741 xpt_freeze_devq(sdev->path, 1); in sbp_probe_target()
742 sdev->freeze++; in sbp_probe_target()
744 sdev->status = SBP_DEV_RETRY; in sbp_probe_target()
747 target->luns[i] = NULL; in sbp_probe_target()
751 sdev->status = SBP_DEV_RESET; in sbp_probe_target()
772 if ((sbp->flags & SIMQ_FREEZED) == 0) { in sbp_post_busreset()
773 xpt_freeze_simq(sbp->sim, /*count*/1); in sbp_post_busreset()
774 sbp->flags |= SIMQ_FREEZED; in sbp_post_busreset()
776 microtime(&sbp->last_busreset); in sbp_post_busreset()
796 sbp_cold--; in sbp_post_explore()
802 target = &sbp->targets[i]; in sbp_post_explore()
803 if (target->fwdev == NULL) in sbp_post_explore()
806 STAILQ_FOREACH(fwdev, &sbp->fd.fc->devices, link) in sbp_post_explore()
807 if (target->fwdev == fwdev) in sbp_post_explore()
817 STAILQ_FOREACH(fwdev, &sbp->fd.fc->devices, link) { in sbp_post_explore()
819 device_printf(sbp->fd.dev,"%s:: EUI:%08x%08x %s attached, state=%d\n", in sbp_post_explore()
820 __func__, fwdev->eui.hi, fwdev->eui.lo, in sbp_post_explore()
821 (fwdev->status != FWDEVATTACHED) ? "not" : "", in sbp_post_explore()
822 fwdev->status); in sbp_post_explore()
826 target = &sbp->targets[i]; in sbp_post_explore()
827 if (target->fwdev == fwdev) { in sbp_post_explore()
853 if (target->num_lun == 0) in sbp_post_explore()
856 if ((sbp->flags & SIMQ_FREEZED) != 0) { in sbp_post_explore()
857 xpt_release_simq(sbp->sim, /*run queue*/TRUE); in sbp_post_explore()
858 sbp->flags &= ~SIMQ_FREEZED; in sbp_post_explore()
868 sdev = (struct sbp_dev *)xfer->sc; in sbp_loginres_callback()
870 device_printf(sdev->target->sbp->fd.dev,"%s\n", __func__); in sbp_loginres_callback()
873 SBP_LOCK(sdev->target->sbp); in sbp_loginres_callback()
874 STAILQ_INSERT_TAIL(&sdev->target->sbp->fwb.xferlist, xfer, link); in sbp_loginres_callback()
875 SBP_UNLOCK(sdev->target->sbp); in sbp_loginres_callback()
885 sdev = (struct sbp_dev *)xfer->sc; in sbp_xfer_free()
887 SBP_LOCK_ASSERT(sdev->target->sbp); in sbp_xfer_free()
888 STAILQ_INSERT_TAIL(&sdev->target->xferlist, xfer, link); in sbp_xfer_free()
894 struct sbp_dev *tsdev, *sdev = (struct sbp_dev *)xfer->sc; in sbp_reset_start_callback()
895 struct sbp_target *target = sdev->target; in sbp_reset_start_callback()
898 if (xfer->resp != 0) { in sbp_reset_start_callback()
899 device_printf(sdev->target->sbp->fd.dev, in sbp_reset_start_callback()
900 "%s: %s failed: resp=%d\n", __func__, sdev->bustgtlun, xfer->resp); in sbp_reset_start_callback()
903 SBP_LOCK(target->sbp); in sbp_reset_start_callback()
904 for (i = 0; i < target->num_lun; i++) { in sbp_reset_start_callback()
905 tsdev = target->luns[i]; in sbp_reset_start_callback()
906 if (tsdev != NULL && tsdev->status == SBP_DEV_LOGIN) in sbp_reset_start_callback()
909 SBP_UNLOCK(target->sbp); in sbp_reset_start_callback()
919 device_printf(sdev->target->sbp->fd.dev, in sbp_reset_start()
920 "%s:%s\n", __func__,sdev->bustgtlun); in sbp_reset_start()
924 xfer->hand = sbp_reset_start_callback; in sbp_reset_start()
925 fp = &xfer->send.hdr; in sbp_reset_start()
926 fp->mode.wreqq.dest_hi = 0xffff; in sbp_reset_start()
927 fp->mode.wreqq.dest_lo = 0xf0000000 | RESET_START; in sbp_reset_start()
928 fp->mode.wreqq.data = htonl(0xf); in sbp_reset_start()
929 fw_asyreq(xfer->fc, -1, xfer); in sbp_reset_start()
937 sdev = (struct sbp_dev *)xfer->sc; in sbp_mgm_callback()
940 device_printf(sdev->target->sbp->fd.dev, in sbp_mgm_callback()
941 "%s:%s\n", __func__, sdev->bustgtlun); in sbp_mgm_callback()
943 SBP_LOCK(sdev->target->sbp); in sbp_mgm_callback()
945 SBP_UNLOCK(sdev->target->sbp); in sbp_mgm_callback()
954 for (i = lun, sdevp = &target->luns[lun]; i < target->num_lun; in sbp_next_dev()
956 if (*sdevp != NULL && (*sdevp)->status == SBP_DEV_PROBE) in sbp_next_dev()
969 sdev = (struct sbp_dev *) ccb->ccb_h.ccb_sdev_ptr; in sbp_cam_scan_lun()
970 target = sdev->target; in sbp_cam_scan_lun()
971 sbp = target->sbp; in sbp_cam_scan_lun()
974 device_printf(sbp->fd.dev, in sbp_cam_scan_lun()
975 "%s:%s\n", __func__, sdev->bustgtlun); in sbp_cam_scan_lun()
977 if ((ccb->ccb_h.status & CAM_STATUS_MASK) == CAM_REQ_CMP) { in sbp_cam_scan_lun()
978 sdev->status = SBP_DEV_ATTACHED; in sbp_cam_scan_lun()
980 device_printf(sbp->fd.dev, in sbp_cam_scan_lun()
981 "%s:%s failed\n", __func__, sdev->bustgtlun); in sbp_cam_scan_lun()
983 sdev = sbp_next_dev(target, sdev->lun_id + 1); in sbp_cam_scan_lun()
990 xpt_setup_ccb(&ccb->ccb_h, sdev->path, SCAN_PRI); in sbp_cam_scan_lun()
991 ccb->ccb_h.ccb_sdev_ptr = sdev; in sbp_cam_scan_lun()
992 ccb->ccb_h.flags |= CAM_DEV_QFREEZE; in sbp_cam_scan_lun()
996 xpt_release_devq(sdev->path, sdev->freeze, TRUE); in sbp_cam_scan_lun()
997 sdev->freeze = 1; in sbp_cam_scan_lun()
1007 SBP_LOCK_ASSERT(target->sbp); in sbp_cam_scan_target()
1011 target->target_id); in sbp_cam_scan_target()
1015 device_printf(sdev->target->sbp->fd.dev, in sbp_cam_scan_target()
1016 "%s:%s\n", __func__, sdev->bustgtlun); in sbp_cam_scan_target()
1023 SBP_UNLOCK(target->sbp); in sbp_cam_scan_target()
1025 xpt_setup_ccb(&ccb->ccb_h, sdev->path, SCAN_PRI); in sbp_cam_scan_target()
1026 ccb->ccb_h.func_code = XPT_SCAN_LUN; in sbp_cam_scan_target()
1027 ccb->ccb_h.cbfcnp = sbp_cam_scan_lun; in sbp_cam_scan_target()
1028 ccb->ccb_h.flags |= CAM_DEV_QFREEZE; in sbp_cam_scan_target()
1029 ccb->crcn.flags = CAM_FLAG_NONE; in sbp_cam_scan_target()
1030 ccb->ccb_h.ccb_sdev_ptr = sdev; in sbp_cam_scan_target()
1035 SBP_LOCK(target->sbp); in sbp_cam_scan_target()
1036 xpt_release_devq(sdev->path, sdev->freeze, TRUE); in sbp_cam_scan_target()
1037 sdev->freeze = 1; in sbp_cam_scan_target()
1043 sdev->status = SBP_DEV_PROBE; in sbp_scan_dev()
1044 callout_reset_sbt(&sdev->target->scan_callout, SBT_1MS * scan_delay, 0, in sbp_scan_dev()
1045 sbp_cam_scan_target, (void *)sdev->target, 0); in sbp_scan_dev()
1055 sdev = (struct sbp_dev *)xfer->sc; in sbp_do_attach()
1056 target = sdev->target; in sbp_do_attach()
1057 sbp = target->sbp; in sbp_do_attach()
1060 device_printf(sdev->target->sbp->fd.dev, in sbp_do_attach()
1061 "%s:%s\n", __func__, sdev->bustgtlun); in sbp_do_attach()
1065 if (sdev->path == NULL) in sbp_do_attach()
1066 xpt_create_path(&sdev->path, NULL, in sbp_do_attach()
1067 cam_sim_path(target->sbp->sim), in sbp_do_attach()
1068 target->target_id, sdev->lun_id); in sbp_do_attach()
1076 sdev->status = SBP_DEV_ATTACHED; in sbp_do_attach()
1090 sdev = (struct sbp_dev *)xfer->sc; in sbp_agent_reset_callback()
1092 device_printf(sdev->target->sbp->fd.dev, in sbp_agent_reset_callback()
1093 "%s:%s\n", __func__, sdev->bustgtlun); in sbp_agent_reset_callback()
1095 if (xfer->resp != 0) { in sbp_agent_reset_callback()
1096 device_printf(sdev->target->sbp->fd.dev, in sbp_agent_reset_callback()
1097 "%s:%s resp=%d\n", __func__, sdev->bustgtlun, xfer->resp); in sbp_agent_reset_callback()
1100 SBP_LOCK(sdev->target->sbp); in sbp_agent_reset_callback()
1102 if (sdev->path) { in sbp_agent_reset_callback()
1103 xpt_release_devq(sdev->path, sdev->freeze, TRUE); in sbp_agent_reset_callback()
1104 sdev->freeze = 0; in sbp_agent_reset_callback()
1106 SBP_UNLOCK(sdev->target->sbp); in sbp_agent_reset_callback()
1115 SBP_LOCK_ASSERT(sdev->target->sbp); in sbp_agent_reset()
1117 device_printf(sdev->target->sbp->fd.dev, in sbp_agent_reset()
1118 "%s:%s\n", __func__, sdev->bustgtlun); in sbp_agent_reset()
1123 if (sdev->status == SBP_DEV_ATTACHED || sdev->status == SBP_DEV_PROBE) in sbp_agent_reset()
1124 xfer->hand = sbp_agent_reset_callback; in sbp_agent_reset()
1126 xfer->hand = sbp_do_attach; in sbp_agent_reset()
1127 fp = &xfer->send.hdr; in sbp_agent_reset()
1128 fp->mode.wreqq.data = htonl(0xf); in sbp_agent_reset()
1129 fw_asyreq(xfer->fc, -1, xfer); in sbp_agent_reset()
1138 sdev = (struct sbp_dev *)xfer->sc; in sbp_busy_timeout_callback()
1140 device_printf(sdev->target->sbp->fd.dev, in sbp_busy_timeout_callback()
1141 "%s:%s\n", __func__, sdev->bustgtlun); in sbp_busy_timeout_callback()
1143 SBP_LOCK(sdev->target->sbp); in sbp_busy_timeout_callback()
1146 SBP_UNLOCK(sdev->target->sbp); in sbp_busy_timeout_callback()
1155 device_printf(sdev->target->sbp->fd.dev, in sbp_busy_timeout()
1156 "%s:%s\n", __func__, sdev->bustgtlun); in sbp_busy_timeout()
1160 xfer->hand = sbp_busy_timeout_callback; in sbp_busy_timeout()
1161 fp = &xfer->send.hdr; in sbp_busy_timeout()
1162 fp->mode.wreqq.dest_hi = 0xffff; in sbp_busy_timeout()
1163 fp->mode.wreqq.dest_lo = 0xf0000000 | BUSY_TIMEOUT; in sbp_busy_timeout()
1164 fp->mode.wreqq.data = htonl((1 << (13 + 12)) | 0xf); in sbp_busy_timeout()
1165 fw_asyreq(xfer->fc, -1, xfer); in sbp_busy_timeout()
1172 sdev = (struct sbp_dev *)xfer->sc; in sbp_orb_pointer_callback()
1175 device_printf(sdev->target->sbp->fd.dev, in sbp_orb_pointer_callback()
1176 "%s:%s\n", __func__, sdev->bustgtlun); in sbp_orb_pointer_callback()
1178 if (xfer->resp != 0) { in sbp_orb_pointer_callback()
1180 printf("%s: xfer->resp = %d\n", __func__, xfer->resp); in sbp_orb_pointer_callback()
1182 SBP_LOCK(sdev->target->sbp); in sbp_orb_pointer_callback()
1185 sdev->flags &= ~ORB_POINTER_ACTIVE; in sbp_orb_pointer_callback()
1187 if ((sdev->flags & ORB_POINTER_NEED) != 0) { in sbp_orb_pointer_callback()
1190 sdev->flags &= ~ORB_POINTER_NEED; in sbp_orb_pointer_callback()
1191 ocb = STAILQ_FIRST(&sdev->ocbs); in sbp_orb_pointer_callback()
1195 SBP_UNLOCK(sdev->target->sbp); in sbp_orb_pointer_callback()
1205 device_printf(sdev->target->sbp->fd.dev, in sbp_orb_pointer()
1207 __func__, sdev->bustgtlun, in sbp_orb_pointer()
1208 (uint32_t)ocb->bus_addr); in sbp_orb_pointer()
1211 SBP_LOCK_ASSERT(sdev->target->sbp); in sbp_orb_pointer()
1213 if ((sdev->flags & ORB_POINTER_ACTIVE) != 0) { in sbp_orb_pointer()
1217 sdev->flags |= ORB_POINTER_NEED; in sbp_orb_pointer()
1221 sdev->flags |= ORB_POINTER_ACTIVE; in sbp_orb_pointer()
1225 xfer->hand = sbp_orb_pointer_callback; in sbp_orb_pointer()
1227 fp = &xfer->send.hdr; in sbp_orb_pointer()
1228 fp->mode.wreqb.len = 8; in sbp_orb_pointer()
1229 fp->mode.wreqb.extcode = 0; in sbp_orb_pointer()
1230 xfer->send.payload[0] = in sbp_orb_pointer()
1231 htonl(((sdev->target->sbp->fd.fc->nodeid | FWLOCALBUS) << 16)); in sbp_orb_pointer()
1232 xfer->send.payload[1] = htonl((uint32_t)ocb->bus_addr); in sbp_orb_pointer()
1234 if (fw_asyreq(xfer->fc, -1, xfer) != 0) { in sbp_orb_pointer()
1236 ocb->ccb->ccb_h.status = CAM_REQ_INVALID; in sbp_orb_pointer()
1237 xpt_done(ocb->ccb); in sbp_orb_pointer()
1245 sdev = (struct sbp_dev *)xfer->sc; in sbp_doorbell_callback()
1248 device_printf(sdev->target->sbp->fd.dev, in sbp_doorbell_callback()
1249 "%s:%s\n", __func__, sdev->bustgtlun); in sbp_doorbell_callback()
1251 if (xfer->resp != 0) { in sbp_doorbell_callback()
1253 device_printf(sdev->target->sbp->fd.dev, in sbp_doorbell_callback()
1254 "%s: xfer->resp = %d\n", __func__, xfer->resp); in sbp_doorbell_callback()
1256 SBP_LOCK(sdev->target->sbp); in sbp_doorbell_callback()
1258 sdev->flags &= ~ORB_DOORBELL_ACTIVE; in sbp_doorbell_callback()
1259 if ((sdev->flags & ORB_DOORBELL_NEED) != 0) { in sbp_doorbell_callback()
1260 sdev->flags &= ~ORB_DOORBELL_NEED; in sbp_doorbell_callback()
1263 SBP_UNLOCK(sdev->target->sbp); in sbp_doorbell_callback()
1272 device_printf(sdev->target->sbp->fd.dev, in sbp_doorbell()
1273 "%s:%s\n", __func__, sdev->bustgtlun); in sbp_doorbell()
1276 if ((sdev->flags & ORB_DOORBELL_ACTIVE) != 0) { in sbp_doorbell()
1277 sdev->flags |= ORB_DOORBELL_NEED; in sbp_doorbell()
1280 sdev->flags |= ORB_DOORBELL_ACTIVE; in sbp_doorbell()
1284 xfer->hand = sbp_doorbell_callback; in sbp_doorbell()
1285 fp = &xfer->send.hdr; in sbp_doorbell()
1286 fp->mode.wreqq.data = htonl(0xf); in sbp_doorbell()
1287 fw_asyreq(xfer->fc, -1, xfer); in sbp_doorbell()
1298 SBP_LOCK_ASSERT(sdev->target->sbp); in sbp_write_cmd()
1300 target = sdev->target; in sbp_write_cmd()
1301 xfer = STAILQ_FIRST(&target->xferlist); in sbp_write_cmd()
1303 if (target->n_xfer > 5 /* XXX */) { in sbp_write_cmd()
1312 target->n_xfer++; in sbp_write_cmd()
1314 printf("sbp: alloc %d xfer\n", target->n_xfer); in sbp_write_cmd()
1317 STAILQ_REMOVE_HEAD(&target->xferlist, link); in sbp_write_cmd()
1321 xfer->recv.pay_len = 0; in sbp_write_cmd()
1322 xfer->send.spd = min(sdev->target->fwdev->speed, max_speed); in sbp_write_cmd()
1323 xfer->fc = sdev->target->sbp->fd.fc; in sbp_write_cmd()
1327 xfer->send.pay_len = 8; in sbp_write_cmd()
1329 xfer->send.pay_len = 0; in sbp_write_cmd()
1331 xfer->sc = (caddr_t)sdev; in sbp_write_cmd()
1332 fp = &xfer->send.hdr; in sbp_write_cmd()
1333 fp->mode.wreqq.dest_hi = sdev->login->cmd_hi; in sbp_write_cmd()
1334 fp->mode.wreqq.dest_lo = sdev->login->cmd_lo + offset; in sbp_write_cmd()
1335 fp->mode.wreqq.tlrt = 0; in sbp_write_cmd()
1336 fp->mode.wreqq.tcode = tcode; in sbp_write_cmd()
1337 fp->mode.wreqq.pri = 0; in sbp_write_cmd()
1338 fp->mode.wreqq.dst = FWLOCALBUS | sdev->target->fwdev->dst; in sbp_write_cmd()
1352 target = sdev->target; in sbp_mgm_orb()
1353 nid = target->sbp->fd.fc->nodeid | FWLOCALBUS; in sbp_mgm_orb()
1355 SBP_LOCK_ASSERT(target->sbp); in sbp_mgm_orb()
1357 ocb = STAILQ_FIRST(&target->mgm_ocb_queue); in sbp_mgm_orb()
1358 if (target->mgm_ocb_cur != NULL || ocb == NULL) { in sbp_mgm_orb()
1361 STAILQ_REMOVE_HEAD(&target->mgm_ocb_queue, ocb); in sbp_mgm_orb()
1368 ocb->flags = OCB_ACT_MGM; in sbp_mgm_orb()
1369 ocb->sdev = sdev; in sbp_mgm_orb()
1371 bzero((void *)ocb->orb, sizeof(ocb->orb)); in sbp_mgm_orb()
1372 ocb->orb[6] = htonl((nid << 16) | SBP_BIND_HI); in sbp_mgm_orb()
1373 ocb->orb[7] = htonl(SBP_DEV2ADDR(target->target_id, sdev->lun_id)); in sbp_mgm_orb()
1376 device_printf(sdev->target->sbp->fd.dev, in sbp_mgm_orb()
1378 __func__,sdev->bustgtlun, in sbp_mgm_orb()
1383 ocb->orb[0] = ocb->orb[1] = 0; /* password */ in sbp_mgm_orb()
1384 ocb->orb[2] = htonl(nid << 16); in sbp_mgm_orb()
1385 ocb->orb[3] = htonl(sdev->dma.bus_addr); in sbp_mgm_orb()
1386 ocb->orb[4] = htonl(ORB_NOTIFY | sdev->lun_id); in sbp_mgm_orb()
1388 ocb->orb[4] |= htonl(ORB_EXV); in sbp_mgm_orb()
1389 ocb->orb[5] = htonl(SBP_LOGIN_SIZE); in sbp_mgm_orb()
1390 fwdma_sync(&sdev->dma, BUS_DMASYNC_PREREAD); in sbp_mgm_orb()
1393 ocb->orb[0] = htonl((0 << 16) | 0); in sbp_mgm_orb()
1394 ocb->orb[1] = htonl(aocb->bus_addr & 0xffffffff); in sbp_mgm_orb()
1401 ocb->orb[4] = htonl(ORB_NOTIFY | func | sdev->login->id); in sbp_mgm_orb()
1405 if (target->mgm_ocb_cur != NULL) { in sbp_mgm_orb()
1407 STAILQ_INSERT_TAIL(&sdev->target->mgm_ocb_queue, ocb, ocb); in sbp_mgm_orb()
1411 target->mgm_ocb_cur = ocb; in sbp_mgm_orb()
1413 callout_reset(&target->mgm_ocb_timeout, 5 * hz, in sbp_mgm_orb()
1419 xfer->hand = sbp_mgm_callback; in sbp_mgm_orb()
1421 fp = &xfer->send.hdr; in sbp_mgm_orb()
1422 fp->mode.wreqb.dest_hi = sdev->target->mgm_hi; in sbp_mgm_orb()
1423 fp->mode.wreqb.dest_lo = sdev->target->mgm_lo; in sbp_mgm_orb()
1424 fp->mode.wreqb.len = 8; in sbp_mgm_orb()
1425 fp->mode.wreqb.extcode = 0; in sbp_mgm_orb()
1426 xfer->send.payload[0] = htonl(nid << 16); in sbp_mgm_orb()
1427 xfer->send.payload[1] = htonl(ocb->bus_addr & 0xffffffff); in sbp_mgm_orb()
1429 fw_asyreq(xfer->fc, -1, xfer); in sbp_mgm_orb()
1437 csio = &ocb->ccb->csio; in sbp_print_scsi_cmd()
1441 "%db cmd/%db data/%db sense\n", in sbp_print_scsi_cmd()
1442 device_get_nameunit(ocb->sdev->target->sbp->fd.dev), in sbp_print_scsi_cmd()
1443 ocb->ccb->ccb_h.target_id, in sbp_print_scsi_cmd()
1444 (uintmax_t)ocb->ccb->ccb_h.target_lun, in sbp_print_scsi_cmd()
1445 csio->cdb_io.cdb_bytes[0], in sbp_print_scsi_cmd()
1446 csio->cdb_io.cdb_bytes[1], in sbp_print_scsi_cmd()
1447 csio->cdb_io.cdb_bytes[2], in sbp_print_scsi_cmd()
1448 csio->cdb_io.cdb_bytes[3], in sbp_print_scsi_cmd()
1449 csio->cdb_io.cdb_bytes[4], in sbp_print_scsi_cmd()
1450 csio->cdb_io.cdb_bytes[5], in sbp_print_scsi_cmd()
1451 csio->cdb_io.cdb_bytes[6], in sbp_print_scsi_cmd()
1452 csio->cdb_io.cdb_bytes[7], in sbp_print_scsi_cmd()
1453 csio->cdb_io.cdb_bytes[8], in sbp_print_scsi_cmd()
1454 csio->cdb_io.cdb_bytes[9], in sbp_print_scsi_cmd()
1455 ocb->ccb->ccb_h.flags & CAM_DIR_MASK, in sbp_print_scsi_cmd()
1456 csio->cdb_len, csio->dxfer_len, in sbp_print_scsi_cmd()
1457 csio->sense_len); in sbp_print_scsi_cmd()
1464 struct scsi_sense_data_fixed *sense; in sbp_scsi_status() local
1466 sbp_cmd_status = (struct sbp_cmd_status *)sbp_status->data; in sbp_scsi_status()
1467 sense = (struct scsi_sense_data_fixed *)&ocb->ccb->csio.sense_data; in sbp_scsi_status()
1473 ocb->sdev->bustgtlun, in sbp_scsi_status()
1474 sbp_cmd_status->status, in sbp_scsi_status()
1475 sbp_cmd_status->sfmt, in sbp_scsi_status()
1476 sbp_cmd_status->valid, in sbp_scsi_status()
1477 sbp_cmd_status->s_key, in sbp_scsi_status()
1478 sbp_cmd_status->s_code, in sbp_scsi_status()
1479 sbp_cmd_status->s_qlfr, in sbp_scsi_status()
1480 sbp_status->len); in sbp_scsi_status()
1483 switch (sbp_cmd_status->status) { in sbp_scsi_status()
1487 if (sbp_cmd_status->sfmt == SBP_SFMT_CURR) { in sbp_scsi_status()
1488 sense->error_code = SSD_CURRENT_ERROR; in sbp_scsi_status()
1490 sense->error_code = SSD_DEFERRED_ERROR; in sbp_scsi_status()
1492 if (sbp_cmd_status->valid) in sbp_scsi_status()
1493 sense->error_code |= SSD_ERRCODE_VALID; in sbp_scsi_status()
1494 sense->flags = sbp_cmd_status->s_key; in sbp_scsi_status()
1495 if (sbp_cmd_status->mark) in sbp_scsi_status()
1496 sense->flags |= SSD_FILEMARK; in sbp_scsi_status()
1497 if (sbp_cmd_status->eom) in sbp_scsi_status()
1498 sense->flags |= SSD_EOM; in sbp_scsi_status()
1499 if (sbp_cmd_status->ill_len) in sbp_scsi_status()
1500 sense->flags |= SSD_ILI; in sbp_scsi_status()
1502 bcopy(&sbp_cmd_status->info, &sense->info[0], 4); in sbp_scsi_status()
1504 if (sbp_status->len <= 1) in sbp_scsi_status()
1506 sense->extra_len = 0; in sbp_scsi_status()
1507 else if (sbp_status->len <= 4) in sbp_scsi_status()
1509 sense->extra_len = 6; in sbp_scsi_status()
1512 sense->extra_len = 10; in sbp_scsi_status()
1514 bcopy(&sbp_cmd_status->cdb, &sense->cmd_spec_info[0], 4); in sbp_scsi_status()
1516 sense->add_sense_code = sbp_cmd_status->s_code; in sbp_scsi_status()
1517 sense->add_sense_code_qual = sbp_cmd_status->s_qlfr; in sbp_scsi_status()
1518 sense->fru = sbp_cmd_status->fru; in sbp_scsi_status()
1520 bcopy(&sbp_cmd_status->s_keydep[0], in sbp_scsi_status()
1521 &sense->sense_key_spec[0], 3); in sbp_scsi_status()
1523 ocb->ccb->csio.scsi_status = sbp_cmd_status->status; in sbp_scsi_status()
1524 ocb->ccb->ccb_h.status = CAM_SCSI_STATUS_ERROR in sbp_scsi_status()
1529 tmp = sense; in sbp_scsi_status()
1531 printf("sense %02x%02x %02x%02x %02x%02x %02x%02x\n", in sbp_scsi_status()
1540 device_printf(ocb->sdev->target->sbp->fd.dev, in sbp_scsi_status()
1542 __func__, ocb->sdev->bustgtlun, in sbp_scsi_status()
1543 sbp_cmd_status->status); in sbp_scsi_status()
1554 ccb = ocb->ccb; in sbp_fix_inq_data()
1555 sdev = ocb->sdev; in sbp_fix_inq_data()
1557 if (ccb->csio.cdb_io.cdb_bytes[1] & SI_EVPD) in sbp_fix_inq_data()
1560 device_printf(sdev->target->sbp->fd.dev, in sbp_fix_inq_data()
1561 "%s:%s\n", __func__, sdev->bustgtlun); in sbp_fix_inq_data()
1563 inq = (struct scsi_inquiry_data *) ccb->csio.data_ptr; in sbp_fix_inq_data()
1572 inq->device |= T_RBC; /* T_DIRECT == 0 */ in sbp_fix_inq_data()
1581 bcopy(sdev->vendor, inq->vendor, sizeof(inq->vendor)); in sbp_fix_inq_data()
1582 bcopy(sdev->product, inq->product, sizeof(inq->product)); in sbp_fix_inq_data()
1583 bcopy(sdev->revision + 2, inq->revision, sizeof(inq->revision)); in sbp_fix_inq_data()
1589 * XXX CAM also checks SCP_QUEUE_DQUE flag in the control mode page. in sbp_fix_inq_data()
1592 inq->flags |= SID_CmdQue; in sbp_fix_inq_data()
1594 inq->flags &= ~SID_CmdQue; in sbp_fix_inq_data()
1615 ld = xfer->recv.buf; in sbp_recv1()
1617 …xfer->resp, xfer->recv.len, xfer->recv.off, ntohl(ld[0]), ntohl(ld[1]), ntohl(ld[2]), ntohl(ld[3])… in sbp_recv1()
1621 sbp = (struct sbp_softc *)xfer->sc; in sbp_recv1()
1623 if (xfer->resp != 0) { in sbp_recv1()
1624 printf("sbp_recv: xfer->resp = %d\n", xfer->resp); in sbp_recv1()
1627 if (xfer->recv.payload == NULL) { in sbp_recv1()
1628 printf("sbp_recv: xfer->recv.payload == NULL\n"); in sbp_recv1()
1631 rfp = &xfer->recv.hdr; in sbp_recv1()
1632 if (rfp->mode.wreqb.tcode != FWTCODE_WREQB) { in sbp_recv1()
1633 printf("sbp_recv: tcode = %d\n", rfp->mode.wreqb.tcode); in sbp_recv1()
1636 sbp_status = (struct sbp_status *)xfer->recv.payload; in sbp_recv1()
1637 addr = rfp->mode.wreqb.dest_lo; in sbp_recv1()
1643 device_printf(sbp->fd.dev, in sbp_recv1()
1647 target = &sbp->targets[t]; in sbp_recv1()
1649 if (l >= target->num_lun || target->luns[l] == NULL) { in sbp_recv1()
1650 device_printf(sbp->fd.dev, in sbp_recv1()
1654 sdev = target->luns[l]; in sbp_recv1()
1657 switch (sbp_status->src) { in sbp_recv1()
1661 ocb = target->mgm_ocb_cur; in sbp_recv1()
1664 callout_stop(&target->mgm_ocb_timeout); in sbp_recv1()
1665 target->mgm_ocb_cur = NULL; in sbp_recv1()
1671 device_printf(sdev->target->sbp->fd.dev, in sbp_recv1()
1673 __func__,sdev->bustgtlun, in sbp_recv1()
1674 ntohl(sbp_status->orb_lo)); in sbp_recv1()
1679 device_printf(sdev->target->sbp->fd.dev, in sbp_recv1()
1681 __func__, sdev->bustgtlun); in sbp_recv1()
1684 device_printf(sdev->target->sbp->fd.dev, in sbp_recv1()
1685 "%s:%s unknown sbp_status->src\n", in sbp_recv1()
1686 __func__, sdev->bustgtlun); in sbp_recv1()
1689 status_valid0 = (sbp_status->src < 2 in sbp_recv1()
1690 && sbp_status->resp == ORB_RES_CMPL in sbp_recv1()
1691 && sbp_status->dead == 0); in sbp_recv1()
1692 status_valid = (status_valid0 && sbp_status->status == 0); in sbp_recv1()
1697 device_printf(sdev->target->sbp->fd.dev, in sbp_recv1()
1700 __func__, sdev->bustgtlun, in sbp_recv1()
1701 sbp_status->src, sbp_status->resp, sbp_status->dead, in sbp_recv1()
1702 sbp_status->len, sbp_status->status, in sbp_recv1()
1703 ntohs(sbp_status->orb_hi), ntohl(sbp_status->orb_lo)); in sbp_recv1()
1705 device_printf(sdev->target->sbp->fd.dev, in sbp_recv1()
1706 "%s\n", sdev->bustgtlun); in sbp_recv1()
1707 status = sbp_status->status; in sbp_recv1()
1708 switch (sbp_status->resp) { in sbp_recv1()
1727 printf("unknown respose code %d\n", sbp_status->resp); in sbp_recv1()
1732 if (sbp_status->dead) { in sbp_recv1()
1733 if (sdev->path) { in sbp_recv1()
1734 xpt_freeze_devq(sdev->path, 1); in sbp_recv1()
1735 sdev->freeze++; in sbp_recv1()
1743 switch (ntohl(ocb->orb[4]) & ORB_FMT_MSK) { in sbp_recv1()
1749 switch (ocb->flags) { in sbp_recv1()
1751 orb_fun = ntohl(ocb->orb[4]) & ORB_FUN_MSK; in sbp_recv1()
1755 fwdma_sync(&sdev->dma, BUS_DMASYNC_POSTREAD); in sbp_recv1()
1756 login_res = sdev->login; in sbp_recv1()
1757 login_res->len = ntohs(login_res->len); in sbp_recv1()
1758 login_res->id = ntohs(login_res->id); in sbp_recv1()
1759 login_res->cmd_hi = ntohs(login_res->cmd_hi); in sbp_recv1()
1760 login_res->cmd_lo = ntohl(login_res->cmd_lo); in sbp_recv1()
1763 device_printf(sdev->target->sbp->fd.dev, in sbp_recv1()
1765 __func__, sdev->bustgtlun, in sbp_recv1()
1766 login_res->len, login_res->id, in sbp_recv1()
1767 login_res->cmd_hi, login_res->cmd_lo, in sbp_recv1()
1768 ntohs(login_res->recon_hold)); in sbp_recv1()
1773 device_printf(sdev->target->sbp->fd.dev, in sbp_recv1()
1775 __func__, sdev->bustgtlun); in sbp_recv1()
1776 sdev->status = SBP_DEV_RESET; in sbp_recv1()
1780 login_res = sdev->login; in sbp_recv1()
1783 device_printf(sdev->target->sbp->fd.dev, in sbp_recv1()
1785 __func__, sdev->bustgtlun, in sbp_recv1()
1786 login_res->len, login_res->id, in sbp_recv1()
1787 login_res->cmd_hi, login_res->cmd_lo); in sbp_recv1()
1789 if (sdev->status == SBP_DEV_ATTACHED) in sbp_recv1()
1796 device_printf(sdev->target->sbp->fd.dev, in sbp_recv1()
1798 __func__, sdev->bustgtlun); in sbp_recv1()
1804 sdev->status = SBP_DEV_RESET; in sbp_recv1()
1815 device_printf(sdev->target->sbp->fd.dev, in sbp_recv1()
1817 __func__, sdev->bustgtlun, orb_fun); in sbp_recv1()
1823 sdev->timeout = 0; in sbp_recv1()
1824 if (ocb->ccb != NULL) { in sbp_recv1()
1827 ccb = ocb->ccb; in sbp_recv1()
1828 if (sbp_status->len > 1) { in sbp_recv1()
1831 if (sbp_status->resp != ORB_RES_CMPL) { in sbp_recv1()
1832 ccb->ccb_h.status = CAM_REQ_CMP_ERR; in sbp_recv1()
1834 ccb->ccb_h.status = CAM_REQ_CMP; in sbp_recv1()
1838 if (ccb->csio.cdb_io.cdb_bytes[0] == INQUIRY) in sbp_recv1()
1855 xfer->recv.pay_len = SBP_RECV_LEN; in sbp_recv1()
1864 xfer->send.off = 0; in sbp_recv1()
1865 sfp = (struct fw_pkt *)xfer->send.buf; in sbp_recv1()
1866 sfp->mode.wres.dst = rfp->mode.wreqb.src; in sbp_recv1()
1867 xfer->dst = sfp->mode.wres.dst; in sbp_recv1()
1868 xfer->spd = min(sdev->target->fwdev->speed, max_speed); in sbp_recv1()
1869 xfer->hand = sbp_loginres_callback; in sbp_recv1()
1871 sfp->mode.wres.tlrt = rfp->mode.wreqb.tlrt; in sbp_recv1()
1872 sfp->mode.wres.tcode = FWTCODE_WRES; in sbp_recv1()
1873 sfp->mode.wres.rtcode = 0; in sbp_recv1()
1874 sfp->mode.wres.pri = 0; in sbp_recv1()
1876 fw_asyreq(xfer->fc, -1, xfer); in sbp_recv1()
1879 STAILQ_INSERT_TAIL(&sbp->fwb.xferlist, xfer, link); in sbp_recv1()
1888 sbp = (struct sbp_softc *)xfer->sc; in sbp_recv()
1919 sbp->fd.dev = dev; in sbp_attach()
1920 sbp->fd.fc = fc = device_get_ivars(dev); in sbp_attach()
1921 mtx_init(&sbp->mtx, "sbp", NULL, MTX_DEF); in sbp_attach()
1924 max_speed = fc->speed; in sbp_attach()
1926 error = bus_dma_tag_create(/*parent*/fc->dmat, in sbp_attach()
1937 /*lockarg*/&sbp->mtx, in sbp_attach()
1938 &sbp->dmat); in sbp_attach()
1941 "- error %d\n", error); in sbp_attach()
1950 sbp->targets[i].fwdev = NULL; in sbp_attach()
1951 sbp->targets[i].luns = NULL; in sbp_attach()
1952 sbp->targets[i].sbp = sbp; in sbp_attach()
1955 sbp->sim = cam_sim_alloc(sbp_action, sbp_poll, "sbp", sbp, in sbp_attach()
1957 &sbp->mtx, in sbp_attach()
1959 /*tagged*/ SBP_QUEUE_LEN - 1, in sbp_attach()
1962 if (sbp->sim == NULL) { in sbp_attach()
1968 if (xpt_bus_register(sbp->sim, dev, /*bus*/0) != CAM_SUCCESS) in sbp_attach()
1971 if (xpt_create_path(&sbp->path, NULL, cam_sim_path(sbp->sim), in sbp_attach()
1973 xpt_bus_deregister(cam_sim_path(sbp->sim)); in sbp_attach()
1979 sbp->fwb.start = ((u_int64_t)SBP_BIND_HI << 32) | SBP_DEV2ADDR(0, 0); in sbp_attach()
1980 sbp->fwb.end = sbp->fwb.start + 0xffff; in sbp_attach()
1981 /* pre-allocate xfer */ in sbp_attach()
1982 STAILQ_INIT(&sbp->fwb.xferlist); in sbp_attach()
1983 fw_xferlist_add(&sbp->fwb.xferlist, M_SBP, in sbp_attach()
1987 fw_bindadd(fc, &sbp->fwb); in sbp_attach()
1989 sbp->fd.post_busreset = sbp_post_busreset; in sbp_attach()
1990 sbp->fd.post_explore = sbp_post_explore; in sbp_attach()
1992 if (fc->status != -1) { in sbp_attach()
1997 xpt_async(AC_BUS_RESET, sbp->path, /*arg*/ NULL); in sbp_attach()
2003 cam_sim_free(sbp->sim, /*free_devq*/TRUE); in sbp_attach()
2019 target = &sbp->targets[i]; in sbp_logout_all()
2020 if (target->luns == NULL) in sbp_logout_all()
2022 for (j = 0; j < target->num_lun; j++) { in sbp_logout_all()
2023 sdev = target->luns[j]; in sbp_logout_all()
2026 callout_stop(&sdev->login_callout); in sbp_logout_all()
2027 if (sdev->status >= SBP_DEV_TOATTACH && in sbp_logout_all()
2028 sdev->status <= SBP_DEV_ATTACHED) in sbp_logout_all()
2055 sbp = sdev->target->sbp; in sbp_free_sdev()
2057 callout_drain(&sdev->login_callout); in sbp_free_sdev()
2059 callout_drain(&sdev->ocb[i].timer); in sbp_free_sdev()
2060 bus_dmamap_destroy(sbp->dmat, sdev->ocb[i].dmamap); in sbp_free_sdev()
2062 fwdma_free(sbp->fd.fc, &sdev->dma); in sbp_free_sdev()
2074 if (target->luns == NULL) in sbp_free_target()
2076 sbp = target->sbp; in sbp_free_target()
2079 callout_drain(&target->mgm_ocb_timeout); in sbp_free_target()
2080 callout_drain(&target->scan_callout); in sbp_free_target()
2082 for (i = 0; i < target->num_lun; i++) in sbp_free_target()
2083 sbp_free_sdev(target->luns[i]); in sbp_free_target()
2085 STAILQ_FOREACH_SAFE(xfer, &target->xferlist, link, next) { in sbp_free_target()
2088 STAILQ_INIT(&target->xferlist); in sbp_free_target()
2089 free(target->luns, M_SBP); in sbp_free_target()
2090 target->num_lun = 0; in sbp_free_target()
2091 target->luns = NULL; in sbp_free_target()
2092 target->fwdev = NULL; in sbp_free_target()
2099 struct firewire_comm *fc = sbp->fd.fc; in sbp_detach()
2108 sbp_cam_detach_target(&sbp->targets[i]); in sbp_detach()
2110 xpt_async(AC_LOST_DEVICE, sbp->path, NULL); in sbp_detach()
2111 xpt_free_path(sbp->path); in sbp_detach()
2112 xpt_bus_deregister(cam_sim_path(sbp->sim)); in sbp_detach()
2113 cam_sim_free(sbp->sim, /*free_devq*/ TRUE); in sbp_detach()
2123 sbp_free_target(&sbp->targets[i]); in sbp_detach()
2126 fw_bindremove(fc, &sbp->fwb); in sbp_detach()
2127 fw_xferlist_remove(&sbp->fwb.xferlist); in sbp_detach()
2129 bus_dma_tag_destroy(sbp->dmat); in sbp_detach()
2130 mtx_destroy(&sbp->mtx); in sbp_detach()
2140 if (sdev->status == SBP_DEV_DEAD) in sbp_cam_detach_sdev()
2142 if (sdev->status == SBP_DEV_RESET) in sbp_cam_detach_sdev()
2144 SBP_LOCK_ASSERT(sdev->target->sbp); in sbp_cam_detach_sdev()
2146 if (sdev->path) { in sbp_cam_detach_sdev()
2147 xpt_release_devq(sdev->path, in sbp_cam_detach_sdev()
2148 sdev->freeze, TRUE); in sbp_cam_detach_sdev()
2149 sdev->freeze = 0; in sbp_cam_detach_sdev()
2150 xpt_async(AC_LOST_DEVICE, sdev->path, NULL); in sbp_cam_detach_sdev()
2151 xpt_free_path(sdev->path); in sbp_cam_detach_sdev()
2152 sdev->path = NULL; in sbp_cam_detach_sdev()
2161 SBP_LOCK_ASSERT(target->sbp); in sbp_cam_detach_target()
2162 if (target->luns != NULL) { in sbp_cam_detach_target()
2164 printf("sbp_detach_target %d\n", target->target_id); in sbp_cam_detach_target()
2166 callout_stop(&target->scan_callout); in sbp_cam_detach_target()
2167 for (i = 0; i < target->num_lun; i++) in sbp_cam_detach_target()
2168 sbp_cam_detach_sdev(target->luns[i]); in sbp_cam_detach_target()
2176 struct sbp_target *target = sdev->target; in sbp_target_reset()
2179 SBP_LOCK_ASSERT(target->sbp); in sbp_target_reset()
2180 for (i = 0; i < target->num_lun; i++) { in sbp_target_reset()
2181 tsdev = target->luns[i]; in sbp_target_reset()
2184 if (tsdev->status == SBP_DEV_DEAD) in sbp_target_reset()
2186 if (tsdev->status == SBP_DEV_RESET) in sbp_target_reset()
2188 xpt_freeze_devq(tsdev->path, 1); in sbp_target_reset()
2189 tsdev->freeze++; in sbp_target_reset()
2192 tsdev->status = SBP_DEV_LOGIN; in sbp_target_reset()
2211 struct sbp_dev *sdev = ocb->sdev; in sbp_mgm_timeout()
2212 struct sbp_target *target = sdev->target; in sbp_mgm_timeout()
2214 SBP_LOCK_ASSERT(target->sbp); in sbp_mgm_timeout()
2215 device_printf(sdev->target->sbp->fd.dev, in sbp_mgm_timeout()
2217 __func__, sdev->bustgtlun, (uint32_t)ocb->bus_addr); in sbp_mgm_timeout()
2218 target->mgm_ocb_cur = NULL; in sbp_mgm_timeout()
2225 device_printf(sdev->target->sbp->fd.dev, in sbp_mgm_timeout()
2227 __func__, sdev->bustgtlun); in sbp_mgm_timeout()
2235 struct sbp_dev *sdev = ocb->sdev; in sbp_timeout()
2237 device_printf(sdev->target->sbp->fd.dev, in sbp_timeout()
2239 __func__, sdev->bustgtlun, (uint32_t)ocb->bus_addr); in sbp_timeout()
2241 SBP_LOCK_ASSERT(sdev->target->sbp); in sbp_timeout()
2242 sdev->timeout++; in sbp_timeout()
2243 switch (sdev->timeout) { in sbp_timeout()
2246 xpt_freeze_devq(sdev->path, 1); in sbp_timeout()
2247 sdev->freeze++; in sbp_timeout()
2253 sbp_target_reset(sdev, sdev->timeout - 1); in sbp_timeout()
2259 if (target->luns != NULL) in sbp_timeout()
2260 free(target->luns, M_SBP); in sbp_timeout()
2261 target->num_lun = 0; in sbp_timeout()
2262 target->luns = NULL; in sbp_timeout()
2263 target->fwdev = NULL; in sbp_timeout()
2278 /* target:lun -> sdev mapping */ in sbp_action()
2280 && ccb->ccb_h.target_id != CAM_TARGET_WILDCARD in sbp_action()
2281 && ccb->ccb_h.target_id < SBP_NUM_TARGETS) { in sbp_action()
2282 target = &sbp->targets[ccb->ccb_h.target_id]; in sbp_action()
2283 if (target->fwdev != NULL in sbp_action()
2284 && ccb->ccb_h.target_lun != CAM_LUN_WILDCARD in sbp_action()
2285 && ccb->ccb_h.target_lun < target->num_lun) { in sbp_action()
2286 sdev = target->luns[ccb->ccb_h.target_lun]; in sbp_action()
2287 if (sdev != NULL && sdev->status != SBP_DEV_ATTACHED && in sbp_action()
2288 sdev->status != SBP_DEV_PROBE) in sbp_action()
2296 ccb->ccb_h.target_id, (uintmax_t)ccb->ccb_h.target_lun); in sbp_action()
2299 switch (ccb->ccb_h.func_code) { in sbp_action()
2309 device_get_nameunit(sbp->fd.dev), in sbp_action()
2310 ccb->ccb_h.target_id, in sbp_action()
2311 (uintmax_t)ccb->ccb_h.target_lun, in sbp_action()
2312 ccb->ccb_h.func_code); in sbp_action()
2315 ccb->ccb_h.status = CAM_DEV_NOT_THERE; in sbp_action()
2327 ccb->ccb_h.target_id != CAM_TARGET_WILDCARD) { in sbp_action()
2331 device_get_nameunit(sbp->fd.dev), in sbp_action()
2332 ccb->ccb_h.target_id, in sbp_action()
2333 (uintmax_t)ccb->ccb_h.target_lun, in sbp_action()
2334 ccb->ccb_h.func_code); in sbp_action()
2336 ccb->ccb_h.status = CAM_DEV_NOT_THERE; in sbp_action()
2346 switch (ccb->ccb_h.func_code) { in sbp_action()
2354 csio = &ccb->csio; in sbp_action()
2355 mtx_assert(sim->mtx, MA_OWNED); in sbp_action()
2361 "%db cmd/%db data/%db sense\n", in sbp_action()
2362 device_get_nameunit(sbp->fd.dev), in sbp_action()
2363 ccb->ccb_h.target_id, (uintmax_t)ccb->ccb_h.target_lun, in sbp_action()
2364 csio->cdb_io.cdb_bytes[0], in sbp_action()
2365 csio->cdb_io.cdb_bytes[1], in sbp_action()
2366 csio->cdb_io.cdb_bytes[2], in sbp_action()
2367 csio->cdb_io.cdb_bytes[3], in sbp_action()
2368 csio->cdb_io.cdb_bytes[4], in sbp_action()
2369 csio->cdb_io.cdb_bytes[5], in sbp_action()
2370 csio->cdb_io.cdb_bytes[6], in sbp_action()
2371 csio->cdb_io.cdb_bytes[7], in sbp_action()
2372 csio->cdb_io.cdb_bytes[8], in sbp_action()
2373 csio->cdb_io.cdb_bytes[9], in sbp_action()
2374 ccb->ccb_h.flags & CAM_DIR_MASK, in sbp_action()
2375 csio->cdb_len, csio->dxfer_len, in sbp_action()
2376 csio->sense_len); in sbp_action()
2379 ccb->ccb_h.status = CAM_DEV_NOT_THERE; in sbp_action()
2383 if (csio->cdb_len > sizeof(ocb->orb) - 5 * sizeof(uint32_t)) { in sbp_action()
2384 ccb->ccb_h.status = CAM_REQ_INVALID; in sbp_action()
2390 if (sdev->status == SBP_DEV_PROBE) { in sbp_action()
2392 name = xpt_path_periph(ccb->ccb_h.path)->periph_name; in sbp_action()
2395 ccb->ccb_h.status = CAM_REQUEUE_REQ; in sbp_action()
2402 ccb->ccb_h.status = CAM_RESRC_UNAVAIL; in sbp_action()
2403 if (sdev->freeze == 0) { in sbp_action()
2404 xpt_freeze_devq(sdev->path, 1); in sbp_action()
2405 sdev->freeze++; in sbp_action()
2411 ocb->flags = OCB_ACT_CMD; in sbp_action()
2412 ocb->sdev = sdev; in sbp_action()
2413 ocb->ccb = ccb; in sbp_action()
2414 ccb->ccb_h.ccb_sdev_ptr = sdev; in sbp_action()
2415 ocb->orb[0] = htonl(1U << 31); in sbp_action()
2416 ocb->orb[1] = 0; in sbp_action()
2417 ocb->orb[2] = htonl(((sbp->fd.fc->nodeid | FWLOCALBUS) << 16)); in sbp_action()
2418 ocb->orb[3] = htonl(ocb->bus_addr + IND_PTR_OFFSET); in sbp_action()
2419 speed = min(target->fwdev->speed, max_speed); in sbp_action()
2420 ocb->orb[4] = htonl(ORB_NOTIFY | ORB_CMD_SPD(speed) in sbp_action()
2422 if ((ccb->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_IN) { in sbp_action()
2423 ocb->orb[4] |= htonl(ORB_CMD_IN); in sbp_action()
2426 if (csio->ccb_h.flags & CAM_CDB_POINTER) in sbp_action()
2427 cdb = (void *)csio->cdb_io.cdb_ptr; in sbp_action()
2429 cdb = (void *)&csio->cdb_io.cdb_bytes; in sbp_action()
2430 bcopy(cdb, (void *)&ocb->orb[5], csio->cdb_len); in sbp_action()
2432 printf("ORB %08x %08x %08x %08x\n", ntohl(ocb->orb[0]), ntohl(ocb->orb[1]), ntohl(ocb->orb[2]), nto… in sbp_action()
2433 printf("ORB %08x %08x %08x %08x\n", ntohl(ocb->orb[4]), ntohl(ocb->orb[5]), ntohl(ocb->orb[6]), nto… in sbp_action()
2435 if (ccb->csio.dxfer_len > 0) { in sbp_action()
2438 error = bus_dmamap_load_ccb(/*dma tag*/sbp->dmat, in sbp_action()
2439 /*dma map*/ocb->dmamap, in sbp_action()
2454 ccg = &ccb->ccg; in sbp_action()
2455 if (ccg->block_size == 0) { in sbp_action()
2457 ccb->ccb_h.status = CAM_REQ_INVALID; in sbp_action()
2464 device_get_nameunit(sbp->fd.dev), in sbp_action()
2465 cam_sim_path(sbp->sim), in sbp_action()
2466 ccb->ccb_h.target_id, (uintmax_t)ccb->ccb_h.target_lun, in sbp_action()
2467 (uintmax_t)ccg->volume_size); in sbp_action()
2479 device_get_nameunit(sbp->fd.dev), cam_sim_path(sbp->sim)); in sbp_action()
2482 ccb->ccb_h.status = CAM_REQ_INVALID; in sbp_action()
2488 struct ccb_pathinq *cpi = &ccb->cpi; in sbp_action()
2492 device_get_nameunit(sbp->fd.dev), in sbp_action()
2493 ccb->ccb_h.target_id, (uintmax_t)ccb->ccb_h.target_lun); in sbp_action()
2495 cpi->version_num = 1; /* XXX??? */ in sbp_action()
2496 cpi->hba_inquiry = PI_TAG_ABLE; in sbp_action()
2497 cpi->target_sprt = 0; in sbp_action()
2498 cpi->hba_misc = PIM_NOBUSRESET | PIM_NO_6_BYTE; in sbp_action()
2499 cpi->hba_eng_cnt = 0; in sbp_action()
2500 cpi->max_target = SBP_NUM_TARGETS - 1; in sbp_action()
2501 cpi->max_lun = SBP_NUM_LUNS - 1; in sbp_action()
2502 cpi->initiator_id = SBP_INITIATOR; in sbp_action()
2503 cpi->bus_id = sim->bus_id; in sbp_action()
2504 cpi->base_transfer_speed = 400 * 1000 / 8; in sbp_action()
2505 strlcpy(cpi->sim_vid, "FreeBSD", SIM_IDLEN); in sbp_action()
2506 strlcpy(cpi->hba_vid, "SBP", HBA_IDLEN); in sbp_action()
2507 strlcpy(cpi->dev_name, sim->sim_name, DEV_IDLEN); in sbp_action()
2508 cpi->unit_number = sim->unit_number; in sbp_action()
2509 cpi->transport = XPORT_SPI; /* XX should have a FireWire */ in sbp_action()
2510 cpi->transport_version = 2; in sbp_action()
2511 cpi->protocol = PROTO_SCSI; in sbp_action()
2512 cpi->protocol_version = SCSI_REV_2; in sbp_action()
2514 cpi->ccb_h.status = CAM_REQ_CMP; in sbp_action()
2520 struct ccb_trans_settings *cts = &ccb->cts; in sbp_action()
2522 &cts->proto_specific.scsi; in sbp_action()
2524 &cts->xport_specific.spi; in sbp_action()
2526 cts->protocol = PROTO_SCSI; in sbp_action()
2527 cts->protocol_version = SCSI_REV_2; in sbp_action()
2528 cts->transport = XPORT_SPI; /* should have a FireWire */ in sbp_action()
2529 cts->transport_version = 2; in sbp_action()
2530 spi->valid = CTS_SPI_VALID_DISC; in sbp_action()
2531 spi->flags = CTS_SPI_FLAGS_DISC_ENB; in sbp_action()
2532 scsi->valid = CTS_SCSI_VALID_TQ; in sbp_action()
2533 scsi->flags = CTS_SCSI_FLAGS_TAG_ENB; in sbp_action()
2536 device_get_nameunit(sbp->fd.dev), in sbp_action()
2537 ccb->ccb_h.target_id, (uintmax_t)ccb->ccb_h.target_lun); in sbp_action()
2539 cts->ccb_h.status = CAM_REQ_CMP; in sbp_action()
2544 ccb->ccb_h.status = CAM_UA_ABORT; in sbp_action()
2550 ccb->ccb_h.status = CAM_REQ_INVALID; in sbp_action()
2581 if (s->ds_len > SBP_SEG_MAX) in sbp_execute_ocb()
2583 ocb->orb[3] = htonl(s->ds_addr); in sbp_execute_ocb()
2584 ocb->orb[4] |= htonl(s->ds_len); in sbp_execute_ocb()
2591 if (s->ds_len < 16) in sbp_execute_ocb()
2594 "(seg=%d/%d)\n", (size_t)s->ds_len, i + 1, seg); in sbp_execute_ocb()
2596 if (s->ds_len > SBP_SEG_MAX) in sbp_execute_ocb()
2598 ocb->ind_ptr[i].hi = htonl(s->ds_len << 16); in sbp_execute_ocb()
2599 ocb->ind_ptr[i].lo = htonl(s->ds_addr); in sbp_execute_ocb()
2601 ocb->orb[4] |= htonl(ORB_CMD_PTBL | seg); in sbp_execute_ocb()
2605 bus_dmamap_sync(ocb->sdev->target->sbp->dmat, ocb->dmamap, in sbp_execute_ocb()
2606 (ntohl(ocb->orb[4]) & ORB_CMD_IN) ? in sbp_execute_ocb()
2608 prev = sbp_enqueue_ocb(ocb->sdev, ocb); in sbp_execute_ocb()
2609 fwdma_sync(&ocb->sdev->dma, BUS_DMASYNC_PREWRITE); in sbp_execute_ocb()
2612 if (ocb->sdev->last_ocb != NULL) in sbp_execute_ocb()
2613 sbp_doorbell(ocb->sdev); in sbp_execute_ocb()
2615 sbp_orb_pointer(ocb->sdev, ocb); in sbp_execute_ocb()
2618 if (prev == NULL || (ocb->sdev->flags & ORB_LINK_DEAD) != 0) { in sbp_execute_ocb()
2619 ocb->sdev->flags &= ~ORB_LINK_DEAD; in sbp_execute_ocb()
2620 sbp_orb_pointer(ocb->sdev, ocb); in sbp_execute_ocb()
2632 fc = sbp->fd.fc; in sbp_poll()
2634 fc->poll(fc, 0, -1); in sbp_poll()
2647 device_printf(sdev->target->sbp->fd.dev, in sbp_dequeue_ocb()
2649 __func__, sdev->bustgtlun, ntohl(sbp_status->orb_lo), sbp_status->src); in sbp_dequeue_ocb()
2651 SBP_LOCK_ASSERT(sdev->target->sbp); in sbp_dequeue_ocb()
2652 STAILQ_FOREACH_SAFE(ocb, &sdev->ocbs, ocb, next) { in sbp_dequeue_ocb()
2655 STAILQ_REMOVE(&sdev->ocbs, ocb, sbp_ocb, ocb); in sbp_dequeue_ocb()
2656 if (ocb->ccb != NULL) in sbp_dequeue_ocb()
2657 callout_stop(&ocb->timer); in sbp_dequeue_ocb()
2658 if (ntohl(ocb->orb[4]) & 0xffff) { in sbp_dequeue_ocb()
2659 bus_dmamap_sync(sdev->target->sbp->dmat, in sbp_dequeue_ocb()
2660 ocb->dmamap, in sbp_dequeue_ocb()
2661 (ntohl(ocb->orb[4]) & ORB_CMD_IN) ? in sbp_dequeue_ocb()
2664 bus_dmamap_unload(sdev->target->sbp->dmat, in sbp_dequeue_ocb()
2665 ocb->dmamap); in sbp_dequeue_ocb()
2668 if (sbp_status->src == SRC_NO_NEXT) { in sbp_dequeue_ocb()
2677 sdev->flags |= ORB_LINK_DEAD; in sbp_dequeue_ocb()
2685 if (sdev->last_ocb != NULL) { in sbp_dequeue_ocb()
2686 sbp_free_ocb(sdev, sdev->last_ocb); in sbp_dequeue_ocb()
2688 sdev->last_ocb = ocb; in sbp_dequeue_ocb()
2690 sbp_status->src == SRC_NO_NEXT) in sbp_dequeue_ocb()
2699 device_printf(sdev->target->sbp->fd.dev, in sbp_dequeue_ocb()
2701 __func__, sdev->bustgtlun, order); in sbp_dequeue_ocb()
2712 SBP_LOCK_ASSERT(sdev->target->sbp); in sbp_enqueue_ocb()
2714 device_printf(sdev->target->sbp->fd.dev, in sbp_enqueue_ocb()
2715 "%s:%s 0x%08jx\n", __func__, sdev->bustgtlun, (uintmax_t)ocb->bus_addr); in sbp_enqueue_ocb()
2717 prev2 = prev = STAILQ_LAST(&sdev->ocbs, sbp_ocb, ocb); in sbp_enqueue_ocb()
2718 STAILQ_INSERT_TAIL(&sdev->ocbs, ocb, ocb); in sbp_enqueue_ocb()
2720 if (ocb->ccb != NULL) { in sbp_enqueue_ocb()
2721 callout_reset_sbt(&ocb->timer, in sbp_enqueue_ocb()
2722 SBT_1MS * ocb->ccb->ccb_h.timeout, 0, sbp_timeout, in sbp_enqueue_ocb()
2727 prev2 = sdev->last_ocb; in sbp_enqueue_ocb()
2729 if (prev2 != NULL && (ocb->sdev->flags & ORB_LINK_DEAD) == 0) { in sbp_enqueue_ocb()
2731 printf("linking chain 0x%jx -> 0x%jx\n", in sbp_enqueue_ocb()
2732 (uintmax_t)prev2->bus_addr, (uintmax_t)ocb->bus_addr); in sbp_enqueue_ocb()
2739 *(volatile uint32_t *)&prev2->orb[1] = htonl(ocb->bus_addr); in sbp_enqueue_ocb()
2740 *(volatile uint32_t *)&prev2->orb[0] = 0; in sbp_enqueue_ocb()
2751 SBP_LOCK_ASSERT(sdev->target->sbp); in sbp_get_ocb()
2752 ocb = STAILQ_FIRST(&sdev->free_ocbs); in sbp_get_ocb()
2754 sdev->flags |= ORB_SHORTAGE; in sbp_get_ocb()
2758 STAILQ_REMOVE_HEAD(&sdev->free_ocbs, ocb); in sbp_get_ocb()
2759 ocb->ccb = NULL; in sbp_get_ocb()
2766 ocb->flags = 0; in sbp_free_ocb()
2767 ocb->ccb = NULL; in sbp_free_ocb()
2769 SBP_LOCK_ASSERT(sdev->target->sbp); in sbp_free_ocb()
2770 STAILQ_INSERT_TAIL(&sdev->free_ocbs, ocb, ocb); in sbp_free_ocb()
2771 if ((sdev->flags & ORB_SHORTAGE) != 0) { in sbp_free_ocb()
2774 sdev->flags &= ~ORB_SHORTAGE; in sbp_free_ocb()
2775 count = sdev->freeze; in sbp_free_ocb()
2776 sdev->freeze = 0; in sbp_free_ocb()
2777 xpt_release_devq(sdev->path, count, TRUE); in sbp_free_ocb()
2786 sdev = ocb->sdev; in sbp_abort_ocb()
2787 SBP_LOCK_ASSERT(sdev->target->sbp); in sbp_abort_ocb()
2789 device_printf(sdev->target->sbp->fd.dev, in sbp_abort_ocb()
2790 "%s:%s 0x%jx\n", __func__, sdev->bustgtlun, (uintmax_t)ocb->bus_addr); in sbp_abort_ocb()
2793 if (ocb->ccb != NULL) in sbp_abort_ocb()
2796 if (ntohl(ocb->orb[4]) & 0xffff) { in sbp_abort_ocb()
2797 bus_dmamap_sync(sdev->target->sbp->dmat, ocb->dmamap, in sbp_abort_ocb()
2798 (ntohl(ocb->orb[4]) & ORB_CMD_IN) ? in sbp_abort_ocb()
2800 bus_dmamap_unload(sdev->target->sbp->dmat, ocb->dmamap); in sbp_abort_ocb()
2802 if (ocb->ccb != NULL) { in sbp_abort_ocb()
2803 callout_stop(&ocb->timer); in sbp_abort_ocb()
2804 ocb->ccb->ccb_h.status = status; in sbp_abort_ocb()
2805 xpt_done(ocb->ccb); in sbp_abort_ocb()
2817 SBP_LOCK_ASSERT(sdev->target->sbp); in sbp_abort_all_ocbs()
2818 STAILQ_CONCAT(&temp, &sdev->ocbs); in sbp_abort_all_ocbs()
2819 STAILQ_INIT(&sdev->ocbs); in sbp_abort_all_ocbs()
2824 if (sdev->last_ocb != NULL) { in sbp_abort_all_ocbs()
2825 sbp_free_ocb(sdev, sdev->last_ocb); in sbp_abort_all_ocbs()
2826 sdev->last_ocb = NULL; in sbp_abort_all_ocbs()