Lines Matching refs:vscsi
59 struct virtio_scsi *vscsi;
109 static void virtscsi_complete_cmd(struct virtio_scsi *vscsi, void *buf)
120 virtscsi_compute_resid(sc, virtio32_to_cpu(vscsi->vdev, resp->resid));
158 WARN_ON(virtio32_to_cpu(vscsi->vdev, resp->sense_len) >
163 virtio32_to_cpu(vscsi->vdev, resp->sense_len),
170 static void virtscsi_vq_done(struct virtio_scsi *vscsi,
172 void (*fn)(struct virtio_scsi *vscsi, void *buf))
183 fn(vscsi, buf);
194 struct virtio_scsi *vscsi = shost_priv(sh);
196 struct virtio_scsi_vq *req_vq = &vscsi->req_vqs[index];
198 virtscsi_vq_done(vscsi, req_vq, virtscsi_complete_cmd);
201 static void virtscsi_poll_requests(struct virtio_scsi *vscsi)
205 num_vqs = vscsi->num_queues;
207 virtscsi_vq_done(vscsi, &vscsi->req_vqs[i],
211 static void virtscsi_complete_free(struct virtio_scsi *vscsi, void *buf)
222 struct virtio_scsi *vscsi = shost_priv(sh);
224 virtscsi_vq_done(vscsi, &vscsi->ctrl_vq, virtscsi_complete_free);
229 static int virtscsi_kick_event(struct virtio_scsi *vscsi,
239 spin_lock_irqsave(&vscsi->event_vq.vq_lock, flags);
241 err = virtqueue_add_inbuf(vscsi->event_vq.vq, &sg, 1, event_node,
244 virtqueue_kick(vscsi->event_vq.vq);
246 spin_unlock_irqrestore(&vscsi->event_vq.vq_lock, flags);
251 static int virtscsi_kick_event_all(struct virtio_scsi *vscsi)
256 vscsi->event_list[i].vscsi = vscsi;
257 virtscsi_kick_event(vscsi, &vscsi->event_list[i]);
263 static void virtscsi_cancel_event_work(struct virtio_scsi *vscsi)
268 spin_lock_irq(&vscsi->event_vq.vq_lock);
269 vscsi->stop_events = true;
270 spin_unlock_irq(&vscsi->event_vq.vq_lock);
273 cancel_work_sync(&vscsi->event_list[i].work);
276 static void virtscsi_handle_transport_reset(struct virtio_scsi *vscsi,
280 struct Scsi_Host *shost = virtio_scsi_host(vscsi->vdev);
284 switch (virtio32_to_cpu(vscsi->vdev, event->reason)) {
308 static void virtscsi_handle_param_change(struct virtio_scsi *vscsi,
312 struct Scsi_Host *shost = virtio_scsi_host(vscsi->vdev);
315 u8 asc = virtio32_to_cpu(vscsi->vdev, event->reason) & 255;
316 u8 ascq = virtio32_to_cpu(vscsi->vdev, event->reason) >> 8;
333 static int virtscsi_rescan_hotunplug(struct virtio_scsi *vscsi)
336 struct Scsi_Host *shost = virtio_scsi_host(vscsi->vdev);
379 struct virtio_scsi *vscsi = event_node->vscsi;
383 cpu_to_virtio32(vscsi->vdev, VIRTIO_SCSI_T_EVENTS_MISSED)) {
386 event->event &= ~cpu_to_virtio32(vscsi->vdev,
388 ret = virtscsi_rescan_hotunplug(vscsi);
391 scsi_scan_host(virtio_scsi_host(vscsi->vdev));
394 switch (virtio32_to_cpu(vscsi->vdev, event->event)) {
398 virtscsi_handle_transport_reset(vscsi, event);
401 virtscsi_handle_param_change(vscsi, event);
406 virtscsi_kick_event(vscsi, event_node);
409 static void virtscsi_complete_event(struct virtio_scsi *vscsi, void *buf)
413 if (!vscsi->stop_events)
420 struct virtio_scsi *vscsi = shost_priv(sh);
422 virtscsi_vq_done(vscsi, &vscsi->event_vq, virtscsi_complete_event);
552 static struct virtio_scsi_vq *virtscsi_pick_vq_mq(struct virtio_scsi *vscsi,
558 return &vscsi->req_vqs[hwq];
564 struct virtio_scsi *vscsi = shost_priv(shost);
565 struct virtio_scsi_vq *req_vq = virtscsi_pick_vq_mq(vscsi, sc);
585 if (virtio_has_feature(vscsi->vdev, VIRTIO_SCSI_F_T10_PI)) {
586 virtio_scsi_init_hdr_pi(vscsi->vdev, &cmd->req.cmd_pi, sc);
592 virtio_scsi_init_hdr(vscsi->vdev, &cmd->req.cmd, sc);
602 virtscsi_complete_cmd(vscsi, cmd);
610 static int virtscsi_tmf(struct virtio_scsi *vscsi, struct virtio_scsi_cmd *cmd)
616 if (virtscsi_add_cmd(&vscsi->ctrl_vq, cmd,
634 virtscsi_poll_requests(vscsi);
643 struct virtio_scsi *vscsi = shost_priv(sc->device->host);
654 .subtype = cpu_to_virtio32(vscsi->vdev,
661 return virtscsi_tmf(vscsi, cmd);
701 struct virtio_scsi *vscsi = shost_priv(sc->device->host);
717 .tag = cpu_to_virtio64(vscsi->vdev, (unsigned long)sc),
719 return virtscsi_tmf(vscsi, cmd);
724 struct virtio_scsi *vscsi = shost_priv(shost);
727 blk_mq_virtio_map_queues(qmap, vscsi->vdev, 2);
732 struct virtio_scsi *vscsi = shost_priv(shost);
734 virtscsi_kick_vq(&vscsi->req_vqs[hwq]);
794 struct virtio_scsi *vscsi)
804 num_vqs = vscsi->num_queues + VIRTIO_SCSI_VQ_BASE;
829 virtscsi_init_vq(&vscsi->ctrl_vq, vqs[0]);
830 virtscsi_init_vq(&vscsi->event_vq, vqs[1]);
832 virtscsi_init_vq(&vscsi->req_vqs[i - VIRTIO_SCSI_VQ_BASE],
852 struct virtio_scsi *vscsi;
871 struct_size(vscsi, req_vqs, num_queues));
877 vscsi = shost_priv(shost);
878 vscsi->vdev = vdev;
879 vscsi->num_queues = num_queues;
882 err = virtscsi_init(vdev, vscsi);
886 shost->can_queue = virtqueue_get_vring_size(vscsi->req_vqs[0].vq);
921 virtscsi_kick_event_all(vscsi);
936 struct virtio_scsi *vscsi = shost_priv(shost);
939 virtscsi_cancel_event_work(vscsi);
956 struct virtio_scsi *vscsi = shost_priv(sh);
959 err = virtscsi_init(vdev, vscsi);
966 virtscsi_kick_event_all(vscsi);