aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi
diff options
context:
space:
mode:
authorMichael S. Tsirkin <mst@redhat.com>2014-11-23 10:28:57 -0500
committerMichael S. Tsirkin <mst@redhat.com>2014-12-09 05:05:31 -0500
commitd75dff39dfb86b0b8925f10b1f13fc353ae9f1b0 (patch)
tree6060b1abd3873a90f20cb6974fbfb01d3d4221c2 /drivers/scsi
parent6ae7feb316d656b6b9b182dc6caa5526f0edce51 (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.c51
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
485static void virtio_scsi_init_hdr(struct virtio_scsi_cmd_req *cmd, 490static 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
498static void virtio_scsi_init_hdr_pi(struct virtio_scsi_cmd_req_pi *cmd_pi, 504static 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
517static int virtscsi_queuecommand(struct virtio_scsi *vscsi, 528static 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
1078static struct virtio_driver virtio_scsi_driver = { 1091static struct virtio_driver virtio_scsi_driver = {