Lines Matching refs:sdev
145 struct sbp_dev *sdev; member
337 sbp_show_sdev_info(struct sbp_dev *sdev) in sbp_show_sdev_info() argument
341 fwdev = sdev->target->fwdev; in sbp_show_sdev_info()
342 device_printf(sdev->target->sbp->fd.dev, in sbp_show_sdev_info()
346 sdev->bustgtlun, in sbp_show_sdev_info()
347 (sdev->type & 0x40) >> 6, in sbp_show_sdev_info()
348 (sdev->type & 0x1f), in sbp_show_sdev_info()
355 device_printf(sdev->target->sbp->fd.dev, in sbp_show_sdev_info()
358 sdev->bustgtlun, in sbp_show_sdev_info()
359 sdev->vendor, in sbp_show_sdev_info()
360 sdev->product, in sbp_show_sdev_info()
361 sdev->revision); in sbp_show_sdev_info()
421 struct sbp_dev *sdev, **newluns; in sbp_alloc_lun() local
451 sdev = target->luns[lun]; in sbp_alloc_lun()
452 if (sdev == NULL) in sbp_alloc_lun()
454 sdev->flags &= ~VALID_LUN; in sbp_alloc_lun()
457 sbp_cam_detach_sdev(sdev); in sbp_alloc_lun()
458 sbp_free_sdev(sdev); in sbp_alloc_lun()
501 sdev = target->luns[lun]; in sbp_alloc_lun()
502 if (sdev == NULL) { in sbp_alloc_lun()
503 sdev = malloc(sizeof(struct sbp_dev), in sbp_alloc_lun()
505 if (sdev == NULL) { in sbp_alloc_lun()
509 target->luns[lun] = sdev; in sbp_alloc_lun()
510 sdev->lun_id = lun; in sbp_alloc_lun()
511 sdev->target = target; in sbp_alloc_lun()
512 STAILQ_INIT(&sdev->ocbs); in sbp_alloc_lun()
513 callout_init_mtx(&sdev->login_callout, &sbp->mtx, 0); in sbp_alloc_lun()
514 sdev->status = SBP_DEV_RESET; in sbp_alloc_lun()
516 snprintf(sdev->bustgtlun, 32, "%s:%d:%d", in sbp_alloc_lun()
517 device_get_nameunit(sdev->target->sbp->fd.dev), in sbp_alloc_lun()
518 sdev->target->target_id, in sbp_alloc_lun()
519 sdev->lun_id); in sbp_alloc_lun()
521 sdev->flags |= VALID_LUN; in sbp_alloc_lun()
522 sdev->type = (reg->val & 0xff0000) >> 16; in sbp_alloc_lun()
529 SBP_DMA_SIZE, &sdev->dma, BUS_DMA_NOWAIT | in sbp_alloc_lun()
531 if (sdev->dma.v_addr == NULL) { in sbp_alloc_lun()
534 free(sdev, M_SBP); in sbp_alloc_lun()
538 sdev->login = (struct sbp_login_res *) sdev->dma.v_addr; in sbp_alloc_lun()
539 sdev->ocb = (struct sbp_ocb *) in sbp_alloc_lun()
540 ((char *)sdev->dma.v_addr + SBP_LOGIN_SIZE); in sbp_alloc_lun()
541 bzero((char *)sdev->ocb, in sbp_alloc_lun()
544 STAILQ_INIT(&sdev->free_ocbs); in sbp_alloc_lun()
547 ocb = &sdev->ocb[i]; in sbp_alloc_lun()
548 ocb->bus_addr = sdev->dma.bus_addr in sbp_alloc_lun()
559 sbp_free_ocb(sdev, ocb); in sbp_alloc_lun()
567 sdev = target->luns[lun]; in sbp_alloc_lun()
568 if (sdev != NULL && (sdev->flags & VALID_LUN) == 0) { in sbp_alloc_lun()
569 sbp_cam_detach_sdev(sdev); in sbp_alloc_lun()
570 sbp_free_sdev(sdev); in sbp_alloc_lun()
623 sbp_probe_lun(struct sbp_dev *sdev) in sbp_probe_lun() argument
629 bzero(sdev->vendor, sizeof(sdev->vendor)); in sbp_probe_lun()
630 bzero(sdev->product, sizeof(sdev->product)); in sbp_probe_lun()
632 fwdev = sdev->target->fwdev; in sbp_probe_lun()
637 crom_parse_text(cc, sdev->vendor, sizeof(sdev->vendor)); in sbp_probe_lun()
647 snprintf(sdev->revision, sizeof(sdev->revision), in sbp_probe_lun()
652 crom_parse_text(cc, sdev->product, sizeof(sdev->product)); in sbp_probe_lun()
658 struct sbp_dev *sdev = (struct sbp_dev *)arg; in sbp_login_callout() local
659 SBP_LOCK_ASSERT(sdev->target->sbp); in sbp_login_callout()
660 sbp_mgm_orb(sdev, ORB_FUN_LGI, NULL); in sbp_login_callout()
664 sbp_login(struct sbp_dev *sdev) in sbp_login() argument
671 timevalsub(&delta, &sdev->target->sbp->last_busreset); in sbp_login()
681 callout_reset(&sdev->login_callout, ticks, in sbp_login()
682 sbp_login_callout, (void *)(sdev)); in sbp_login()
692 struct sbp_dev *sdev; in sbp_probe_target() local
706 sdev = target->luns[i]; in sbp_probe_target()
707 if (sdev == NULL) in sbp_probe_target()
709 if (alive && (sdev->status != SBP_DEV_DEAD)) { in sbp_probe_target()
710 if (sdev->path != NULL) { in sbp_probe_target()
711 xpt_freeze_devq(sdev->path, 1); in sbp_probe_target()
712 sdev->freeze++; in sbp_probe_target()
714 sbp_probe_lun(sdev); in sbp_probe_target()
715 sbp_show_sdev_info(sdev); in sbp_probe_target()
718 sbp_abort_all_ocbs(sdev, CAM_SCSI_BUS_RESET); in sbp_probe_target()
720 switch (sdev->status) { in sbp_probe_target()
724 sbp_login(sdev); in sbp_probe_target()
731 sbp_mgm_orb(sdev, ORB_FUN_RCN, NULL); in sbp_probe_target()
735 switch (sdev->status) { in sbp_probe_target()
742 if (sdev->path) { in sbp_probe_target()
743 xpt_freeze_devq(sdev->path, 1); in sbp_probe_target()
744 sdev->freeze++; in sbp_probe_target()
746 sdev->status = SBP_DEV_RETRY; in sbp_probe_target()
747 sbp_cam_detach_sdev(sdev); in sbp_probe_target()
748 sbp_free_sdev(sdev); in sbp_probe_target()
753 sdev->status = SBP_DEV_RESET; in sbp_probe_target()
869 struct sbp_dev *sdev; in sbp_loginres_callback() local
870 sdev = (struct sbp_dev *)xfer->sc; in sbp_loginres_callback()
872 device_printf(sdev->target->sbp->fd.dev,"%s\n", __func__); in sbp_loginres_callback()
875 SBP_LOCK(sdev->target->sbp); in sbp_loginres_callback()
876 STAILQ_INSERT_TAIL(&sdev->target->sbp->fwb.xferlist, xfer, link); in sbp_loginres_callback()
877 SBP_UNLOCK(sdev->target->sbp); in sbp_loginres_callback()
885 struct sbp_dev *sdev; in sbp_xfer_free() local
887 sdev = (struct sbp_dev *)xfer->sc; in sbp_xfer_free()
889 SBP_LOCK_ASSERT(sdev->target->sbp); in sbp_xfer_free()
890 STAILQ_INSERT_TAIL(&sdev->target->xferlist, xfer, link); in sbp_xfer_free()
896 struct sbp_dev *tsdev, *sdev = (struct sbp_dev *)xfer->sc; in sbp_reset_start_callback() local
897 struct sbp_target *target = sdev->target; in sbp_reset_start_callback()
901 device_printf(sdev->target->sbp->fd.dev, in sbp_reset_start_callback()
902 "%s: %s failed: resp=%d\n", __func__, sdev->bustgtlun, xfer->resp); in sbp_reset_start_callback()
915 sbp_reset_start(struct sbp_dev *sdev) in sbp_reset_start() argument
921 device_printf(sdev->target->sbp->fd.dev, in sbp_reset_start()
922 "%s:%s\n", __func__,sdev->bustgtlun); in sbp_reset_start()
925 xfer = sbp_write_cmd(sdev, FWTCODE_WREQQ, 0); in sbp_reset_start()
937 struct sbp_dev *sdev; in sbp_mgm_callback() local
940 sdev = (struct sbp_dev *)xfer->sc; in sbp_mgm_callback()
943 device_printf(sdev->target->sbp->fd.dev, in sbp_mgm_callback()
944 "%s:%s\n", __func__, sdev->bustgtlun); in sbp_mgm_callback()
947 SBP_LOCK(sdev->target->sbp); in sbp_mgm_callback()
949 SBP_UNLOCK(sdev->target->sbp); in sbp_mgm_callback()
971 struct sbp_dev *sdev; in sbp_cam_scan_lun() local
973 sdev = (struct sbp_dev *) ccb->ccb_h.ccb_sdev_ptr; in sbp_cam_scan_lun()
974 target = sdev->target; in sbp_cam_scan_lun()
979 "%s:%s\n", __func__, sdev->bustgtlun); in sbp_cam_scan_lun()
982 sdev->status = SBP_DEV_ATTACHED; in sbp_cam_scan_lun()
985 "%s:%s failed\n", __func__, sdev->bustgtlun); in sbp_cam_scan_lun()
987 sdev = sbp_next_dev(target, sdev->lun_id + 1); in sbp_cam_scan_lun()
988 if (sdev == NULL) { in sbp_cam_scan_lun()
994 xpt_setup_ccb(&ccb->ccb_h, sdev->path, SCAN_PRI); in sbp_cam_scan_lun()
995 ccb->ccb_h.ccb_sdev_ptr = sdev; in sbp_cam_scan_lun()
1000 xpt_release_devq(sdev->path, sdev->freeze, TRUE); in sbp_cam_scan_lun()
1001 sdev->freeze = 1; in sbp_cam_scan_lun()
1008 struct sbp_dev *sdev; in sbp_cam_scan_target() local
1012 sdev = sbp_next_dev(target, 0); in sbp_cam_scan_target()
1013 if (sdev == NULL) { in sbp_cam_scan_target()
1019 device_printf(sdev->target->sbp->fd.dev, in sbp_cam_scan_target()
1020 "%s:%s\n", __func__, sdev->bustgtlun); in sbp_cam_scan_target()
1029 xpt_setup_ccb(&ccb->ccb_h, sdev->path, SCAN_PRI); in sbp_cam_scan_target()
1034 ccb->ccb_h.ccb_sdev_ptr = sdev; in sbp_cam_scan_target()
1040 xpt_release_devq(sdev->path, sdev->freeze, TRUE); in sbp_cam_scan_target()
1041 sdev->freeze = 1; in sbp_cam_scan_target()
1045 sbp_scan_dev(struct sbp_dev *sdev) in sbp_scan_dev() argument
1047 sdev->status = SBP_DEV_PROBE; in sbp_scan_dev()
1048 callout_reset_sbt(&sdev->target->scan_callout, SBT_1MS * scan_delay, 0, in sbp_scan_dev()
1049 sbp_cam_scan_target, (void *)sdev->target, 0); in sbp_scan_dev()
1055 struct sbp_dev *sdev; in sbp_do_attach() local
1059 sdev = (struct sbp_dev *)xfer->sc; in sbp_do_attach()
1060 target = sdev->target; in sbp_do_attach()
1064 device_printf(sdev->target->sbp->fd.dev, in sbp_do_attach()
1065 "%s:%s\n", __func__, sdev->bustgtlun); in sbp_do_attach()
1069 if (sdev->path == NULL) in sbp_do_attach()
1070 xpt_create_path(&sdev->path, NULL, in sbp_do_attach()
1072 target->target_id, sdev->lun_id); in sbp_do_attach()
1080 sdev->status = SBP_DEV_ATTACHED; in sbp_do_attach()
1085 sbp_scan_dev(sdev); in sbp_do_attach()
1092 struct sbp_dev *sdev; in sbp_agent_reset_callback() local
1094 sdev = (struct sbp_dev *)xfer->sc; in sbp_agent_reset_callback()
1096 device_printf(sdev->target->sbp->fd.dev, in sbp_agent_reset_callback()
1097 "%s:%s\n", __func__, sdev->bustgtlun); in sbp_agent_reset_callback()
1100 device_printf(sdev->target->sbp->fd.dev, in sbp_agent_reset_callback()
1101 "%s:%s resp=%d\n", __func__, sdev->bustgtlun, xfer->resp); in sbp_agent_reset_callback()
1104 SBP_LOCK(sdev->target->sbp); in sbp_agent_reset_callback()
1106 if (sdev->path) { in sbp_agent_reset_callback()
1107 xpt_release_devq(sdev->path, sdev->freeze, TRUE); in sbp_agent_reset_callback()
1108 sdev->freeze = 0; in sbp_agent_reset_callback()
1110 SBP_UNLOCK(sdev->target->sbp); in sbp_agent_reset_callback()
1114 sbp_agent_reset(struct sbp_dev *sdev) in sbp_agent_reset() argument
1119 SBP_LOCK_ASSERT(sdev->target->sbp); in sbp_agent_reset()
1121 device_printf(sdev->target->sbp->fd.dev, in sbp_agent_reset()
1122 "%s:%s\n", __func__, sdev->bustgtlun); in sbp_agent_reset()
1124 xfer = sbp_write_cmd(sdev, FWTCODE_WREQQ, 0x04); in sbp_agent_reset()
1127 if (sdev->status == SBP_DEV_ATTACHED || sdev->status == SBP_DEV_PROBE) in sbp_agent_reset()
1134 sbp_abort_all_ocbs(sdev, CAM_BDR_SENT); in sbp_agent_reset()
1140 struct sbp_dev *sdev; in sbp_busy_timeout_callback() local
1142 sdev = (struct sbp_dev *)xfer->sc; in sbp_busy_timeout_callback()
1144 device_printf(sdev->target->sbp->fd.dev, in sbp_busy_timeout_callback()
1145 "%s:%s\n", __func__, sdev->bustgtlun); in sbp_busy_timeout_callback()
1147 SBP_LOCK(sdev->target->sbp); in sbp_busy_timeout_callback()
1149 sbp_agent_reset(sdev); in sbp_busy_timeout_callback()
1150 SBP_UNLOCK(sdev->target->sbp); in sbp_busy_timeout_callback()
1154 sbp_busy_timeout(struct sbp_dev *sdev) in sbp_busy_timeout() argument
1159 device_printf(sdev->target->sbp->fd.dev, in sbp_busy_timeout()
1160 "%s:%s\n", __func__, sdev->bustgtlun); in sbp_busy_timeout()
1162 xfer = sbp_write_cmd(sdev, FWTCODE_WREQQ, 0); in sbp_busy_timeout()
1175 struct sbp_dev *sdev; in sbp_orb_pointer_callback() local
1176 sdev = (struct sbp_dev *)xfer->sc; in sbp_orb_pointer_callback()
1179 device_printf(sdev->target->sbp->fd.dev, in sbp_orb_pointer_callback()
1180 "%s:%s\n", __func__, sdev->bustgtlun); in sbp_orb_pointer_callback()
1186 SBP_LOCK(sdev->target->sbp); in sbp_orb_pointer_callback()
1189 sdev->flags &= ~ORB_POINTER_ACTIVE; in sbp_orb_pointer_callback()
1191 if ((sdev->flags & ORB_POINTER_NEED) != 0) { in sbp_orb_pointer_callback()
1194 sdev->flags &= ~ORB_POINTER_NEED; in sbp_orb_pointer_callback()
1195 ocb = STAILQ_FIRST(&sdev->ocbs); in sbp_orb_pointer_callback()
1197 sbp_orb_pointer(sdev, ocb); in sbp_orb_pointer_callback()
1199 SBP_UNLOCK(sdev->target->sbp); in sbp_orb_pointer_callback()
1204 sbp_orb_pointer(struct sbp_dev *sdev, struct sbp_ocb *ocb) in sbp_orb_pointer() argument
1209 device_printf(sdev->target->sbp->fd.dev, in sbp_orb_pointer()
1211 __func__, sdev->bustgtlun, in sbp_orb_pointer()
1215 SBP_LOCK_ASSERT(sdev->target->sbp); in sbp_orb_pointer()
1217 if ((sdev->flags & ORB_POINTER_ACTIVE) != 0) { in sbp_orb_pointer()
1221 sdev->flags |= ORB_POINTER_NEED; in sbp_orb_pointer()
1225 sdev->flags |= ORB_POINTER_ACTIVE; in sbp_orb_pointer()
1226 xfer = sbp_write_cmd(sdev, FWTCODE_WREQB, 0x08); in sbp_orb_pointer()
1235 htonl(((sdev->target->sbp->fd.fc->nodeid | FWLOCALBUS) << 16)); in sbp_orb_pointer()
1248 struct sbp_dev *sdev; in sbp_doorbell_callback() local
1249 sdev = (struct sbp_dev *)xfer->sc; in sbp_doorbell_callback()
1252 device_printf(sdev->target->sbp->fd.dev, in sbp_doorbell_callback()
1253 "%s:%s\n", __func__, sdev->bustgtlun); in sbp_doorbell_callback()
1257 device_printf(sdev->target->sbp->fd.dev, in sbp_doorbell_callback()
1260 SBP_LOCK(sdev->target->sbp); in sbp_doorbell_callback()
1262 sdev->flags &= ~ORB_DOORBELL_ACTIVE; in sbp_doorbell_callback()
1263 if ((sdev->flags & ORB_DOORBELL_NEED) != 0) { in sbp_doorbell_callback()
1264 sdev->flags &= ~ORB_DOORBELL_NEED; in sbp_doorbell_callback()
1265 sbp_doorbell(sdev); in sbp_doorbell_callback()
1267 SBP_UNLOCK(sdev->target->sbp); in sbp_doorbell_callback()
1271 sbp_doorbell(struct sbp_dev *sdev) in sbp_doorbell() argument
1276 device_printf(sdev->target->sbp->fd.dev, in sbp_doorbell()
1277 "%s:%s\n", __func__, sdev->bustgtlun); in sbp_doorbell()
1280 if ((sdev->flags & ORB_DOORBELL_ACTIVE) != 0) { in sbp_doorbell()
1281 sdev->flags |= ORB_DOORBELL_NEED; in sbp_doorbell()
1284 sdev->flags |= ORB_DOORBELL_ACTIVE; in sbp_doorbell()
1285 xfer = sbp_write_cmd(sdev, FWTCODE_WREQQ, 0x10); in sbp_doorbell()
1295 sbp_write_cmd(struct sbp_dev *sdev, int tcode, int offset) in sbp_write_cmd() argument
1302 SBP_LOCK_ASSERT(sdev->target->sbp); in sbp_write_cmd()
1304 target = sdev->target; in sbp_write_cmd()
1326 xfer->send.spd = min(sdev->target->fwdev->speed, max_speed); in sbp_write_cmd()
1327 xfer->fc = sdev->target->sbp->fd.fc; in sbp_write_cmd()
1335 xfer->sc = (caddr_t)sdev; in sbp_write_cmd()
1337 fp->mode.wreqq.dest_hi = sdev->login->cmd_hi; in sbp_write_cmd()
1338 fp->mode.wreqq.dest_lo = sdev->login->cmd_lo + offset; in sbp_write_cmd()
1342 fp->mode.wreqq.dst = FWLOCALBUS | sdev->target->fwdev->dst; in sbp_write_cmd()
1348 sbp_mgm_orb(struct sbp_dev *sdev, int func, struct sbp_ocb *aocb) in sbp_mgm_orb() argument
1356 target = sdev->target; in sbp_mgm_orb()
1368 if ((ocb = sbp_get_ocb(sdev)) == NULL) { in sbp_mgm_orb()
1373 ocb->sdev = sdev; in sbp_mgm_orb()
1377 ocb->orb[7] = htonl(SBP_DEV2ADDR(target->target_id, sdev->lun_id)); in sbp_mgm_orb()
1380 device_printf(sdev->target->sbp->fd.dev, in sbp_mgm_orb()
1382 __func__,sdev->bustgtlun, in sbp_mgm_orb()
1389 ocb->orb[3] = htonl(sdev->dma.bus_addr); in sbp_mgm_orb()
1390 ocb->orb[4] = htonl(ORB_NOTIFY | sdev->lun_id); in sbp_mgm_orb()
1394 fwdma_sync(&sdev->dma, BUS_DMASYNC_PREREAD); in sbp_mgm_orb()
1405 ocb->orb[4] = htonl(ORB_NOTIFY | func | sdev->login->id); in sbp_mgm_orb()
1411 STAILQ_INSERT_TAIL(&sdev->target->mgm_ocb_queue, ocb, ocb); in sbp_mgm_orb()
1419 xfer = sbp_write_cmd(sdev, FWTCODE_WREQB, 0); in sbp_mgm_orb()
1426 fp->mode.wreqb.dest_hi = sdev->target->mgm_hi; in sbp_mgm_orb()
1427 fp->mode.wreqb.dest_lo = sdev->target->mgm_lo; in sbp_mgm_orb()
1446 device_get_nameunit(ocb->sdev->target->sbp->fd.dev), in sbp_print_scsi_cmd()
1477 ocb->sdev->bustgtlun, in sbp_scsi_status()
1544 device_printf(ocb->sdev->target->sbp->fd.dev, in sbp_scsi_status()
1546 __func__, ocb->sdev->bustgtlun, in sbp_scsi_status()
1555 struct sbp_dev *sdev; in sbp_fix_inq_data() local
1559 sdev = ocb->sdev; in sbp_fix_inq_data()
1564 device_printf(sdev->target->sbp->fd.dev, in sbp_fix_inq_data()
1565 "%s:%s\n", __func__, sdev->bustgtlun); in sbp_fix_inq_data()
1585 bcopy(sdev->vendor, inq->vendor, sizeof(inq->vendor)); in sbp_fix_inq_data()
1586 bcopy(sdev->product, inq->product, sizeof(inq->product)); in sbp_fix_inq_data()
1587 bcopy(sdev->revision + 2, inq->revision, sizeof(inq->revision)); in sbp_fix_inq_data()
1610 struct sbp_dev *sdev; in sbp_recv1() local
1658 sdev = target->luns[l]; in sbp_recv1()
1673 ocb = sbp_dequeue_ocb(sdev, sbp_status); in sbp_recv1()
1675 device_printf(sdev->target->sbp->fd.dev, in sbp_recv1()
1677 __func__,sdev->bustgtlun, in sbp_recv1()
1683 device_printf(sdev->target->sbp->fd.dev, in sbp_recv1()
1685 __func__, sdev->bustgtlun); in sbp_recv1()
1688 device_printf(sdev->target->sbp->fd.dev, in sbp_recv1()
1690 __func__, sdev->bustgtlun); in sbp_recv1()
1701 device_printf(sdev->target->sbp->fd.dev, in sbp_recv1()
1704 __func__, sdev->bustgtlun, in sbp_recv1()
1709 device_printf(sdev->target->sbp->fd.dev, in sbp_recv1()
1710 "%s\n", sdev->bustgtlun); in sbp_recv1()
1737 if (sdev->path) { in sbp_recv1()
1738 xpt_freeze_devq(sdev->path, 1); in sbp_recv1()
1739 sdev->freeze++; in sbp_recv1()
1759 fwdma_sync(&sdev->dma, BUS_DMASYNC_POSTREAD); in sbp_recv1()
1760 login_res = sdev->login; in sbp_recv1()
1767 device_printf(sdev->target->sbp->fd.dev, in sbp_recv1()
1769 __func__, sdev->bustgtlun, in sbp_recv1()
1774 sbp_busy_timeout(sdev); in sbp_recv1()
1777 device_printf(sdev->target->sbp->fd.dev, in sbp_recv1()
1779 __func__, sdev->bustgtlun); in sbp_recv1()
1780 sdev->status = SBP_DEV_RESET; in sbp_recv1()
1784 login_res = sdev->login; in sbp_recv1()
1787 device_printf(sdev->target->sbp->fd.dev, in sbp_recv1()
1789 __func__, sdev->bustgtlun, in sbp_recv1()
1793 if (sdev->status == SBP_DEV_ATTACHED) in sbp_recv1()
1794 sbp_scan_dev(sdev); in sbp_recv1()
1796 sbp_agent_reset(sdev); in sbp_recv1()
1800 device_printf(sdev->target->sbp->fd.dev, in sbp_recv1()
1802 __func__, sdev->bustgtlun); in sbp_recv1()
1804 sbp_login(sdev); in sbp_recv1()
1808 sdev->status = SBP_DEV_RESET; in sbp_recv1()
1811 sbp_busy_timeout(sdev); in sbp_recv1()
1816 sbp_agent_reset(sdev); in sbp_recv1()
1819 device_printf(sdev->target->sbp->fd.dev, in sbp_recv1()
1821 __func__, sdev->bustgtlun, orb_fun); in sbp_recv1()
1824 sbp_mgm_orb(sdev, ORB_FUN_RUNQUEUE, NULL); in sbp_recv1()
1827 sdev->timeout = 0; in sbp_recv1()
1853 sbp_free_ocb(sdev, ocb); in sbp_recv1()
1856 sbp_agent_reset(sdev); in sbp_recv1()
1872 xfer->spd = min(sdev->target->fwdev->speed, max_speed); in sbp_recv1()
2015 struct sbp_dev *sdev; in sbp_logout_all() local
2027 sdev = target->luns[j]; in sbp_logout_all()
2028 if (sdev == NULL) in sbp_logout_all()
2030 callout_stop(&sdev->login_callout); in sbp_logout_all()
2031 if (sdev->status >= SBP_DEV_TOATTACH && in sbp_logout_all()
2032 sdev->status <= SBP_DEV_ATTACHED) in sbp_logout_all()
2033 sbp_mgm_orb(sdev, ORB_FUN_LGO, NULL); in sbp_logout_all()
2052 sbp_free_sdev(struct sbp_dev *sdev) in sbp_free_sdev() argument
2057 if (sdev == NULL) in sbp_free_sdev()
2059 sbp = sdev->target->sbp; in sbp_free_sdev()
2061 callout_drain(&sdev->login_callout); in sbp_free_sdev()
2063 callout_drain(&sdev->ocb[i].timer); in sbp_free_sdev()
2064 bus_dmamap_destroy(sbp->dmat, sdev->ocb[i].dmamap); in sbp_free_sdev()
2066 fwdma_free(sbp->fd.fc, &sdev->dma); in sbp_free_sdev()
2067 free(sdev, M_SBP); in sbp_free_sdev()
2140 sbp_cam_detach_sdev(struct sbp_dev *sdev) in sbp_cam_detach_sdev() argument
2142 if (sdev == NULL) in sbp_cam_detach_sdev()
2144 if (sdev->status == SBP_DEV_DEAD) in sbp_cam_detach_sdev()
2146 if (sdev->status == SBP_DEV_RESET) in sbp_cam_detach_sdev()
2148 SBP_LOCK_ASSERT(sdev->target->sbp); in sbp_cam_detach_sdev()
2149 sbp_abort_all_ocbs(sdev, CAM_DEV_NOT_THERE); in sbp_cam_detach_sdev()
2150 if (sdev->path) { in sbp_cam_detach_sdev()
2151 xpt_release_devq(sdev->path, in sbp_cam_detach_sdev()
2152 sdev->freeze, TRUE); in sbp_cam_detach_sdev()
2153 sdev->freeze = 0; in sbp_cam_detach_sdev()
2154 xpt_async(AC_LOST_DEVICE, sdev->path, NULL); in sbp_cam_detach_sdev()
2155 xpt_free_path(sdev->path); in sbp_cam_detach_sdev()
2156 sdev->path = NULL; in sbp_cam_detach_sdev()
2177 sbp_target_reset(struct sbp_dev *sdev, int method) in sbp_target_reset() argument
2180 struct sbp_target *target = sdev->target; in sbp_target_reset()
2201 sbp_mgm_orb(sdev, ORB_FUN_RST, NULL); in sbp_target_reset()
2205 sbp_reset_start(sdev); in sbp_target_reset()
2215 struct sbp_dev *sdev = ocb->sdev; in sbp_mgm_timeout() local
2216 struct sbp_target *target = sdev->target; in sbp_mgm_timeout()
2219 device_printf(sdev->target->sbp->fd.dev, in sbp_mgm_timeout()
2221 __func__, sdev->bustgtlun, (uint32_t)ocb->bus_addr); in sbp_mgm_timeout()
2223 sbp_free_ocb(sdev, ocb); in sbp_mgm_timeout()
2227 sbp_mgm_orb(sdev, ORB_FUN_RUNQUEUE, NULL); in sbp_mgm_timeout()
2229 device_printf(sdev->target->sbp->fd.dev, in sbp_mgm_timeout()
2231 __func__, sdev->bustgtlun); in sbp_mgm_timeout()
2232 sbp_reset_start(sdev); in sbp_mgm_timeout()
2239 struct sbp_dev *sdev = ocb->sdev; in sbp_timeout() local
2241 device_printf(sdev->target->sbp->fd.dev, in sbp_timeout()
2243 __func__, sdev->bustgtlun, (uint32_t)ocb->bus_addr); in sbp_timeout()
2245 SBP_LOCK_ASSERT(sdev->target->sbp); in sbp_timeout()
2246 sdev->timeout++; in sbp_timeout()
2247 switch (sdev->timeout) { in sbp_timeout()
2250 xpt_freeze_devq(sdev->path, 1); in sbp_timeout()
2251 sdev->freeze++; in sbp_timeout()
2252 sbp_abort_all_ocbs(sdev, CAM_CMD_TIMEOUT); in sbp_timeout()
2253 sbp_agent_reset(sdev); in sbp_timeout()
2257 sbp_target_reset(sdev, sdev->timeout - 1); in sbp_timeout()
2278 struct sbp_dev *sdev = NULL; in sbp_action() local
2290 sdev = target->luns[ccb->ccb_h.target_lun]; in sbp_action()
2291 if (sdev != NULL && sdev->status != SBP_DEV_ATTACHED && in sbp_action()
2292 sdev->status != SBP_DEV_PROBE) in sbp_action()
2293 sdev = NULL; in sbp_action()
2298 if (sdev == NULL) in sbp_action()
2309 if (sdev == NULL) { in sbp_action()
2382 if (sdev == NULL) { in sbp_action()
2394 if (sdev->status == SBP_DEV_PROBE) { in sbp_action()
2405 if ((ocb = sbp_get_ocb(sdev)) == NULL) { in sbp_action()
2407 if (sdev->freeze == 0) { in sbp_action()
2408 xpt_freeze_devq(sdev->path, 1); in sbp_action()
2409 sdev->freeze++; in sbp_action()
2416 ocb->sdev = sdev; in sbp_action()
2418 ccb->ccb_h.ccb_sdev_ptr = sdev; in sbp_action()
2609 bus_dmamap_sync(ocb->sdev->target->sbp->dmat, ocb->dmamap, in sbp_execute_ocb()
2612 prev = sbp_enqueue_ocb(ocb->sdev, ocb); in sbp_execute_ocb()
2613 fwdma_sync(&ocb->sdev->dma, BUS_DMASYNC_PREWRITE); in sbp_execute_ocb()
2616 if (ocb->sdev->last_ocb != NULL) in sbp_execute_ocb()
2617 sbp_doorbell(ocb->sdev); in sbp_execute_ocb()
2619 sbp_orb_pointer(ocb->sdev, ocb); in sbp_execute_ocb()
2622 if (prev == NULL || (ocb->sdev->flags & ORB_LINK_DEAD) != 0) { in sbp_execute_ocb()
2623 ocb->sdev->flags &= ~ORB_LINK_DEAD; in sbp_execute_ocb()
2624 sbp_orb_pointer(ocb->sdev, ocb); in sbp_execute_ocb()
2644 sbp_dequeue_ocb(struct sbp_dev *sdev, struct sbp_status *sbp_status) in sbp_dequeue_ocb() argument
2651 device_printf(sdev->target->sbp->fd.dev, in sbp_dequeue_ocb()
2653 __func__, sdev->bustgtlun, ntohl(sbp_status->orb_lo), sbp_status->src); in sbp_dequeue_ocb()
2655 SBP_LOCK_ASSERT(sdev->target->sbp); in sbp_dequeue_ocb()
2656 STAILQ_FOREACH_SAFE(ocb, &sdev->ocbs, ocb, next) { in sbp_dequeue_ocb()
2659 STAILQ_REMOVE(&sdev->ocbs, ocb, sbp_ocb, ocb); in sbp_dequeue_ocb()
2663 bus_dmamap_sync(sdev->target->sbp->dmat, in sbp_dequeue_ocb()
2668 bus_dmamap_unload(sdev->target->sbp->dmat, in sbp_dequeue_ocb()
2674 sbp_orb_pointer(sdev, next); in sbp_dequeue_ocb()
2681 sdev->flags |= ORB_LINK_DEAD; in sbp_dequeue_ocb()
2689 if (sdev->last_ocb != NULL) { in sbp_dequeue_ocb()
2690 sbp_free_ocb(sdev, sdev->last_ocb); in sbp_dequeue_ocb()
2692 sdev->last_ocb = ocb; in sbp_dequeue_ocb()
2695 sbp_doorbell(sdev); in sbp_dequeue_ocb()
2703 device_printf(sdev->target->sbp->fd.dev, in sbp_dequeue_ocb()
2705 __func__, sdev->bustgtlun, order); in sbp_dequeue_ocb()
2712 sbp_enqueue_ocb(struct sbp_dev *sdev, struct sbp_ocb *ocb) in sbp_enqueue_ocb() argument
2716 SBP_LOCK_ASSERT(sdev->target->sbp); in sbp_enqueue_ocb()
2718 device_printf(sdev->target->sbp->fd.dev, in sbp_enqueue_ocb()
2719 "%s:%s 0x%08jx\n", __func__, sdev->bustgtlun, (uintmax_t)ocb->bus_addr); in sbp_enqueue_ocb()
2721 prev2 = prev = STAILQ_LAST(&sdev->ocbs, sbp_ocb, ocb); in sbp_enqueue_ocb()
2722 STAILQ_INSERT_TAIL(&sdev->ocbs, ocb, ocb); in sbp_enqueue_ocb()
2731 prev2 = sdev->last_ocb; in sbp_enqueue_ocb()
2733 if (prev2 != NULL && (ocb->sdev->flags & ORB_LINK_DEAD) == 0) { in sbp_enqueue_ocb()
2751 sbp_get_ocb(struct sbp_dev *sdev) in sbp_get_ocb() argument
2755 SBP_LOCK_ASSERT(sdev->target->sbp); in sbp_get_ocb()
2756 ocb = STAILQ_FIRST(&sdev->free_ocbs); in sbp_get_ocb()
2758 sdev->flags |= ORB_SHORTAGE; in sbp_get_ocb()
2762 STAILQ_REMOVE_HEAD(&sdev->free_ocbs, ocb); in sbp_get_ocb()
2768 sbp_free_ocb(struct sbp_dev *sdev, struct sbp_ocb *ocb) in sbp_free_ocb() argument
2773 SBP_LOCK_ASSERT(sdev->target->sbp); in sbp_free_ocb()
2774 STAILQ_INSERT_TAIL(&sdev->free_ocbs, ocb, ocb); in sbp_free_ocb()
2775 if ((sdev->flags & ORB_SHORTAGE) != 0) { in sbp_free_ocb()
2778 sdev->flags &= ~ORB_SHORTAGE; in sbp_free_ocb()
2779 count = sdev->freeze; in sbp_free_ocb()
2780 sdev->freeze = 0; in sbp_free_ocb()
2781 xpt_release_devq(sdev->path, count, TRUE); in sbp_free_ocb()
2788 struct sbp_dev *sdev; in sbp_abort_ocb() local
2790 sdev = ocb->sdev; in sbp_abort_ocb()
2791 SBP_LOCK_ASSERT(sdev->target->sbp); in sbp_abort_ocb()
2793 device_printf(sdev->target->sbp->fd.dev, in sbp_abort_ocb()
2794 "%s:%s 0x%jx\n", __func__, sdev->bustgtlun, (uintmax_t)ocb->bus_addr); in sbp_abort_ocb()
2801 bus_dmamap_sync(sdev->target->sbp->dmat, ocb->dmamap, in sbp_abort_ocb()
2804 bus_dmamap_unload(sdev->target->sbp->dmat, ocb->dmamap); in sbp_abort_ocb()
2811 sbp_free_ocb(sdev, ocb); in sbp_abort_ocb()
2815 sbp_abort_all_ocbs(struct sbp_dev *sdev, int status) in sbp_abort_all_ocbs() argument
2821 SBP_LOCK_ASSERT(sdev->target->sbp); in sbp_abort_all_ocbs()
2822 STAILQ_CONCAT(&temp, &sdev->ocbs); in sbp_abort_all_ocbs()
2823 STAILQ_INIT(&sdev->ocbs); in sbp_abort_all_ocbs()
2828 if (sdev->last_ocb != NULL) { in sbp_abort_all_ocbs()
2829 sbp_free_ocb(sdev, sdev->last_ocb); in sbp_abort_all_ocbs()
2830 sdev->last_ocb = NULL; in sbp_abort_all_ocbs()