diff options
author | Michael S. Tsirkin <mst@redhat.com> | 2014-11-23 10:28:57 -0500 |
---|---|---|
committer | Michael S. Tsirkin <mst@redhat.com> | 2014-12-09 05:05:31 -0500 |
commit | d75dff39dfb86b0b8925f10b1f13fc353ae9f1b0 (patch) | |
tree | 6060b1abd3873a90f20cb6974fbfb01d3d4221c2 /drivers/scsi | |
parent | 6ae7feb316d656b6b9b182dc6caa5526f0edce51 (diff) |
virtio_scsi: v1.0 support
Note: for consistency, and to avoid sparse errors,
convert all fields, even those no longer in use
for virtio v1.0.
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Acked-by: Paolo Bonzini <pbonzini@redhat.com>
Diffstat (limited to 'drivers/scsi')
-rw-r--r-- | drivers/scsi/virtio_scsi.c | 51 |
1 files changed, 32 insertions, 19 deletions
diff --git a/drivers/scsi/virtio_scsi.c b/drivers/scsi/virtio_scsi.c index b83846fc7859..d9ec80698d63 100644 --- a/drivers/scsi/virtio_scsi.c +++ b/drivers/scsi/virtio_scsi.c | |||
@@ -158,7 +158,7 @@ static void virtscsi_complete_cmd(struct virtio_scsi *vscsi, void *buf) | |||
158 | sc, resp->response, resp->status, resp->sense_len); | 158 | sc, resp->response, resp->status, resp->sense_len); |
159 | 159 | ||
160 | sc->result = resp->status; | 160 | sc->result = resp->status; |
161 | virtscsi_compute_resid(sc, resp->resid); | 161 | virtscsi_compute_resid(sc, virtio32_to_cpu(vscsi->vdev, resp->resid)); |
162 | switch (resp->response) { | 162 | switch (resp->response) { |
163 | case VIRTIO_SCSI_S_OK: | 163 | case VIRTIO_SCSI_S_OK: |
164 | set_host_byte(sc, DID_OK); | 164 | set_host_byte(sc, DID_OK); |
@@ -196,10 +196,13 @@ static void virtscsi_complete_cmd(struct virtio_scsi *vscsi, void *buf) | |||
196 | break; | 196 | break; |
197 | } | 197 | } |
198 | 198 | ||
199 | WARN_ON(resp->sense_len > VIRTIO_SCSI_SENSE_SIZE); | 199 | WARN_ON(virtio32_to_cpu(vscsi->vdev, resp->sense_len) > |
200 | VIRTIO_SCSI_SENSE_SIZE); | ||
200 | if (sc->sense_buffer) { | 201 | if (sc->sense_buffer) { |
201 | memcpy(sc->sense_buffer, resp->sense, | 202 | memcpy(sc->sense_buffer, resp->sense, |
202 | min_t(u32, resp->sense_len, VIRTIO_SCSI_SENSE_SIZE)); | 203 | min_t(u32, |
204 | virtio32_to_cpu(vscsi->vdev, resp->sense_len), | ||
205 | VIRTIO_SCSI_SENSE_SIZE)); | ||
203 | if (resp->sense_len) | 206 | if (resp->sense_len) |
204 | set_driver_byte(sc, DRIVER_SENSE); | 207 | set_driver_byte(sc, DRIVER_SENSE); |
205 | } | 208 | } |
@@ -323,7 +326,7 @@ static void virtscsi_handle_transport_reset(struct virtio_scsi *vscsi, | |||
323 | unsigned int target = event->lun[1]; | 326 | unsigned int target = event->lun[1]; |
324 | unsigned int lun = (event->lun[2] << 8) | event->lun[3]; | 327 | unsigned int lun = (event->lun[2] << 8) | event->lun[3]; |
325 | 328 | ||
326 | switch (event->reason) { | 329 | switch (virtio32_to_cpu(vscsi->vdev, event->reason)) { |
327 | case VIRTIO_SCSI_EVT_RESET_RESCAN: | 330 | case VIRTIO_SCSI_EVT_RESET_RESCAN: |
328 | scsi_add_device(shost, 0, target, lun); | 331 | scsi_add_device(shost, 0, target, lun); |
329 | break; | 332 | break; |
@@ -349,8 +352,8 @@ static void virtscsi_handle_param_change(struct virtio_scsi *vscsi, | |||
349 | struct Scsi_Host *shost = virtio_scsi_host(vscsi->vdev); | 352 | struct Scsi_Host *shost = virtio_scsi_host(vscsi->vdev); |
350 | unsigned int target = event->lun[1]; | 353 | unsigned int target = event->lun[1]; |
351 | unsigned int lun = (event->lun[2] << 8) | event->lun[3]; | 354 | unsigned int lun = (event->lun[2] << 8) | event->lun[3]; |
352 | u8 asc = event->reason & 255; | 355 | u8 asc = virtio32_to_cpu(vscsi->vdev, event->reason) & 255; |
353 | u8 ascq = event->reason >> 8; | 356 | u8 ascq = virtio32_to_cpu(vscsi->vdev, event->reason) >> 8; |
354 | 357 | ||
355 | sdev = scsi_device_lookup(shost, 0, target, lun); | 358 | sdev = scsi_device_lookup(shost, 0, target, lun); |
356 | if (!sdev) { | 359 | if (!sdev) { |
@@ -374,12 +377,14 @@ static void virtscsi_handle_event(struct work_struct *work) | |||
374 | struct virtio_scsi *vscsi = event_node->vscsi; | 377 | struct virtio_scsi *vscsi = event_node->vscsi; |
375 | struct virtio_scsi_event *event = &event_node->event; | 378 | struct virtio_scsi_event *event = &event_node->event; |
376 | 379 | ||
377 | if (event->event & VIRTIO_SCSI_T_EVENTS_MISSED) { | 380 | if (event->event & |
378 | event->event &= ~VIRTIO_SCSI_T_EVENTS_MISSED; | 381 | cpu_to_virtio32(vscsi->vdev, VIRTIO_SCSI_T_EVENTS_MISSED)) { |
382 | event->event &= ~cpu_to_virtio32(vscsi->vdev, | ||
383 | VIRTIO_SCSI_T_EVENTS_MISSED); | ||
379 | scsi_scan_host(virtio_scsi_host(vscsi->vdev)); | 384 | scsi_scan_host(virtio_scsi_host(vscsi->vdev)); |
380 | } | 385 | } |
381 | 386 | ||
382 | switch (event->event) { | 387 | switch (virtio32_to_cpu(vscsi->vdev, event->event)) { |
383 | case VIRTIO_SCSI_T_NO_EVENT: | 388 | case VIRTIO_SCSI_T_NO_EVENT: |
384 | break; | 389 | break; |
385 | case VIRTIO_SCSI_T_TRANSPORT_RESET: | 390 | case VIRTIO_SCSI_T_TRANSPORT_RESET: |
@@ -482,26 +487,28 @@ static int virtscsi_kick_cmd(struct virtio_scsi_vq *vq, | |||
482 | return err; | 487 | return err; |
483 | } | 488 | } |
484 | 489 | ||
485 | static void virtio_scsi_init_hdr(struct virtio_scsi_cmd_req *cmd, | 490 | static void virtio_scsi_init_hdr(struct virtio_device *vdev, |
491 | struct virtio_scsi_cmd_req *cmd, | ||
486 | struct scsi_cmnd *sc) | 492 | struct scsi_cmnd *sc) |
487 | { | 493 | { |
488 | cmd->lun[0] = 1; | 494 | cmd->lun[0] = 1; |
489 | cmd->lun[1] = sc->device->id; | 495 | cmd->lun[1] = sc->device->id; |
490 | cmd->lun[2] = (sc->device->lun >> 8) | 0x40; | 496 | cmd->lun[2] = (sc->device->lun >> 8) | 0x40; |
491 | cmd->lun[3] = sc->device->lun & 0xff; | 497 | cmd->lun[3] = sc->device->lun & 0xff; |
492 | cmd->tag = (unsigned long)sc; | 498 | cmd->tag = cpu_to_virtio64(vdev, (unsigned long)sc); |
493 | cmd->task_attr = VIRTIO_SCSI_S_SIMPLE; | 499 | cmd->task_attr = VIRTIO_SCSI_S_SIMPLE; |
494 | cmd->prio = 0; | 500 | cmd->prio = 0; |
495 | cmd->crn = 0; | 501 | cmd->crn = 0; |
496 | } | 502 | } |
497 | 503 | ||
498 | static void virtio_scsi_init_hdr_pi(struct virtio_scsi_cmd_req_pi *cmd_pi, | 504 | static void virtio_scsi_init_hdr_pi(struct virtio_device *vdev, |
505 | struct virtio_scsi_cmd_req_pi *cmd_pi, | ||
499 | struct scsi_cmnd *sc) | 506 | struct scsi_cmnd *sc) |
500 | { | 507 | { |
501 | struct request *rq = sc->request; | 508 | struct request *rq = sc->request; |
502 | struct blk_integrity *bi; | 509 | struct blk_integrity *bi; |
503 | 510 | ||
504 | virtio_scsi_init_hdr((struct virtio_scsi_cmd_req *)cmd_pi, sc); | 511 | virtio_scsi_init_hdr(vdev, (struct virtio_scsi_cmd_req *)cmd_pi, sc); |
505 | 512 | ||
506 | if (!rq || !scsi_prot_sg_count(sc)) | 513 | if (!rq || !scsi_prot_sg_count(sc)) |
507 | return; | 514 | return; |
@@ -509,9 +516,13 @@ static void virtio_scsi_init_hdr_pi(struct virtio_scsi_cmd_req_pi *cmd_pi, | |||
509 | bi = blk_get_integrity(rq->rq_disk); | 516 | bi = blk_get_integrity(rq->rq_disk); |
510 | 517 | ||
511 | if (sc->sc_data_direction == DMA_TO_DEVICE) | 518 | if (sc->sc_data_direction == DMA_TO_DEVICE) |
512 | cmd_pi->pi_bytesout = blk_rq_sectors(rq) * bi->tuple_size; | 519 | cmd_pi->pi_bytesout = cpu_to_virtio32(vdev, |
520 | blk_rq_sectors(rq) * | ||
521 | bi->tuple_size); | ||
513 | else if (sc->sc_data_direction == DMA_FROM_DEVICE) | 522 | else if (sc->sc_data_direction == DMA_FROM_DEVICE) |
514 | cmd_pi->pi_bytesin = blk_rq_sectors(rq) * bi->tuple_size; | 523 | cmd_pi->pi_bytesin = cpu_to_virtio32(vdev, |
524 | blk_rq_sectors(rq) * | ||
525 | bi->tuple_size); | ||
515 | } | 526 | } |
516 | 527 | ||
517 | static int virtscsi_queuecommand(struct virtio_scsi *vscsi, | 528 | static int virtscsi_queuecommand(struct virtio_scsi *vscsi, |
@@ -536,11 +547,11 @@ static int virtscsi_queuecommand(struct virtio_scsi *vscsi, | |||
536 | BUG_ON(sc->cmd_len > VIRTIO_SCSI_CDB_SIZE); | 547 | BUG_ON(sc->cmd_len > VIRTIO_SCSI_CDB_SIZE); |
537 | 548 | ||
538 | if (virtio_has_feature(vscsi->vdev, VIRTIO_SCSI_F_T10_PI)) { | 549 | if (virtio_has_feature(vscsi->vdev, VIRTIO_SCSI_F_T10_PI)) { |
539 | virtio_scsi_init_hdr_pi(&cmd->req.cmd_pi, sc); | 550 | virtio_scsi_init_hdr_pi(vscsi->vdev, &cmd->req.cmd_pi, sc); |
540 | memcpy(cmd->req.cmd_pi.cdb, sc->cmnd, sc->cmd_len); | 551 | memcpy(cmd->req.cmd_pi.cdb, sc->cmnd, sc->cmd_len); |
541 | req_size = sizeof(cmd->req.cmd_pi); | 552 | req_size = sizeof(cmd->req.cmd_pi); |
542 | } else { | 553 | } else { |
543 | virtio_scsi_init_hdr(&cmd->req.cmd, sc); | 554 | virtio_scsi_init_hdr(vscsi->vdev, &cmd->req.cmd, sc); |
544 | memcpy(cmd->req.cmd.cdb, sc->cmnd, sc->cmd_len); | 555 | memcpy(cmd->req.cmd.cdb, sc->cmnd, sc->cmd_len); |
545 | req_size = sizeof(cmd->req.cmd); | 556 | req_size = sizeof(cmd->req.cmd); |
546 | } | 557 | } |
@@ -655,7 +666,8 @@ static int virtscsi_device_reset(struct scsi_cmnd *sc) | |||
655 | cmd->sc = sc; | 666 | cmd->sc = sc; |
656 | cmd->req.tmf = (struct virtio_scsi_ctrl_tmf_req){ | 667 | cmd->req.tmf = (struct virtio_scsi_ctrl_tmf_req){ |
657 | .type = VIRTIO_SCSI_T_TMF, | 668 | .type = VIRTIO_SCSI_T_TMF, |
658 | .subtype = VIRTIO_SCSI_T_TMF_LOGICAL_UNIT_RESET, | 669 | .subtype = cpu_to_virtio32(vscsi->vdev, |
670 | VIRTIO_SCSI_T_TMF_LOGICAL_UNIT_RESET), | ||
659 | .lun[0] = 1, | 671 | .lun[0] = 1, |
660 | .lun[1] = sc->device->id, | 672 | .lun[1] = sc->device->id, |
661 | .lun[2] = (sc->device->lun >> 8) | 0x40, | 673 | .lun[2] = (sc->device->lun >> 8) | 0x40, |
@@ -713,7 +725,7 @@ static int virtscsi_abort(struct scsi_cmnd *sc) | |||
713 | .lun[1] = sc->device->id, | 725 | .lun[1] = sc->device->id, |
714 | .lun[2] = (sc->device->lun >> 8) | 0x40, | 726 | .lun[2] = (sc->device->lun >> 8) | 0x40, |
715 | .lun[3] = sc->device->lun & 0xff, | 727 | .lun[3] = sc->device->lun & 0xff, |
716 | .tag = (unsigned long)sc, | 728 | .tag = cpu_to_virtio64(vscsi->vdev, (unsigned long)sc), |
717 | }; | 729 | }; |
718 | return virtscsi_tmf(vscsi, cmd); | 730 | return virtscsi_tmf(vscsi, cmd); |
719 | } | 731 | } |
@@ -1073,6 +1085,7 @@ static unsigned int features[] = { | |||
1073 | VIRTIO_SCSI_F_HOTPLUG, | 1085 | VIRTIO_SCSI_F_HOTPLUG, |
1074 | VIRTIO_SCSI_F_CHANGE, | 1086 | VIRTIO_SCSI_F_CHANGE, |
1075 | VIRTIO_SCSI_F_T10_PI, | 1087 | VIRTIO_SCSI_F_T10_PI, |
1088 | VIRTIO_F_VERSION_1, | ||
1076 | }; | 1089 | }; |
1077 | 1090 | ||
1078 | static struct virtio_driver virtio_scsi_driver = { | 1091 | static struct virtio_driver virtio_scsi_driver = { |