Lines Matching refs:sdev

149 	struct sbp_dev	*sdev;  member
341 sbp_show_sdev_info(struct sbp_dev *sdev) in sbp_show_sdev_info() argument
345 fwdev = sdev->target->fwdev; in sbp_show_sdev_info()
346 device_printf(sdev->target->sbp->fd.dev, in sbp_show_sdev_info()
350 sdev->bustgtlun, in sbp_show_sdev_info()
351 (sdev->type & 0x40) >> 6, in sbp_show_sdev_info()
352 (sdev->type & 0x1f), in sbp_show_sdev_info()
359 device_printf(sdev->target->sbp->fd.dev, in sbp_show_sdev_info()
362 sdev->bustgtlun, in sbp_show_sdev_info()
363 sdev->vendor, in sbp_show_sdev_info()
364 sdev->product, in sbp_show_sdev_info()
365 sdev->revision); in sbp_show_sdev_info()
425 struct sbp_dev *sdev, **newluns; in sbp_alloc_lun() local
455 sdev = target->luns[lun]; in sbp_alloc_lun()
456 if (sdev == NULL) in sbp_alloc_lun()
458 sdev->flags &= ~VALID_LUN; in sbp_alloc_lun()
461 sbp_cam_detach_sdev(sdev); in sbp_alloc_lun()
462 sbp_free_sdev(sdev); in sbp_alloc_lun()
505 sdev = target->luns[lun]; in sbp_alloc_lun()
506 if (sdev == NULL) { in sbp_alloc_lun()
507 sdev = malloc(sizeof(struct sbp_dev), in sbp_alloc_lun()
509 if (sdev == NULL) { in sbp_alloc_lun()
513 target->luns[lun] = sdev; in sbp_alloc_lun()
514 sdev->lun_id = lun; in sbp_alloc_lun()
515 sdev->target = target; in sbp_alloc_lun()
516 STAILQ_INIT(&sdev->ocbs); in sbp_alloc_lun()
517 callout_init_mtx(&sdev->login_callout, &sbp->mtx, 0); in sbp_alloc_lun()
518 sdev->status = SBP_DEV_RESET; in sbp_alloc_lun()
520 snprintf(sdev->bustgtlun, 32, "%s:%d:%d", in sbp_alloc_lun()
521 device_get_nameunit(sdev->target->sbp->fd.dev), in sbp_alloc_lun()
522 sdev->target->target_id, in sbp_alloc_lun()
523 sdev->lun_id); in sbp_alloc_lun()
525 sdev->flags |= VALID_LUN; in sbp_alloc_lun()
526 sdev->type = (reg->val & 0xff0000) >> 16; in sbp_alloc_lun()
533 SBP_DMA_SIZE, &sdev->dma, BUS_DMA_NOWAIT | in sbp_alloc_lun()
535 if (sdev->dma.v_addr == NULL) { in sbp_alloc_lun()
538 free(sdev, M_SBP); in sbp_alloc_lun()
542 sdev->login = (struct sbp_login_res *) sdev->dma.v_addr; in sbp_alloc_lun()
543 sdev->ocb = (struct sbp_ocb *) in sbp_alloc_lun()
544 ((char *)sdev->dma.v_addr + SBP_LOGIN_SIZE); in sbp_alloc_lun()
545 bzero((char *)sdev->ocb, in sbp_alloc_lun()
548 STAILQ_INIT(&sdev->free_ocbs); in sbp_alloc_lun()
551 ocb = &sdev->ocb[i]; in sbp_alloc_lun()
552 ocb->bus_addr = sdev->dma.bus_addr in sbp_alloc_lun()
563 sbp_free_ocb(sdev, ocb); in sbp_alloc_lun()
571 sdev = target->luns[lun]; in sbp_alloc_lun()
572 if (sdev != NULL && (sdev->flags & VALID_LUN) == 0) { in sbp_alloc_lun()
573 sbp_cam_detach_sdev(sdev); in sbp_alloc_lun()
574 sbp_free_sdev(sdev); in sbp_alloc_lun()
627 sbp_probe_lun(struct sbp_dev *sdev) in sbp_probe_lun() argument
633 bzero(sdev->vendor, sizeof(sdev->vendor)); in sbp_probe_lun()
634 bzero(sdev->product, sizeof(sdev->product)); in sbp_probe_lun()
636 fwdev = sdev->target->fwdev; in sbp_probe_lun()
641 crom_parse_text(cc, sdev->vendor, sizeof(sdev->vendor)); in sbp_probe_lun()
651 snprintf(sdev->revision, sizeof(sdev->revision), in sbp_probe_lun()
656 crom_parse_text(cc, sdev->product, sizeof(sdev->product)); in sbp_probe_lun()
662 struct sbp_dev *sdev = (struct sbp_dev *)arg; in sbp_login_callout() local
663 SBP_LOCK_ASSERT(sdev->target->sbp); in sbp_login_callout()
664 sbp_mgm_orb(sdev, ORB_FUN_LGI, NULL); in sbp_login_callout()
668 sbp_login(struct sbp_dev *sdev) in sbp_login() argument
675 timevalsub(&delta, &sdev->target->sbp->last_busreset); in sbp_login()
685 callout_reset(&sdev->login_callout, ticks, in sbp_login()
686 sbp_login_callout, (void *)(sdev)); in sbp_login()
696 struct sbp_dev *sdev; in sbp_probe_target() local
710 sdev = target->luns[i]; in sbp_probe_target()
711 if (sdev == NULL) in sbp_probe_target()
713 if (alive && (sdev->status != SBP_DEV_DEAD)) { in sbp_probe_target()
714 if (sdev->path != NULL) { in sbp_probe_target()
715 xpt_freeze_devq(sdev->path, 1); in sbp_probe_target()
716 sdev->freeze++; in sbp_probe_target()
718 sbp_probe_lun(sdev); in sbp_probe_target()
719 sbp_show_sdev_info(sdev); in sbp_probe_target()
722 sbp_abort_all_ocbs(sdev, CAM_SCSI_BUS_RESET); in sbp_probe_target()
724 switch (sdev->status) { in sbp_probe_target()
728 sbp_login(sdev); in sbp_probe_target()
735 sbp_mgm_orb(sdev, ORB_FUN_RCN, NULL); in sbp_probe_target()
739 switch (sdev->status) { in sbp_probe_target()
746 if (sdev->path) { in sbp_probe_target()
747 xpt_freeze_devq(sdev->path, 1); in sbp_probe_target()
748 sdev->freeze++; in sbp_probe_target()
750 sdev->status = SBP_DEV_RETRY; in sbp_probe_target()
751 sbp_cam_detach_sdev(sdev); in sbp_probe_target()
752 sbp_free_sdev(sdev); in sbp_probe_target()
757 sdev->status = SBP_DEV_RESET; in sbp_probe_target()
873 struct sbp_dev *sdev; in sbp_loginres_callback() local
874 sdev = (struct sbp_dev *)xfer->sc; in sbp_loginres_callback()
876 device_printf(sdev->target->sbp->fd.dev,"%s\n", __func__); in sbp_loginres_callback()
879 SBP_LOCK(sdev->target->sbp); in sbp_loginres_callback()
880 STAILQ_INSERT_TAIL(&sdev->target->sbp->fwb.xferlist, xfer, link); in sbp_loginres_callback()
881 SBP_UNLOCK(sdev->target->sbp); in sbp_loginres_callback()
889 struct sbp_dev *sdev; in sbp_xfer_free() local
891 sdev = (struct sbp_dev *)xfer->sc; in sbp_xfer_free()
893 SBP_LOCK_ASSERT(sdev->target->sbp); in sbp_xfer_free()
894 STAILQ_INSERT_TAIL(&sdev->target->xferlist, xfer, link); in sbp_xfer_free()
900 struct sbp_dev *tsdev, *sdev = (struct sbp_dev *)xfer->sc; in sbp_reset_start_callback() local
901 struct sbp_target *target = sdev->target; in sbp_reset_start_callback()
905 device_printf(sdev->target->sbp->fd.dev, in sbp_reset_start_callback()
906 "%s: %s failed: resp=%d\n", __func__, sdev->bustgtlun, xfer->resp); in sbp_reset_start_callback()
919 sbp_reset_start(struct sbp_dev *sdev) in sbp_reset_start() argument
925 device_printf(sdev->target->sbp->fd.dev, in sbp_reset_start()
926 "%s:%s\n", __func__,sdev->bustgtlun); in sbp_reset_start()
929 xfer = sbp_write_cmd(sdev, FWTCODE_WREQQ, 0); in sbp_reset_start()
941 struct sbp_dev *sdev; in sbp_mgm_callback() local
944 sdev = (struct sbp_dev *)xfer->sc; in sbp_mgm_callback()
947 device_printf(sdev->target->sbp->fd.dev, in sbp_mgm_callback()
948 "%s:%s\n", __func__, sdev->bustgtlun); in sbp_mgm_callback()
951 SBP_LOCK(sdev->target->sbp); in sbp_mgm_callback()
953 SBP_UNLOCK(sdev->target->sbp); in sbp_mgm_callback()
975 struct sbp_dev *sdev; in sbp_cam_scan_lun() local
977 sdev = (struct sbp_dev *) ccb->ccb_h.ccb_sdev_ptr; in sbp_cam_scan_lun()
978 target = sdev->target; in sbp_cam_scan_lun()
983 "%s:%s\n", __func__, sdev->bustgtlun); in sbp_cam_scan_lun()
986 sdev->status = SBP_DEV_ATTACHED; in sbp_cam_scan_lun()
989 "%s:%s failed\n", __func__, sdev->bustgtlun); in sbp_cam_scan_lun()
991 sdev = sbp_next_dev(target, sdev->lun_id + 1); in sbp_cam_scan_lun()
992 if (sdev == NULL) { in sbp_cam_scan_lun()
998 xpt_setup_ccb(&ccb->ccb_h, sdev->path, SCAN_PRI); in sbp_cam_scan_lun()
999 ccb->ccb_h.ccb_sdev_ptr = sdev; in sbp_cam_scan_lun()
1004 xpt_release_devq(sdev->path, sdev->freeze, TRUE); in sbp_cam_scan_lun()
1005 sdev->freeze = 1; in sbp_cam_scan_lun()
1012 struct sbp_dev *sdev; in sbp_cam_scan_target() local
1016 sdev = sbp_next_dev(target, 0); in sbp_cam_scan_target()
1017 if (sdev == NULL) { in sbp_cam_scan_target()
1023 device_printf(sdev->target->sbp->fd.dev, in sbp_cam_scan_target()
1024 "%s:%s\n", __func__, sdev->bustgtlun); in sbp_cam_scan_target()
1033 xpt_setup_ccb(&ccb->ccb_h, sdev->path, SCAN_PRI); in sbp_cam_scan_target()
1038 ccb->ccb_h.ccb_sdev_ptr = sdev; in sbp_cam_scan_target()
1044 xpt_release_devq(sdev->path, sdev->freeze, TRUE); in sbp_cam_scan_target()
1045 sdev->freeze = 1; in sbp_cam_scan_target()
1049 sbp_scan_dev(struct sbp_dev *sdev) in sbp_scan_dev() argument
1051 sdev->status = SBP_DEV_PROBE; in sbp_scan_dev()
1052 callout_reset_sbt(&sdev->target->scan_callout, SBT_1MS * scan_delay, 0, in sbp_scan_dev()
1053 sbp_cam_scan_target, (void *)sdev->target, 0); in sbp_scan_dev()
1059 struct sbp_dev *sdev; in sbp_do_attach() local
1063 sdev = (struct sbp_dev *)xfer->sc; in sbp_do_attach()
1064 target = sdev->target; in sbp_do_attach()
1068 device_printf(sdev->target->sbp->fd.dev, in sbp_do_attach()
1069 "%s:%s\n", __func__, sdev->bustgtlun); in sbp_do_attach()
1073 if (sdev->path == NULL) in sbp_do_attach()
1074 xpt_create_path(&sdev->path, NULL, in sbp_do_attach()
1076 target->target_id, sdev->lun_id); in sbp_do_attach()
1084 sdev->status = SBP_DEV_ATTACHED; in sbp_do_attach()
1089 sbp_scan_dev(sdev); in sbp_do_attach()
1096 struct sbp_dev *sdev; in sbp_agent_reset_callback() local
1098 sdev = (struct sbp_dev *)xfer->sc; in sbp_agent_reset_callback()
1100 device_printf(sdev->target->sbp->fd.dev, in sbp_agent_reset_callback()
1101 "%s:%s\n", __func__, sdev->bustgtlun); in sbp_agent_reset_callback()
1104 device_printf(sdev->target->sbp->fd.dev, in sbp_agent_reset_callback()
1105 "%s:%s resp=%d\n", __func__, sdev->bustgtlun, xfer->resp); in sbp_agent_reset_callback()
1108 SBP_LOCK(sdev->target->sbp); in sbp_agent_reset_callback()
1110 if (sdev->path) { in sbp_agent_reset_callback()
1111 xpt_release_devq(sdev->path, sdev->freeze, TRUE); in sbp_agent_reset_callback()
1112 sdev->freeze = 0; in sbp_agent_reset_callback()
1114 SBP_UNLOCK(sdev->target->sbp); in sbp_agent_reset_callback()
1118 sbp_agent_reset(struct sbp_dev *sdev) in sbp_agent_reset() argument
1123 SBP_LOCK_ASSERT(sdev->target->sbp); in sbp_agent_reset()
1125 device_printf(sdev->target->sbp->fd.dev, in sbp_agent_reset()
1126 "%s:%s\n", __func__, sdev->bustgtlun); in sbp_agent_reset()
1128 xfer = sbp_write_cmd(sdev, FWTCODE_WREQQ, 0x04); in sbp_agent_reset()
1131 if (sdev->status == SBP_DEV_ATTACHED || sdev->status == SBP_DEV_PROBE) in sbp_agent_reset()
1138 sbp_abort_all_ocbs(sdev, CAM_BDR_SENT); in sbp_agent_reset()
1144 struct sbp_dev *sdev; in sbp_busy_timeout_callback() local
1146 sdev = (struct sbp_dev *)xfer->sc; in sbp_busy_timeout_callback()
1148 device_printf(sdev->target->sbp->fd.dev, in sbp_busy_timeout_callback()
1149 "%s:%s\n", __func__, sdev->bustgtlun); in sbp_busy_timeout_callback()
1151 SBP_LOCK(sdev->target->sbp); in sbp_busy_timeout_callback()
1153 sbp_agent_reset(sdev); in sbp_busy_timeout_callback()
1154 SBP_UNLOCK(sdev->target->sbp); in sbp_busy_timeout_callback()
1158 sbp_busy_timeout(struct sbp_dev *sdev) in sbp_busy_timeout() argument
1163 device_printf(sdev->target->sbp->fd.dev, in sbp_busy_timeout()
1164 "%s:%s\n", __func__, sdev->bustgtlun); in sbp_busy_timeout()
1166 xfer = sbp_write_cmd(sdev, FWTCODE_WREQQ, 0); in sbp_busy_timeout()
1179 struct sbp_dev *sdev; in sbp_orb_pointer_callback() local
1180 sdev = (struct sbp_dev *)xfer->sc; in sbp_orb_pointer_callback()
1183 device_printf(sdev->target->sbp->fd.dev, in sbp_orb_pointer_callback()
1184 "%s:%s\n", __func__, sdev->bustgtlun); in sbp_orb_pointer_callback()
1190 SBP_LOCK(sdev->target->sbp); in sbp_orb_pointer_callback()
1193 sdev->flags &= ~ORB_POINTER_ACTIVE; in sbp_orb_pointer_callback()
1195 if ((sdev->flags & ORB_POINTER_NEED) != 0) { in sbp_orb_pointer_callback()
1198 sdev->flags &= ~ORB_POINTER_NEED; in sbp_orb_pointer_callback()
1199 ocb = STAILQ_FIRST(&sdev->ocbs); in sbp_orb_pointer_callback()
1201 sbp_orb_pointer(sdev, ocb); in sbp_orb_pointer_callback()
1203 SBP_UNLOCK(sdev->target->sbp); in sbp_orb_pointer_callback()
1208 sbp_orb_pointer(struct sbp_dev *sdev, struct sbp_ocb *ocb) in sbp_orb_pointer() argument
1213 device_printf(sdev->target->sbp->fd.dev, in sbp_orb_pointer()
1215 __func__, sdev->bustgtlun, in sbp_orb_pointer()
1219 SBP_LOCK_ASSERT(sdev->target->sbp); in sbp_orb_pointer()
1221 if ((sdev->flags & ORB_POINTER_ACTIVE) != 0) { in sbp_orb_pointer()
1225 sdev->flags |= ORB_POINTER_NEED; in sbp_orb_pointer()
1229 sdev->flags |= ORB_POINTER_ACTIVE; in sbp_orb_pointer()
1230 xfer = sbp_write_cmd(sdev, FWTCODE_WREQB, 0x08); in sbp_orb_pointer()
1239 htonl(((sdev->target->sbp->fd.fc->nodeid | FWLOCALBUS) << 16)); in sbp_orb_pointer()
1252 struct sbp_dev *sdev; in sbp_doorbell_callback() local
1253 sdev = (struct sbp_dev *)xfer->sc; in sbp_doorbell_callback()
1256 device_printf(sdev->target->sbp->fd.dev, in sbp_doorbell_callback()
1257 "%s:%s\n", __func__, sdev->bustgtlun); in sbp_doorbell_callback()
1261 device_printf(sdev->target->sbp->fd.dev, in sbp_doorbell_callback()
1264 SBP_LOCK(sdev->target->sbp); in sbp_doorbell_callback()
1266 sdev->flags &= ~ORB_DOORBELL_ACTIVE; in sbp_doorbell_callback()
1267 if ((sdev->flags & ORB_DOORBELL_NEED) != 0) { in sbp_doorbell_callback()
1268 sdev->flags &= ~ORB_DOORBELL_NEED; in sbp_doorbell_callback()
1269 sbp_doorbell(sdev); in sbp_doorbell_callback()
1271 SBP_UNLOCK(sdev->target->sbp); in sbp_doorbell_callback()
1275 sbp_doorbell(struct sbp_dev *sdev) in sbp_doorbell() argument
1280 device_printf(sdev->target->sbp->fd.dev, in sbp_doorbell()
1281 "%s:%s\n", __func__, sdev->bustgtlun); in sbp_doorbell()
1284 if ((sdev->flags & ORB_DOORBELL_ACTIVE) != 0) { in sbp_doorbell()
1285 sdev->flags |= ORB_DOORBELL_NEED; in sbp_doorbell()
1288 sdev->flags |= ORB_DOORBELL_ACTIVE; in sbp_doorbell()
1289 xfer = sbp_write_cmd(sdev, FWTCODE_WREQQ, 0x10); in sbp_doorbell()
1299 sbp_write_cmd(struct sbp_dev *sdev, int tcode, int offset) in sbp_write_cmd() argument
1306 SBP_LOCK_ASSERT(sdev->target->sbp); in sbp_write_cmd()
1308 target = sdev->target; in sbp_write_cmd()
1330 xfer->send.spd = min(sdev->target->fwdev->speed, max_speed); in sbp_write_cmd()
1331 xfer->fc = sdev->target->sbp->fd.fc; in sbp_write_cmd()
1339 xfer->sc = (caddr_t)sdev; in sbp_write_cmd()
1341 fp->mode.wreqq.dest_hi = sdev->login->cmd_hi; in sbp_write_cmd()
1342 fp->mode.wreqq.dest_lo = sdev->login->cmd_lo + offset; in sbp_write_cmd()
1346 fp->mode.wreqq.dst = FWLOCALBUS | sdev->target->fwdev->dst; in sbp_write_cmd()
1352 sbp_mgm_orb(struct sbp_dev *sdev, int func, struct sbp_ocb *aocb) in sbp_mgm_orb() argument
1360 target = sdev->target; in sbp_mgm_orb()
1372 if ((ocb = sbp_get_ocb(sdev)) == NULL) { in sbp_mgm_orb()
1377 ocb->sdev = sdev; in sbp_mgm_orb()
1381 ocb->orb[7] = htonl(SBP_DEV2ADDR(target->target_id, sdev->lun_id)); in sbp_mgm_orb()
1384 device_printf(sdev->target->sbp->fd.dev, in sbp_mgm_orb()
1386 __func__,sdev->bustgtlun, in sbp_mgm_orb()
1393 ocb->orb[3] = htonl(sdev->dma.bus_addr); in sbp_mgm_orb()
1394 ocb->orb[4] = htonl(ORB_NOTIFY | sdev->lun_id); in sbp_mgm_orb()
1398 fwdma_sync(&sdev->dma, BUS_DMASYNC_PREREAD); in sbp_mgm_orb()
1409 ocb->orb[4] = htonl(ORB_NOTIFY | func | sdev->login->id); in sbp_mgm_orb()
1415 STAILQ_INSERT_TAIL(&sdev->target->mgm_ocb_queue, ocb, ocb); in sbp_mgm_orb()
1423 xfer = sbp_write_cmd(sdev, FWTCODE_WREQB, 0); in sbp_mgm_orb()
1430 fp->mode.wreqb.dest_hi = sdev->target->mgm_hi; in sbp_mgm_orb()
1431 fp->mode.wreqb.dest_lo = sdev->target->mgm_lo; in sbp_mgm_orb()
1450 device_get_nameunit(ocb->sdev->target->sbp->fd.dev), in sbp_print_scsi_cmd()
1481 ocb->sdev->bustgtlun, in sbp_scsi_status()
1548 device_printf(ocb->sdev->target->sbp->fd.dev, in sbp_scsi_status()
1550 __func__, ocb->sdev->bustgtlun, in sbp_scsi_status()
1559 struct sbp_dev *sdev; in sbp_fix_inq_data() local
1563 sdev = ocb->sdev; in sbp_fix_inq_data()
1568 device_printf(sdev->target->sbp->fd.dev, in sbp_fix_inq_data()
1569 "%s:%s\n", __func__, sdev->bustgtlun); in sbp_fix_inq_data()
1589 bcopy(sdev->vendor, inq->vendor, sizeof(inq->vendor)); in sbp_fix_inq_data()
1590 bcopy(sdev->product, inq->product, sizeof(inq->product)); in sbp_fix_inq_data()
1591 bcopy(sdev->revision + 2, inq->revision, sizeof(inq->revision)); in sbp_fix_inq_data()
1614 struct sbp_dev *sdev; in sbp_recv1() local
1662 sdev = target->luns[l]; in sbp_recv1()
1677 ocb = sbp_dequeue_ocb(sdev, sbp_status); in sbp_recv1()
1679 device_printf(sdev->target->sbp->fd.dev, in sbp_recv1()
1681 __func__,sdev->bustgtlun, in sbp_recv1()
1687 device_printf(sdev->target->sbp->fd.dev, in sbp_recv1()
1689 __func__, sdev->bustgtlun); in sbp_recv1()
1692 device_printf(sdev->target->sbp->fd.dev, in sbp_recv1()
1694 __func__, sdev->bustgtlun); in sbp_recv1()
1705 device_printf(sdev->target->sbp->fd.dev, in sbp_recv1()
1708 __func__, sdev->bustgtlun, in sbp_recv1()
1713 device_printf(sdev->target->sbp->fd.dev, in sbp_recv1()
1714 "%s\n", sdev->bustgtlun); in sbp_recv1()
1741 if (sdev->path) { in sbp_recv1()
1742 xpt_freeze_devq(sdev->path, 1); in sbp_recv1()
1743 sdev->freeze++; in sbp_recv1()
1763 fwdma_sync(&sdev->dma, BUS_DMASYNC_POSTREAD); in sbp_recv1()
1764 login_res = sdev->login; in sbp_recv1()
1771 device_printf(sdev->target->sbp->fd.dev, in sbp_recv1()
1773 __func__, sdev->bustgtlun, in sbp_recv1()
1778 sbp_busy_timeout(sdev); in sbp_recv1()
1781 device_printf(sdev->target->sbp->fd.dev, in sbp_recv1()
1783 __func__, sdev->bustgtlun); in sbp_recv1()
1784 sdev->status = SBP_DEV_RESET; in sbp_recv1()
1788 login_res = sdev->login; in sbp_recv1()
1791 device_printf(sdev->target->sbp->fd.dev, in sbp_recv1()
1793 __func__, sdev->bustgtlun, in sbp_recv1()
1797 if (sdev->status == SBP_DEV_ATTACHED) in sbp_recv1()
1798 sbp_scan_dev(sdev); in sbp_recv1()
1800 sbp_agent_reset(sdev); in sbp_recv1()
1804 device_printf(sdev->target->sbp->fd.dev, in sbp_recv1()
1806 __func__, sdev->bustgtlun); in sbp_recv1()
1808 sbp_login(sdev); in sbp_recv1()
1812 sdev->status = SBP_DEV_RESET; in sbp_recv1()
1815 sbp_busy_timeout(sdev); in sbp_recv1()
1820 sbp_agent_reset(sdev); in sbp_recv1()
1823 device_printf(sdev->target->sbp->fd.dev, in sbp_recv1()
1825 __func__, sdev->bustgtlun, orb_fun); in sbp_recv1()
1828 sbp_mgm_orb(sdev, ORB_FUN_RUNQUEUE, NULL); in sbp_recv1()
1831 sdev->timeout = 0; in sbp_recv1()
1857 sbp_free_ocb(sdev, ocb); in sbp_recv1()
1860 sbp_agent_reset(sdev); in sbp_recv1()
1876 xfer->spd = min(sdev->target->fwdev->speed, max_speed); in sbp_recv1()
2019 struct sbp_dev *sdev; in sbp_logout_all() local
2031 sdev = target->luns[j]; in sbp_logout_all()
2032 if (sdev == NULL) in sbp_logout_all()
2034 callout_stop(&sdev->login_callout); in sbp_logout_all()
2035 if (sdev->status >= SBP_DEV_TOATTACH && in sbp_logout_all()
2036 sdev->status <= SBP_DEV_ATTACHED) in sbp_logout_all()
2037 sbp_mgm_orb(sdev, ORB_FUN_LGO, NULL); in sbp_logout_all()
2056 sbp_free_sdev(struct sbp_dev *sdev) in sbp_free_sdev() argument
2061 if (sdev == NULL) in sbp_free_sdev()
2063 sbp = sdev->target->sbp; in sbp_free_sdev()
2065 callout_drain(&sdev->login_callout); in sbp_free_sdev()
2067 callout_drain(&sdev->ocb[i].timer); in sbp_free_sdev()
2068 bus_dmamap_destroy(sbp->dmat, sdev->ocb[i].dmamap); in sbp_free_sdev()
2070 fwdma_free(sbp->fd.fc, &sdev->dma); in sbp_free_sdev()
2071 free(sdev, M_SBP); in sbp_free_sdev()
2144 sbp_cam_detach_sdev(struct sbp_dev *sdev) in sbp_cam_detach_sdev() argument
2146 if (sdev == NULL) in sbp_cam_detach_sdev()
2148 if (sdev->status == SBP_DEV_DEAD) in sbp_cam_detach_sdev()
2150 if (sdev->status == SBP_DEV_RESET) in sbp_cam_detach_sdev()
2152 SBP_LOCK_ASSERT(sdev->target->sbp); in sbp_cam_detach_sdev()
2153 sbp_abort_all_ocbs(sdev, CAM_DEV_NOT_THERE); in sbp_cam_detach_sdev()
2154 if (sdev->path) { in sbp_cam_detach_sdev()
2155 xpt_release_devq(sdev->path, in sbp_cam_detach_sdev()
2156 sdev->freeze, TRUE); in sbp_cam_detach_sdev()
2157 sdev->freeze = 0; in sbp_cam_detach_sdev()
2158 xpt_async(AC_LOST_DEVICE, sdev->path, NULL); in sbp_cam_detach_sdev()
2159 xpt_free_path(sdev->path); in sbp_cam_detach_sdev()
2160 sdev->path = NULL; in sbp_cam_detach_sdev()
2181 sbp_target_reset(struct sbp_dev *sdev, int method) in sbp_target_reset() argument
2184 struct sbp_target *target = sdev->target; in sbp_target_reset()
2205 sbp_mgm_orb(sdev, ORB_FUN_RST, NULL); in sbp_target_reset()
2209 sbp_reset_start(sdev); in sbp_target_reset()
2219 struct sbp_dev *sdev = ocb->sdev; in sbp_mgm_timeout() local
2220 struct sbp_target *target = sdev->target; in sbp_mgm_timeout()
2223 device_printf(sdev->target->sbp->fd.dev, in sbp_mgm_timeout()
2225 __func__, sdev->bustgtlun, (uint32_t)ocb->bus_addr); in sbp_mgm_timeout()
2227 sbp_free_ocb(sdev, ocb); in sbp_mgm_timeout()
2231 sbp_mgm_orb(sdev, ORB_FUN_RUNQUEUE, NULL); in sbp_mgm_timeout()
2233 device_printf(sdev->target->sbp->fd.dev, in sbp_mgm_timeout()
2235 __func__, sdev->bustgtlun); in sbp_mgm_timeout()
2236 sbp_reset_start(sdev); in sbp_mgm_timeout()
2243 struct sbp_dev *sdev = ocb->sdev; in sbp_timeout() local
2245 device_printf(sdev->target->sbp->fd.dev, in sbp_timeout()
2247 __func__, sdev->bustgtlun, (uint32_t)ocb->bus_addr); in sbp_timeout()
2249 SBP_LOCK_ASSERT(sdev->target->sbp); in sbp_timeout()
2250 sdev->timeout++; in sbp_timeout()
2251 switch (sdev->timeout) { in sbp_timeout()
2254 xpt_freeze_devq(sdev->path, 1); in sbp_timeout()
2255 sdev->freeze++; in sbp_timeout()
2256 sbp_abort_all_ocbs(sdev, CAM_CMD_TIMEOUT); in sbp_timeout()
2257 sbp_agent_reset(sdev); in sbp_timeout()
2261 sbp_target_reset(sdev, sdev->timeout - 1); in sbp_timeout()
2282 struct sbp_dev *sdev = NULL; in sbp_action() local
2294 sdev = target->luns[ccb->ccb_h.target_lun]; in sbp_action()
2295 if (sdev != NULL && sdev->status != SBP_DEV_ATTACHED && in sbp_action()
2296 sdev->status != SBP_DEV_PROBE) in sbp_action()
2297 sdev = NULL; in sbp_action()
2302 if (sdev == NULL) in sbp_action()
2313 if (sdev == NULL) { in sbp_action()
2386 if (sdev == NULL) { in sbp_action()
2398 if (sdev->status == SBP_DEV_PROBE) { in sbp_action()
2409 if ((ocb = sbp_get_ocb(sdev)) == NULL) { in sbp_action()
2411 if (sdev->freeze == 0) { in sbp_action()
2412 xpt_freeze_devq(sdev->path, 1); in sbp_action()
2413 sdev->freeze++; in sbp_action()
2420 ocb->sdev = sdev; in sbp_action()
2422 ccb->ccb_h.ccb_sdev_ptr = sdev; in sbp_action()
2613 bus_dmamap_sync(ocb->sdev->target->sbp->dmat, ocb->dmamap, in sbp_execute_ocb()
2616 prev = sbp_enqueue_ocb(ocb->sdev, ocb); in sbp_execute_ocb()
2617 fwdma_sync(&ocb->sdev->dma, BUS_DMASYNC_PREWRITE); in sbp_execute_ocb()
2620 if (ocb->sdev->last_ocb != NULL) in sbp_execute_ocb()
2621 sbp_doorbell(ocb->sdev); in sbp_execute_ocb()
2623 sbp_orb_pointer(ocb->sdev, ocb); in sbp_execute_ocb()
2626 if (prev == NULL || (ocb->sdev->flags & ORB_LINK_DEAD) != 0) { in sbp_execute_ocb()
2627 ocb->sdev->flags &= ~ORB_LINK_DEAD; in sbp_execute_ocb()
2628 sbp_orb_pointer(ocb->sdev, ocb); in sbp_execute_ocb()
2648 sbp_dequeue_ocb(struct sbp_dev *sdev, struct sbp_status *sbp_status) in sbp_dequeue_ocb() argument
2655 device_printf(sdev->target->sbp->fd.dev, in sbp_dequeue_ocb()
2657 __func__, sdev->bustgtlun, ntohl(sbp_status->orb_lo), sbp_status->src); in sbp_dequeue_ocb()
2659 SBP_LOCK_ASSERT(sdev->target->sbp); in sbp_dequeue_ocb()
2660 STAILQ_FOREACH_SAFE(ocb, &sdev->ocbs, ocb, next) { in sbp_dequeue_ocb()
2663 STAILQ_REMOVE(&sdev->ocbs, ocb, sbp_ocb, ocb); in sbp_dequeue_ocb()
2667 bus_dmamap_sync(sdev->target->sbp->dmat, in sbp_dequeue_ocb()
2672 bus_dmamap_unload(sdev->target->sbp->dmat, in sbp_dequeue_ocb()
2678 sbp_orb_pointer(sdev, next); in sbp_dequeue_ocb()
2685 sdev->flags |= ORB_LINK_DEAD; in sbp_dequeue_ocb()
2693 if (sdev->last_ocb != NULL) { in sbp_dequeue_ocb()
2694 sbp_free_ocb(sdev, sdev->last_ocb); in sbp_dequeue_ocb()
2696 sdev->last_ocb = ocb; in sbp_dequeue_ocb()
2699 sbp_doorbell(sdev); in sbp_dequeue_ocb()
2707 device_printf(sdev->target->sbp->fd.dev, in sbp_dequeue_ocb()
2709 __func__, sdev->bustgtlun, order); in sbp_dequeue_ocb()
2716 sbp_enqueue_ocb(struct sbp_dev *sdev, struct sbp_ocb *ocb) in sbp_enqueue_ocb() argument
2720 SBP_LOCK_ASSERT(sdev->target->sbp); in sbp_enqueue_ocb()
2722 device_printf(sdev->target->sbp->fd.dev, in sbp_enqueue_ocb()
2723 "%s:%s 0x%08jx\n", __func__, sdev->bustgtlun, (uintmax_t)ocb->bus_addr); in sbp_enqueue_ocb()
2725 prev2 = prev = STAILQ_LAST(&sdev->ocbs, sbp_ocb, ocb); in sbp_enqueue_ocb()
2726 STAILQ_INSERT_TAIL(&sdev->ocbs, ocb, ocb); in sbp_enqueue_ocb()
2735 prev2 = sdev->last_ocb; in sbp_enqueue_ocb()
2737 if (prev2 != NULL && (ocb->sdev->flags & ORB_LINK_DEAD) == 0) { in sbp_enqueue_ocb()
2755 sbp_get_ocb(struct sbp_dev *sdev) in sbp_get_ocb() argument
2759 SBP_LOCK_ASSERT(sdev->target->sbp); in sbp_get_ocb()
2760 ocb = STAILQ_FIRST(&sdev->free_ocbs); in sbp_get_ocb()
2762 sdev->flags |= ORB_SHORTAGE; in sbp_get_ocb()
2766 STAILQ_REMOVE_HEAD(&sdev->free_ocbs, ocb); in sbp_get_ocb()
2772 sbp_free_ocb(struct sbp_dev *sdev, struct sbp_ocb *ocb) in sbp_free_ocb() argument
2777 SBP_LOCK_ASSERT(sdev->target->sbp); in sbp_free_ocb()
2778 STAILQ_INSERT_TAIL(&sdev->free_ocbs, ocb, ocb); in sbp_free_ocb()
2779 if ((sdev->flags & ORB_SHORTAGE) != 0) { in sbp_free_ocb()
2782 sdev->flags &= ~ORB_SHORTAGE; in sbp_free_ocb()
2783 count = sdev->freeze; in sbp_free_ocb()
2784 sdev->freeze = 0; in sbp_free_ocb()
2785 xpt_release_devq(sdev->path, count, TRUE); in sbp_free_ocb()
2792 struct sbp_dev *sdev; in sbp_abort_ocb() local
2794 sdev = ocb->sdev; in sbp_abort_ocb()
2795 SBP_LOCK_ASSERT(sdev->target->sbp); in sbp_abort_ocb()
2797 device_printf(sdev->target->sbp->fd.dev, in sbp_abort_ocb()
2798 "%s:%s 0x%jx\n", __func__, sdev->bustgtlun, (uintmax_t)ocb->bus_addr); in sbp_abort_ocb()
2805 bus_dmamap_sync(sdev->target->sbp->dmat, ocb->dmamap, in sbp_abort_ocb()
2808 bus_dmamap_unload(sdev->target->sbp->dmat, ocb->dmamap); in sbp_abort_ocb()
2815 sbp_free_ocb(sdev, ocb); in sbp_abort_ocb()
2819 sbp_abort_all_ocbs(struct sbp_dev *sdev, int status) in sbp_abort_all_ocbs() argument
2825 SBP_LOCK_ASSERT(sdev->target->sbp); in sbp_abort_all_ocbs()
2826 STAILQ_CONCAT(&temp, &sdev->ocbs); in sbp_abort_all_ocbs()
2827 STAILQ_INIT(&sdev->ocbs); in sbp_abort_all_ocbs()
2832 if (sdev->last_ocb != NULL) { in sbp_abort_all_ocbs()
2833 sbp_free_ocb(sdev, sdev->last_ocb); in sbp_abort_all_ocbs()
2834 sdev->last_ocb = NULL; in sbp_abort_all_ocbs()