aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/virtio
diff options
context:
space:
mode:
authorKonstantin Belousov <kib@FreeBSD.org>2013-02-12 16:57:20 +0000
committerKonstantin Belousov <kib@FreeBSD.org>2013-02-12 16:57:20 +0000
commitdd0b4fb6d50631c140e800bdfac48d02e7e4c875 (patch)
treee550f2c754f1edf951a8b93963ebcfc4fa0d20ce /sys/dev/virtio
parent44c169253de5caec5de2a397c522ad3e359f86e6 (diff)
Notes
Diffstat (limited to 'sys/dev/virtio')
-rw-r--r--sys/dev/virtio/scsi/virtio_scsi.c39
1 files changed, 21 insertions, 18 deletions
diff --git a/sys/dev/virtio/scsi/virtio_scsi.c b/sys/dev/virtio/scsi/virtio_scsi.c
index 86684ba97794..7ebce0985e10 100644
--- a/sys/dev/virtio/scsi/virtio_scsi.c
+++ b/sys/dev/virtio/scsi/virtio_scsi.c
@@ -961,28 +961,31 @@ vtscsi_sg_append_scsi_buf(struct vtscsi_softc *sc, struct sglist *sg,
ccbh = &csio->ccb_h;
error = 0;
- if ((ccbh->flags & CAM_SCATTER_VALID) == 0) {
-
- if ((ccbh->flags & CAM_DATA_PHYS) == 0)
+ switch ((ccbh->flags & CAM_DATA_MASK)) {
+ case CAM_DATA_VADDR:
+ error = sglist_append(sg, csio->data_ptr, csio->dxfer_len);
+ break;
+ case CAM_DATA_PADDR:
+ error = sglist_append_phys(sg,
+ (vm_paddr_t)(vm_offset_t) csio->data_ptr, csio->dxfer_len);
+ break;
+ case CAM_DATA_SG:
+ for (i = 0; i < csio->sglist_cnt && error == 0; i++) {
+ dseg = &((struct bus_dma_segment *)csio->data_ptr)[i];
error = sglist_append(sg,
- csio->data_ptr, csio->dxfer_len);
- else
- error = sglist_append_phys(sg,
- (vm_paddr_t)(vm_offset_t) csio->data_ptr,
- csio->dxfer_len);
- } else {
-
+ (void *)(vm_offset_t) dseg->ds_addr, dseg->ds_len);
+ }
+ break;
+ case CAM_DATA_SG_PADDR:
for (i = 0; i < csio->sglist_cnt && error == 0; i++) {
dseg = &((struct bus_dma_segment *)csio->data_ptr)[i];
-
- if ((ccbh->flags & CAM_SG_LIST_PHYS) == 0)
- error = sglist_append(sg,
- (void *)(vm_offset_t) dseg->ds_addr,
- dseg->ds_len);
- else
- error = sglist_append_phys(sg,
- (vm_paddr_t) dseg->ds_addr, dseg->ds_len);
+ error = sglist_append_phys(sg,
+ (vm_paddr_t) dseg->ds_addr, dseg->ds_len);
}
+ break;
+ default:
+ error = EINVAL;
+ break;
}
return (error);