Lines Matching refs:vscsi
58 struct virtio_scsi *vscsi; member
108 static void virtscsi_complete_cmd(struct virtio_scsi *vscsi, void *buf) in virtscsi_complete_cmd() argument
119 virtscsi_compute_resid(sc, virtio32_to_cpu(vscsi->vdev, resp->resid)); in virtscsi_complete_cmd()
157 WARN_ON(virtio32_to_cpu(vscsi->vdev, resp->sense_len) > in virtscsi_complete_cmd()
162 virtio32_to_cpu(vscsi->vdev, resp->sense_len), in virtscsi_complete_cmd()
171 static void virtscsi_vq_done(struct virtio_scsi *vscsi, in virtscsi_vq_done() argument
173 void (*fn)(struct virtio_scsi *vscsi, void *buf)) in virtscsi_vq_done() argument
184 fn(vscsi, buf); in virtscsi_vq_done()
195 struct virtio_scsi *vscsi = shost_priv(sh); in virtscsi_req_done() local
197 struct virtio_scsi_vq *req_vq = &vscsi->req_vqs[index]; in virtscsi_req_done()
199 virtscsi_vq_done(vscsi, req_vq, virtscsi_complete_cmd); in virtscsi_req_done()
202 static void virtscsi_poll_requests(struct virtio_scsi *vscsi) in virtscsi_poll_requests() argument
206 num_vqs = vscsi->num_queues; in virtscsi_poll_requests()
208 virtscsi_vq_done(vscsi, &vscsi->req_vqs[i], in virtscsi_poll_requests()
212 static void virtscsi_complete_free(struct virtio_scsi *vscsi, void *buf) in virtscsi_complete_free() argument
223 struct virtio_scsi *vscsi = shost_priv(sh); in virtscsi_ctrl_done() local
225 virtscsi_vq_done(vscsi, &vscsi->ctrl_vq, virtscsi_complete_free); in virtscsi_ctrl_done()
230 static int virtscsi_kick_event(struct virtio_scsi *vscsi, in virtscsi_kick_event() argument
240 spin_lock_irqsave(&vscsi->event_vq.vq_lock, flags); in virtscsi_kick_event()
242 err = virtqueue_add_inbuf(vscsi->event_vq.vq, &sg, 1, event_node, in virtscsi_kick_event()
245 virtqueue_kick(vscsi->event_vq.vq); in virtscsi_kick_event()
247 spin_unlock_irqrestore(&vscsi->event_vq.vq_lock, flags); in virtscsi_kick_event()
252 static int virtscsi_kick_event_all(struct virtio_scsi *vscsi) in virtscsi_kick_event_all() argument
257 vscsi->event_list[i].vscsi = vscsi; in virtscsi_kick_event_all()
258 virtscsi_kick_event(vscsi, &vscsi->event_list[i]); in virtscsi_kick_event_all()
264 static void virtscsi_cancel_event_work(struct virtio_scsi *vscsi) in virtscsi_cancel_event_work() argument
269 spin_lock_irq(&vscsi->event_vq.vq_lock); in virtscsi_cancel_event_work()
270 vscsi->stop_events = true; in virtscsi_cancel_event_work()
271 spin_unlock_irq(&vscsi->event_vq.vq_lock); in virtscsi_cancel_event_work()
274 cancel_work_sync(&vscsi->event_list[i].work); in virtscsi_cancel_event_work()
277 static void virtscsi_handle_transport_reset(struct virtio_scsi *vscsi, in virtscsi_handle_transport_reset() argument
281 struct Scsi_Host *shost = virtio_scsi_host(vscsi->vdev); in virtscsi_handle_transport_reset()
285 switch (virtio32_to_cpu(vscsi->vdev, event->reason)) { in virtscsi_handle_transport_reset()
309 static void virtscsi_handle_param_change(struct virtio_scsi *vscsi, in virtscsi_handle_param_change() argument
313 struct Scsi_Host *shost = virtio_scsi_host(vscsi->vdev); in virtscsi_handle_param_change()
316 u8 asc = virtio32_to_cpu(vscsi->vdev, event->reason) & 255; in virtscsi_handle_param_change()
317 u8 ascq = virtio32_to_cpu(vscsi->vdev, event->reason) >> 8; in virtscsi_handle_param_change()
334 static void virtscsi_rescan_hotunplug(struct virtio_scsi *vscsi) in virtscsi_rescan_hotunplug() argument
337 struct Scsi_Host *shost = virtio_scsi_host(vscsi->vdev); in virtscsi_rescan_hotunplug()
376 struct virtio_scsi *vscsi = event_node->vscsi; in virtscsi_handle_event() local
380 cpu_to_virtio32(vscsi->vdev, VIRTIO_SCSI_T_EVENTS_MISSED)) { in virtscsi_handle_event()
381 event->event &= ~cpu_to_virtio32(vscsi->vdev, in virtscsi_handle_event()
383 virtscsi_rescan_hotunplug(vscsi); in virtscsi_handle_event()
384 scsi_scan_host(virtio_scsi_host(vscsi->vdev)); in virtscsi_handle_event()
387 switch (virtio32_to_cpu(vscsi->vdev, event->event)) { in virtscsi_handle_event()
391 virtscsi_handle_transport_reset(vscsi, event); in virtscsi_handle_event()
394 virtscsi_handle_param_change(vscsi, event); in virtscsi_handle_event()
399 virtscsi_kick_event(vscsi, event_node); in virtscsi_handle_event()
402 static void virtscsi_complete_event(struct virtio_scsi *vscsi, void *buf) in virtscsi_complete_event() argument
406 if (!vscsi->stop_events) in virtscsi_complete_event()
413 struct virtio_scsi *vscsi = shost_priv(sh); in virtscsi_event_done() local
415 virtscsi_vq_done(vscsi, &vscsi->event_vq, virtscsi_complete_event); in virtscsi_event_done()
545 static struct virtio_scsi_vq *virtscsi_pick_vq_mq(struct virtio_scsi *vscsi, in virtscsi_pick_vq_mq() argument
551 return &vscsi->req_vqs[hwq]; in virtscsi_pick_vq_mq()
557 struct virtio_scsi *vscsi = shost_priv(shost); in virtscsi_queuecommand() local
558 struct virtio_scsi_vq *req_vq = virtscsi_pick_vq_mq(vscsi, sc); in virtscsi_queuecommand()
578 if (virtio_has_feature(vscsi->vdev, VIRTIO_SCSI_F_T10_PI)) { in virtscsi_queuecommand()
579 virtio_scsi_init_hdr_pi(vscsi->vdev, &cmd->req.cmd_pi, sc); in virtscsi_queuecommand()
585 virtio_scsi_init_hdr(vscsi->vdev, &cmd->req.cmd, sc); in virtscsi_queuecommand()
595 virtscsi_complete_cmd(vscsi, cmd); in virtscsi_queuecommand()
603 static int virtscsi_tmf(struct virtio_scsi *vscsi, struct virtio_scsi_cmd *cmd) in virtscsi_tmf() argument
609 if (virtscsi_add_cmd(&vscsi->ctrl_vq, cmd, in virtscsi_tmf()
628 virtscsi_poll_requests(vscsi); in virtscsi_tmf()
637 struct virtio_scsi *vscsi = shost_priv(sc->device->host); in virtscsi_device_reset() local
648 .subtype = cpu_to_virtio32(vscsi->vdev, in virtscsi_device_reset()
655 return virtscsi_tmf(vscsi, cmd); in virtscsi_device_reset()
695 struct virtio_scsi *vscsi = shost_priv(sc->device->host); in virtscsi_abort() local
711 .tag = cpu_to_virtio64(vscsi->vdev, (unsigned long)sc), in virtscsi_abort()
713 return virtscsi_tmf(vscsi, cmd); in virtscsi_abort()
718 struct virtio_scsi *vscsi = shost_priv(shost); in virtscsi_map_queues() local
721 return blk_mq_virtio_map_queues(qmap, vscsi->vdev, 2); in virtscsi_map_queues()
726 struct virtio_scsi *vscsi = shost_priv(shost); in virtscsi_commit_rqs() local
728 virtscsi_kick_vq(&vscsi->req_vqs[hwq]); in virtscsi_commit_rqs()
788 struct virtio_scsi *vscsi) in virtscsi_init() argument
798 num_vqs = vscsi->num_queues + VIRTIO_SCSI_VQ_BASE; in virtscsi_init()
823 virtscsi_init_vq(&vscsi->ctrl_vq, vqs[0]); in virtscsi_init()
824 virtscsi_init_vq(&vscsi->event_vq, vqs[1]); in virtscsi_init()
826 virtscsi_init_vq(&vscsi->req_vqs[i - VIRTIO_SCSI_VQ_BASE], in virtscsi_init()
846 struct virtio_scsi *vscsi; in virtscsi_probe() local
865 struct_size(vscsi, req_vqs, num_queues)); in virtscsi_probe()
871 vscsi = shost_priv(shost); in virtscsi_probe()
872 vscsi->vdev = vdev; in virtscsi_probe()
873 vscsi->num_queues = num_queues; in virtscsi_probe()
876 err = virtscsi_init(vdev, vscsi); in virtscsi_probe()
880 shost->can_queue = virtqueue_get_vring_size(vscsi->req_vqs[0].vq); in virtscsi_probe()
915 virtscsi_kick_event_all(vscsi); in virtscsi_probe()
930 struct virtio_scsi *vscsi = shost_priv(shost); in virtscsi_remove() local
933 virtscsi_cancel_event_work(vscsi); in virtscsi_remove()
950 struct virtio_scsi *vscsi = shost_priv(sh); in virtscsi_restore() local
953 err = virtscsi_init(vdev, vscsi); in virtscsi_restore()
960 virtscsi_kick_event_all(vscsi); in virtscsi_restore()