Lines Matching refs:req

68 vioscsi_poll_until(vioscsi_softc_t *sc, vioscsi_request_t *req,  in vioscsi_poll_until()  argument
74 if (req->vr_done) { in vioscsi_poll_until()
80 atomic_or_8(&req->vr_expired, 1); in vioscsi_poll_until()
88 vioscsi_request_t req; in vioscsi_tmf() local
92 bzero(&req, sizeof (req)); in vioscsi_tmf()
94 if (vioscsi_req_init(sc, &req, sc->vs_ctl_vq, KM_NOSLEEP) != 0) { in vioscsi_tmf()
98 tmf = &req.vr_req->tmf; in vioscsi_tmf()
99 res = &req.vr_res->tmf; in vioscsi_tmf()
109 virtio_chain_clear(req.vr_vic); in vioscsi_tmf()
110 if (virtio_chain_append(req.vr_vic, req.vr_req_pa, sizeof (*tmf), in vioscsi_tmf()
115 if (virtio_chain_append(req.vr_vic, req.vr_res_pa, sizeof (*res), in vioscsi_tmf()
123 virtio_dma_sync(req.vr_dma, DDI_DMA_SYNC_FORDEV); in vioscsi_tmf()
128 virtio_chain_submit(req.vr_vic, B_TRUE); in vioscsi_tmf()
134 if (!vioscsi_poll_until(sc, &req, vioscsi_ctl_handler, 5)) { in vioscsi_tmf()
145 vioscsi_req_fini(&req); in vioscsi_tmf()
172 vioscsi_req_abort(vioscsi_softc_t *sc, vioscsi_request_t *req) in vioscsi_req_abort() argument
175 req->vr_target, req->vr_lun, req)); in vioscsi_req_abort()
181 vioscsi_request_t *req; in vioscsi_dev_abort() local
185 for (req = list_head(l); req != NULL; req = list_next(l, req)) { in vioscsi_dev_abort()
187 req->vr_target, req->vr_lun, req); in vioscsi_dev_abort()
197 vioscsi_request_t *req; in vioscsi_dev_timeout() local
215 for (req = list_head(l); req != NULL; req = list_next(l, req)) { in vioscsi_dev_timeout()
220 if (now < req->vr_expire) { in vioscsi_dev_timeout()
223 atomic_or_8(&req->vr_expired, 1); in vioscsi_dev_timeout()
229 (int)req->vr_time); in vioscsi_dev_timeout()
230 (void) vioscsi_req_abort(sc, req); in vioscsi_dev_timeout()
247 vioscsi_poll(vioscsi_softc_t *sc, vioscsi_request_t *req) in vioscsi_poll() argument
249 if (vioscsi_poll_until(sc, req, vioscsi_cmd_handler, req->vr_time)) { in vioscsi_poll()
257 if (vioscsi_req_abort(sc, req) && in vioscsi_poll()
258 vioscsi_poll_until(sc, req, vioscsi_cmd_handler, 1)) { in vioscsi_poll()
265 if (vioscsi_lun_reset(sc, req->vr_target, req->vr_lun) && in vioscsi_poll()
266 vioscsi_poll_until(sc, req, vioscsi_cmd_handler, 1)) { in vioscsi_poll()
279 (void) vioscsi_target_reset(sc, req->vr_target); in vioscsi_poll()
280 if (vioscsi_poll_until(sc, req, vioscsi_cmd_handler, 60)) { in vioscsi_poll()
287 vioscsi_start(vioscsi_softc_t *sc, vioscsi_request_t *req) in vioscsi_start() argument
289 vioscsi_cmd_req_t *cmd = &req->vr_req->cmd; in vioscsi_start()
291 req->vr_done = 0; in vioscsi_start()
292 req->vr_expired = 0; in vioscsi_start()
294 cmd->lun[1] = req->vr_target; in vioscsi_start()
295 cmd->lun[2] = 0x40 | ((req->vr_lun >> 8) & 0xff); in vioscsi_start()
296 cmd->lun[3] = req->vr_lun & 0xff; in vioscsi_start()
301 cmd->tag = (uint64_t)req; in vioscsi_start()
304 cmd->task_attr = req->vr_task_attr; in vioscsi_start()
309 virtio_dma_sync(req->vr_dma, DDI_DMA_SYNC_FORDEV); in vioscsi_start()
315 if (req->vr_poll) { in vioscsi_start()
319 virtio_chain_submit(req->vr_vic, B_TRUE); in vioscsi_start()
325 vioscsi_poll(sc, req); in vioscsi_start()
330 virtio_chain_submit(req->vr_vic, B_TRUE); in vioscsi_start()
339 vioscsi_request_t *req = pkt->pkt_ha_private; in vioscsi_tran_start() local
340 virtio_chain_t *vic = req->vr_vic; in vioscsi_tran_start()
341 vioscsi_cmd_req_t *cmd = &req->vr_req->cmd; in vioscsi_tran_start()
342 vioscsi_cmd_res_t *res = &req->vr_res->cmd; in vioscsi_tran_start()
356 req->vr_time = min(pkt->pkt_time ? pkt->pkt_time : 10, 3600); in vioscsi_tran_start()
357 req->vr_dev = vd; in vioscsi_tran_start()
358 req->vr_poll = ((pkt->pkt_flags & FLAG_NOINTR) != 0); in vioscsi_tran_start()
359 req->vr_target = vd->vd_target; in vioscsi_tran_start()
360 req->vr_lun = vd->vd_lun; in vioscsi_tran_start()
361 req->vr_start = ddi_get_lbolt(); in vioscsi_tran_start()
362 req->vr_expire = req->vr_start + req->vr_time * vioscsi_hz; in vioscsi_tran_start()
368 req->vr_task_attr = VIRTIO_SCSI_S_HEAD; in vioscsi_tran_start()
370 req->vr_task_attr = VIRTIO_SCSI_S_ORDERED; in vioscsi_tran_start()
372 req->vr_task_attr = VIRTIO_SCSI_S_ACA; in vioscsi_tran_start()
374 req->vr_task_attr = VIRTIO_SCSI_S_SIMPLE; in vioscsi_tran_start()
394 if (virtio_chain_append(vic, req->vr_req_pa, sizeof (*cmd), in vioscsi_tran_start()
416 if (virtio_chain_append(vic, req->vr_res_pa, sizeof (*res), in vioscsi_tran_start()
445 if (!req->vr_poll) { in vioscsi_tran_start()
461 if ((req->vr_expire - r->vr_expire) >= 0) { in vioscsi_tran_start()
462 list_insert_after(l, r, req); in vioscsi_tran_start()
470 list_insert_head(l, req); in vioscsi_tran_start()
480 vioscsi_start(vd->vd_sc, req); in vioscsi_tran_start()
489 vioscsi_request_t *req; in vioscsi_tran_abort() local
503 if ((req = pkt->pkt_ha_private) != NULL) { in vioscsi_tran_abort()
504 return (vioscsi_req_abort(vd->vd_sc, req) ? 1 : 0); in vioscsi_tran_abort()
511 vioscsi_req_fini(vioscsi_request_t *req) in vioscsi_req_fini() argument
513 if (req->vr_dma != NULL) { in vioscsi_req_fini()
514 virtio_dma_free(req->vr_dma); in vioscsi_req_fini()
515 req->vr_dma = NULL; in vioscsi_req_fini()
517 if (req->vr_vic != NULL) { in vioscsi_req_fini()
518 virtio_chain_free(req->vr_vic); in vioscsi_req_fini()
519 req->vr_vic = NULL; in vioscsi_req_fini()
524 vioscsi_req_init(vioscsi_softc_t *sc, vioscsi_request_t *req, in vioscsi_req_init() argument
529 bzero(req, sizeof (*req)); in vioscsi_req_init()
530 list_link_init(&req->vr_node); in vioscsi_req_init()
531 req->vr_vq = vq; in vioscsi_req_init()
532 req->vr_dma = virtio_dma_alloc(sc->vs_virtio, sizeof (vioscsi_op_t), in vioscsi_req_init()
535 req->vr_vic = virtio_chain_alloc(vq, sleep); in vioscsi_req_init()
536 if ((req->vr_dma == NULL) || (req->vr_vic == NULL)) { in vioscsi_req_init()
539 virtio_chain_data_set(req->vr_vic, req); in vioscsi_req_init()
540 req->vr_req = virtio_dma_va(req->vr_dma, VIOSCSI_REQ_OFFSET); in vioscsi_req_init()
541 req->vr_res = virtio_dma_va(req->vr_dma, VIOSCSI_RES_OFFSET); in vioscsi_req_init()
542 pa = virtio_dma_cookie_pa(req->vr_dma, 0); in vioscsi_req_init()
543 req->vr_req_pa = pa + VIOSCSI_REQ_OFFSET; in vioscsi_req_init()
544 req->vr_res_pa = pa + VIOSCSI_RES_OFFSET; in vioscsi_req_init()
551 vioscsi_request_t *req = pkt->pkt_ha_private; in vioscsi_tran_pkt_destructor() local
553 vioscsi_req_fini(req); in vioscsi_tran_pkt_destructor()
561 vioscsi_request_t *req = pkt->pkt_ha_private; in vioscsi_tran_pkt_constructor() local
563 if (vioscsi_req_init(sc, req, sc->vs_cmd_vq, sleep) != 0) { in vioscsi_tran_pkt_constructor()
564 vioscsi_req_fini(req); in vioscsi_tran_pkt_constructor()
567 req->vr_pkt = pkt; in vioscsi_tran_pkt_constructor()
587 vioscsi_request_t *req = pkt->pkt_ha_private; in vioscsi_tran_teardown_pkt() local
588 virtio_chain_t *vic = req->vr_vic; in vioscsi_tran_teardown_pkt()
696 vioscsi_request_t *req; in vioscsi_ctl_handler() local
698 if ((req = virtio_chain_data(vic)) == NULL) { in vioscsi_ctl_handler()
702 atomic_or_8(&req->vr_done, 1); in vioscsi_ctl_handler()
796 vioscsi_request_t *req; in vioscsi_cmd_handler() local
801 if ((req = virtio_chain_data(vic)) == NULL) { in vioscsi_cmd_handler()
809 virtio_dma_sync(req->vr_dma, DDI_DMA_SYNC_FORKERNEL); in vioscsi_cmd_handler()
810 res = &req->vr_res->cmd; in vioscsi_cmd_handler()
811 pkt = req->vr_pkt; in vioscsi_cmd_handler()
821 if (req->vr_poll) { in vioscsi_cmd_handler()
822 atomic_or_8(&req->vr_done, 1); in vioscsi_cmd_handler()
827 if ((vd = req->vr_dev) != NULL) { in vioscsi_cmd_handler()
830 list_remove(&vd->vd_reqs, req); in vioscsi_cmd_handler()
889 if (req->vr_expired) { in vioscsi_cmd_handler()
913 if (!req->vr_poll) { in vioscsi_cmd_handler()
916 atomic_or_8(&req->vr_done, 1); in vioscsi_cmd_handler()
1003 vioscsi_probe_target(vioscsi_softc_t *sc, vioscsi_request_t *req, in vioscsi_probe_target() argument
1006 struct virtio_scsi_cmd_req *cmd = &req->vr_req->cmd; in vioscsi_probe_target()
1007 struct virtio_scsi_cmd_resp *res = &req->vr_res->cmd; in vioscsi_probe_target()
1012 virtio_chain_clear(req->vr_vic); in vioscsi_probe_target()
1013 if (virtio_chain_append(req->vr_vic, req->vr_req_pa, in vioscsi_probe_target()
1017 if (virtio_chain_append(req->vr_vic, req->vr_res_pa, in vioscsi_probe_target()
1021 req->vr_poll = B_TRUE; in vioscsi_probe_target()
1022 req->vr_start = ddi_get_lbolt(); in vioscsi_probe_target()
1023 req->vr_time = 10; /* seconds */ in vioscsi_probe_target()
1024 req->vr_target = target; in vioscsi_probe_target()
1025 req->vr_lun = 0; in vioscsi_probe_target()
1026 req->vr_task_attr = VIRTIO_SCSI_S_HEAD; in vioscsi_probe_target()
1027 vioscsi_start(sc, req); in vioscsi_probe_target()
1103 vioscsi_request_t req; in vioscsi_discover() local
1105 if (vioscsi_req_init(sc, &req, sc->vs_cmd_vq, KM_SLEEP) != 0) { in vioscsi_discover()
1106 vioscsi_req_fini(&req); in vioscsi_discover()
1111 vioscsi_req_fini(&req); in vioscsi_discover()
1116 switch (vioscsi_probe_target(sc, &req, target)) { in vioscsi_discover()
1122 vioscsi_req_fini(&req); in vioscsi_discover()
1130 vioscsi_req_fini(&req); in vioscsi_discover()
1135 vioscsi_req_fini(&req); in vioscsi_discover()