Lines Matching refs:vscsi

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