Lines Matching refs:vscsi

64 	struct virtio_scsi *vscsi;  member
115 static void virtscsi_complete_cmd(struct virtio_scsi *vscsi, void *buf) in virtscsi_complete_cmd() argument
126 virtscsi_compute_resid(sc, virtio32_to_cpu(vscsi->vdev, resp->resid)); in virtscsi_complete_cmd()
164 WARN_ON(virtio32_to_cpu(vscsi->vdev, resp->sense_len) > in virtscsi_complete_cmd()
169 virtio32_to_cpu(vscsi->vdev, resp->sense_len), in virtscsi_complete_cmd()
176 static void virtscsi_vq_done(struct virtio_scsi *vscsi, in virtscsi_vq_done() argument
178 void (*fn)(struct virtio_scsi *vscsi, void *buf)) in virtscsi_vq_done() argument
189 fn(vscsi, buf); in virtscsi_vq_done()
198 struct virtio_scsi *vscsi = shost_priv(sh); in virtscsi_req_done() local
200 struct virtio_scsi_vq *req_vq = &vscsi->req_vqs[index]; in virtscsi_req_done()
202 virtscsi_vq_done(vscsi, req_vq, virtscsi_complete_cmd); in virtscsi_req_done()
205 static void virtscsi_poll_requests(struct virtio_scsi *vscsi) in virtscsi_poll_requests() argument
209 num_vqs = vscsi->num_queues; in virtscsi_poll_requests()
211 virtscsi_vq_done(vscsi, &vscsi->req_vqs[i], in virtscsi_poll_requests()
215 static void virtscsi_complete_free(struct virtio_scsi *vscsi, void *buf) in virtscsi_complete_free() argument
226 struct virtio_scsi *vscsi = shost_priv(sh); in virtscsi_ctrl_done() local
228 virtscsi_vq_done(vscsi, &vscsi->ctrl_vq, virtscsi_complete_free); in virtscsi_ctrl_done()
233 static int virtscsi_kick_event(struct virtio_scsi *vscsi, in virtscsi_kick_event() argument
243 spin_lock_irqsave(&vscsi->event_vq.vq_lock, flags); in virtscsi_kick_event()
245 err = virtqueue_add_inbuf(vscsi->event_vq.vq, &sg, 1, event_node, in virtscsi_kick_event()
248 virtqueue_kick(vscsi->event_vq.vq); in virtscsi_kick_event()
250 spin_unlock_irqrestore(&vscsi->event_vq.vq_lock, flags); in virtscsi_kick_event()
255 static int virtscsi_kick_event_all(struct virtio_scsi *vscsi) in virtscsi_kick_event_all() argument
260 vscsi->event_list[i].vscsi = vscsi; in virtscsi_kick_event_all()
261 virtscsi_kick_event(vscsi, &vscsi->event_list[i]); in virtscsi_kick_event_all()
267 static void virtscsi_cancel_event_work(struct virtio_scsi *vscsi) in virtscsi_cancel_event_work() argument
272 spin_lock_irq(&vscsi->event_vq.vq_lock); in virtscsi_cancel_event_work()
273 vscsi->stop_events = true; in virtscsi_cancel_event_work()
274 spin_unlock_irq(&vscsi->event_vq.vq_lock); in virtscsi_cancel_event_work()
277 cancel_work_sync(&vscsi->event_list[i].work); in virtscsi_cancel_event_work()
280 static void virtscsi_handle_transport_reset(struct virtio_scsi *vscsi, in virtscsi_handle_transport_reset() argument
284 struct Scsi_Host *shost = virtio_scsi_host(vscsi->vdev); in virtscsi_handle_transport_reset()
288 switch (virtio32_to_cpu(vscsi->vdev, event->reason)) { in virtscsi_handle_transport_reset()
312 static void virtscsi_handle_param_change(struct virtio_scsi *vscsi, in virtscsi_handle_param_change() argument
316 struct Scsi_Host *shost = virtio_scsi_host(vscsi->vdev); in virtscsi_handle_param_change()
319 u8 asc = virtio32_to_cpu(vscsi->vdev, event->reason) & 255; in virtscsi_handle_param_change()
320 u8 ascq = virtio32_to_cpu(vscsi->vdev, event->reason) >> 8; in virtscsi_handle_param_change()
337 static int virtscsi_rescan_hotunplug(struct virtio_scsi *vscsi) in virtscsi_rescan_hotunplug() argument
340 struct Scsi_Host *shost = virtio_scsi_host(vscsi->vdev); in virtscsi_rescan_hotunplug()
383 struct virtio_scsi *vscsi = event_node->vscsi; in virtscsi_handle_event() local
387 cpu_to_virtio32(vscsi->vdev, VIRTIO_SCSI_T_EVENTS_MISSED)) { in virtscsi_handle_event()
390 event->event &= ~cpu_to_virtio32(vscsi->vdev, in virtscsi_handle_event()
392 ret = virtscsi_rescan_hotunplug(vscsi); in virtscsi_handle_event()
395 scsi_scan_host(virtio_scsi_host(vscsi->vdev)); in virtscsi_handle_event()
398 switch (virtio32_to_cpu(vscsi->vdev, event->event)) { in virtscsi_handle_event()
402 virtscsi_handle_transport_reset(vscsi, event); in virtscsi_handle_event()
405 virtscsi_handle_param_change(vscsi, event); in virtscsi_handle_event()
410 virtscsi_kick_event(vscsi, event_node); in virtscsi_handle_event()
413 static void virtscsi_complete_event(struct virtio_scsi *vscsi, void *buf) in virtscsi_complete_event() argument
417 if (!vscsi->stop_events) in virtscsi_complete_event()
424 struct virtio_scsi *vscsi = shost_priv(sh); in virtscsi_event_done() local
426 virtscsi_vq_done(vscsi, &vscsi->event_vq, virtscsi_complete_event); in virtscsi_event_done()
556 static struct virtio_scsi_vq *virtscsi_pick_vq_mq(struct virtio_scsi *vscsi, in virtscsi_pick_vq_mq() argument
562 return &vscsi->req_vqs[hwq]; in virtscsi_pick_vq_mq()
568 struct virtio_scsi *vscsi = shost_priv(shost); in virtscsi_queuecommand() local
569 struct virtio_scsi_vq *req_vq = virtscsi_pick_vq_mq(vscsi, sc); in virtscsi_queuecommand()
589 if (virtio_has_feature(vscsi->vdev, VIRTIO_SCSI_F_T10_PI)) { in virtscsi_queuecommand()
590 virtio_scsi_init_hdr_pi(vscsi->vdev, &cmd->req.cmd_pi, sc); in virtscsi_queuecommand()
596 virtio_scsi_init_hdr(vscsi->vdev, &cmd->req.cmd, sc); in virtscsi_queuecommand()
606 virtscsi_complete_cmd(vscsi, cmd); in virtscsi_queuecommand()
614 static int virtscsi_tmf(struct virtio_scsi *vscsi, struct virtio_scsi_cmd *cmd) in virtscsi_tmf() argument
620 if (virtscsi_add_cmd(&vscsi->ctrl_vq, cmd, in virtscsi_tmf()
638 virtscsi_poll_requests(vscsi); in virtscsi_tmf()
647 struct virtio_scsi *vscsi = shost_priv(sc->device->host); in virtscsi_device_reset() local
658 .subtype = cpu_to_virtio32(vscsi->vdev, in virtscsi_device_reset()
665 return virtscsi_tmf(vscsi, cmd); in virtscsi_device_reset()
705 struct virtio_scsi *vscsi = shost_priv(sc->device->host); in virtscsi_abort() local
721 .tag = cpu_to_virtio64(vscsi->vdev, (unsigned long)sc), in virtscsi_abort()
723 return virtscsi_tmf(vscsi, cmd); in virtscsi_abort()
728 struct virtio_scsi *vscsi = shost_priv(shost); in virtscsi_map_queues() local
734 map->nr_queues = vscsi->io_queues[i]; in virtscsi_map_queues()
749 blk_mq_virtio_map_queues(map, vscsi->vdev, 2); in virtscsi_map_queues()
755 struct virtio_scsi *vscsi = shost_priv(shost); in virtscsi_mq_poll() local
756 struct virtio_scsi_vq *virtscsi_vq = &vscsi->req_vqs[queue_num]; in virtscsi_mq_poll()
765 virtscsi_complete_cmd(vscsi, buf); in virtscsi_mq_poll()
776 struct virtio_scsi *vscsi = shost_priv(shost); in virtscsi_commit_rqs() local
778 virtscsi_kick_vq(&vscsi->req_vqs[hwq]); in virtscsi_commit_rqs()
839 struct virtio_scsi *vscsi) in virtscsi_init() argument
848 num_req_vqs = vscsi->num_queues; in virtscsi_init()
860 vscsi->io_queues[HCTX_TYPE_DEFAULT] = num_req_vqs - num_poll_vqs; in virtscsi_init()
861 vscsi->io_queues[HCTX_TYPE_READ] = 0; in virtscsi_init()
862 vscsi->io_queues[HCTX_TYPE_POLL] = num_poll_vqs; in virtscsi_init()
865 vscsi->io_queues[HCTX_TYPE_DEFAULT], in virtscsi_init()
866 vscsi->io_queues[HCTX_TYPE_READ], in virtscsi_init()
867 vscsi->io_queues[HCTX_TYPE_POLL]); in virtscsi_init()
886 virtscsi_init_vq(&vscsi->ctrl_vq, vqs[0]); in virtscsi_init()
887 virtscsi_init_vq(&vscsi->event_vq, vqs[1]); in virtscsi_init()
889 virtscsi_init_vq(&vscsi->req_vqs[i - VIRTIO_SCSI_VQ_BASE], in virtscsi_init()
908 struct virtio_scsi *vscsi; in virtscsi_probe() local
927 struct_size(vscsi, req_vqs, num_queues)); in virtscsi_probe()
934 vscsi = shost_priv(shost); in virtscsi_probe()
935 vscsi->vdev = vdev; in virtscsi_probe()
936 vscsi->num_queues = num_queues; in virtscsi_probe()
939 err = virtscsi_init(vdev, vscsi); in virtscsi_probe()
943 if (vscsi->io_queues[HCTX_TYPE_POLL]) in virtscsi_probe()
946 shost->can_queue = virtqueue_get_vring_size(vscsi->req_vqs[0].vq); in virtscsi_probe()
981 virtscsi_kick_event_all(vscsi); in virtscsi_probe()
996 struct virtio_scsi *vscsi = shost_priv(shost); in virtscsi_remove() local
999 virtscsi_cancel_event_work(vscsi); in virtscsi_remove()
1016 struct virtio_scsi *vscsi = shost_priv(sh); in virtscsi_restore() local
1019 err = virtscsi_init(vdev, vscsi); in virtscsi_restore()
1026 virtscsi_kick_event_all(vscsi); in virtscsi_restore()