Lines Matching +full:qemu +full:- +full:1 +full:- +full:setup
1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
10 * 1. Redistributions of source code must retain the above copyright
208 #define vtblk_modern(_sc) (((_sc)->vtblk_features & VIRTIO_F_VERSION_1) != 0)
219 static int vtblk_writecache_mode = -1;
237 #define VTBLK_MTX(_sc) &(_sc)->vtblk_mtx
253 * Each block request uses at least two segments - one for the header
281 MODULE_VERSION(virtio_blk, 1);
282 MODULE_DEPEND(virtio_blk, virtio, 1, 1, 1);
321 sc->vtblk_dev = dev; in vtblk_attach()
325 bioq_init(&sc->vtblk_bioq); in vtblk_attach()
326 TAILQ_INIT(&sc->vtblk_dump_queue); in vtblk_attach()
327 TAILQ_INIT(&sc->vtblk_req_free); in vtblk_attach()
328 TAILQ_INIT(&sc->vtblk_req_ready); in vtblk_attach()
334 device_printf(dev, "cannot setup features\n"); in vtblk_attach()
355 sc->vtblk_max_nsegs = vtblk_maximum_segments(sc, &blkcfg); in vtblk_attach()
356 if (sc->vtblk_max_nsegs <= VTBLK_MIN_SEGMENTS) { in vtblk_attach()
359 "allowed: %d\n", sc->vtblk_max_nsegs); in vtblk_attach()
363 sc->vtblk_sglist = sglist_alloc(sc->vtblk_max_nsegs, M_NOWAIT); in vtblk_attach()
364 if (sc->vtblk_sglist == NULL) { in vtblk_attach()
371 * If vtblk_max_nsegs == VTBLK_MIN_SEGMENTS + 1, the device only in vtblk_attach()
376 if (sc->vtblk_max_nsegs == VTBLK_MIN_SEGMENTS + 1) in vtblk_attach()
377 sc->vtblk_flags |= VTBLK_FLAG_BUSDMA_ALIGN; in vtblk_attach()
380 (sc->vtblk_flags & VTBLK_FLAG_BUSDMA_ALIGN) ? PAGE_SIZE : 1, in vtblk_attach()
386 sc->vtblk_max_nsegs - VTBLK_MIN_SEGMENTS, /* max # segments */ in vtblk_attach()
390 &sc->vtblk_mtx, /* lockarg */ in vtblk_attach()
391 &sc->vtblk_dmat); in vtblk_attach()
400 * need to ask busdma to skip the iommu physical->bus mapping. At in vtblk_attach()
403 bus_dma_tag_set_iommu(sc->vtblk_dmat, NULL, NULL); in vtblk_attach()
422 device_printf(dev, "cannot setup virtqueue interrupt\n"); in vtblk_attach()
426 virtqueue_enable_intr(sc->vtblk_vq); in vtblk_attach()
443 sc->vtblk_flags |= VTBLK_FLAG_DETACH; in vtblk_detach()
450 if (sc->vtblk_disk != NULL) { in vtblk_detach()
451 disk_destroy(sc->vtblk_disk); in vtblk_detach()
452 sc->vtblk_disk = NULL; in vtblk_detach()
455 if (sc->vtblk_dmat != NULL) { in vtblk_detach()
456 bus_dma_tag_destroy(sc->vtblk_dmat); in vtblk_detach()
457 sc->vtblk_dmat = NULL; in vtblk_detach()
460 if (sc->vtblk_sglist != NULL) { in vtblk_detach()
461 sglist_free(sc->vtblk_sglist); in vtblk_detach()
462 sc->vtblk_sglist = NULL; in vtblk_detach()
479 sc->vtblk_flags |= VTBLK_FLAG_SUSPEND; in vtblk_suspend()
483 sc->vtblk_flags &= ~VTBLK_FLAG_SUSPEND; in vtblk_suspend()
498 sc->vtblk_flags &= ~VTBLK_FLAG_SUSPEND; in vtblk_resume()
539 /* Capacity is always in 512-byte units. */ in vtblk_config_change()
542 if (sc->vtblk_disk->d_mediasize != capacity) in vtblk_config_change()
553 if ((sc = dp->d_drv1) == NULL) in vtblk_open()
556 return (sc->vtblk_flags & VTBLK_FLAG_DETACH ? ENXIO : 0); in vtblk_open()
564 if ((sc = dp->d_drv1) == NULL) in vtblk_close()
576 if ((sc = dp->d_drv1) == NULL) in vtblk_ioctl()
592 if ((sc = dp->d_drv1) == NULL) in vtblk_dump()
614 if ((sc = bp->bio_disk->d_drv1) == NULL) { in vtblk_strategy()
619 if ((bp->bio_cmd != BIO_READ) && (bp->bio_cmd != BIO_WRITE) && in vtblk_strategy()
620 (bp->bio_cmd != BIO_FLUSH) && (bp->bio_cmd != BIO_DELETE)) { in vtblk_strategy()
627 if (sc->vtblk_flags & VTBLK_FLAG_DETACH) { in vtblk_strategy()
633 bioq_insert_tail(&sc->vtblk_bioq, bp); in vtblk_strategy()
645 dev = sc->vtblk_dev; in vtblk_negotiate_features()
649 sc->vtblk_features = virtio_negotiate_features(dev, features); in vtblk_negotiate_features()
659 dev = sc->vtblk_dev; in vtblk_setup_features()
666 sc->vtblk_flags |= VTBLK_FLAG_INDIRECT; in vtblk_setup_features()
668 sc->vtblk_flags |= VTBLK_FLAG_WCE_CONFIG; in vtblk_setup_features()
672 sc->vtblk_flags |= VTBLK_FLAG_BARRIER; in vtblk_setup_features()
684 dev = sc->vtblk_dev; in vtblk_maximum_segments()
688 nsegs += MIN(blkcfg->seg_max, maxphys / PAGE_SIZE + 1); in vtblk_maximum_segments()
689 if (sc->vtblk_flags & VTBLK_FLAG_INDIRECT) in vtblk_maximum_segments()
692 nsegs += 1; in vtblk_maximum_segments()
704 dev = sc->vtblk_dev; in vtblk_alloc_virtqueue()
707 if (sc->vtblk_flags & VTBLK_FLAG_INDIRECT) in vtblk_alloc_virtqueue()
708 indir_segs = sc->vtblk_max_nsegs; in vtblk_alloc_virtqueue()
710 vtblk_vq_intr, sc, &sc->vtblk_vq, in vtblk_alloc_virtqueue()
713 return (virtio_alloc_virtqueues(dev, 1, &vq_info)); in vtblk_alloc_virtqueue()
723 dev = sc->vtblk_dev; in vtblk_resize_disk()
724 dp = sc->vtblk_disk; in vtblk_resize_disk()
726 dp->d_mediasize = new_capacity; in vtblk_resize_disk()
729 (uintmax_t) dp->d_mediasize >> 20, in vtblk_resize_disk()
730 (uintmax_t) dp->d_mediasize / dp->d_sectorsize, in vtblk_resize_disk()
731 dp->d_sectorsize); in vtblk_resize_disk()
747 dev = sc->vtblk_dev; in vtblk_alloc_disk()
749 sc->vtblk_disk = dp = disk_alloc(); in vtblk_alloc_disk()
750 dp->d_open = vtblk_open; in vtblk_alloc_disk()
751 dp->d_close = vtblk_close; in vtblk_alloc_disk()
752 dp->d_ioctl = vtblk_ioctl; in vtblk_alloc_disk()
753 dp->d_strategy = vtblk_strategy; in vtblk_alloc_disk()
754 dp->d_name = VTBLK_DISK_NAME; in vtblk_alloc_disk()
755 dp->d_unit = device_get_unit(dev); in vtblk_alloc_disk()
756 dp->d_drv1 = sc; in vtblk_alloc_disk()
757 dp->d_flags = DISKFLAG_UNMAPPED_BIO | DISKFLAG_DIRECT_COMPLETION; in vtblk_alloc_disk()
758 dp->d_hba_vendor = virtio_get_vendor(dev); in vtblk_alloc_disk()
759 dp->d_hba_device = virtio_get_device(dev); in vtblk_alloc_disk()
760 dp->d_hba_subvendor = virtio_get_subvendor(dev); in vtblk_alloc_disk()
761 dp->d_hba_subdevice = virtio_get_subdevice(dev); in vtblk_alloc_disk()
762 strlcpy(dp->d_attachment, device_get_nameunit(dev), in vtblk_alloc_disk()
763 sizeof(dp->d_attachment)); in vtblk_alloc_disk()
766 dp->d_flags |= DISKFLAG_WRITE_PROTECT; in vtblk_alloc_disk()
769 dp->d_flags |= DISKFLAG_CANFLUSHCACHE; in vtblk_alloc_disk()
770 dp->d_dump = vtblk_dump; in vtblk_alloc_disk()
773 /* Capacity is always in 512-byte units. */ in vtblk_alloc_disk()
774 dp->d_mediasize = blkcfg->capacity * VTBLK_BSIZE; in vtblk_alloc_disk()
777 dp->d_sectorsize = blkcfg->blk_size; in vtblk_alloc_disk()
779 dp->d_sectorsize = VTBLK_BSIZE; in vtblk_alloc_disk()
786 * maximum I/O size. But in practice, since QEMU advertises 128 in vtblk_alloc_disk()
795 dp->d_maxsize = (sc->vtblk_max_nsegs - VTBLK_MIN_SEGMENTS) * in vtblk_alloc_disk()
797 if ((sc->vtblk_flags & VTBLK_FLAG_BUSDMA_ALIGN) == 0) in vtblk_alloc_disk()
798 dp->d_maxsize -= PAGE_SIZE; in vtblk_alloc_disk()
801 dp->d_fwsectors = blkcfg->geometry.sectors; in vtblk_alloc_disk()
802 dp->d_fwheads = blkcfg->geometry.heads; in vtblk_alloc_disk()
806 blkcfg->topology.physical_block_exp > 0) { in vtblk_alloc_disk()
807 dp->d_stripesize = dp->d_sectorsize * in vtblk_alloc_disk()
808 (1 << blkcfg->topology.physical_block_exp); in vtblk_alloc_disk()
809 dp->d_stripeoffset = (dp->d_stripesize - in vtblk_alloc_disk()
810 blkcfg->topology.alignment_offset * dp->d_sectorsize) % in vtblk_alloc_disk()
811 dp->d_stripesize; in vtblk_alloc_disk()
815 dp->d_flags |= DISKFLAG_CANDELETE; in vtblk_alloc_disk()
816 dp->d_delmaxsize = blkcfg->max_discard_sectors * VTBLK_BSIZE; in vtblk_alloc_disk()
820 sc->vtblk_write_cache = VTBLK_CACHE_WRITEBACK; in vtblk_alloc_disk()
822 sc->vtblk_write_cache = VTBLK_CACHE_WRITETHROUGH; in vtblk_alloc_disk()
830 dp = sc->vtblk_disk; in vtblk_create_disk()
834 device_printf(sc->vtblk_dev, "%juMB (%ju %u byte sectors)\n", in vtblk_create_disk()
835 (uintmax_t) dp->d_mediasize >> 20, in vtblk_create_disk()
836 (uintmax_t) dp->d_mediasize / dp->d_sectorsize, in vtblk_create_disk()
837 dp->d_sectorsize); in vtblk_create_disk()
848 nreqs = virtqueue_size(sc->vtblk_vq); in vtblk_request_prealloc()
855 if ((sc->vtblk_flags & VTBLK_FLAG_INDIRECT) == 0) in vtblk_request_prealloc()
863 req->vbr_sc = sc; in vtblk_request_prealloc()
864 if (bus_dmamap_create(sc->vtblk_dmat, 0, &req->vbr_mapp)) { in vtblk_request_prealloc()
869 MPASS(sglist_count(&req->vbr_hdr, sizeof(req->vbr_hdr)) == 1); in vtblk_request_prealloc()
870 MPASS(sglist_count(&req->vbr_ack, sizeof(req->vbr_ack)) == 1); in vtblk_request_prealloc()
872 sc->vtblk_request_count++; in vtblk_request_prealloc()
884 MPASS(TAILQ_EMPTY(&sc->vtblk_req_ready)); in vtblk_request_free()
887 sc->vtblk_request_count--; in vtblk_request_free()
888 bus_dmamap_destroy(sc->vtblk_dmat, req->vbr_mapp); in vtblk_request_free()
892 KASSERT(sc->vtblk_request_count == 0, in vtblk_request_free()
893 ("%s: leaked %d requests", __func__, sc->vtblk_request_count)); in vtblk_request_free()
901 req = TAILQ_FIRST(&sc->vtblk_req_free); in vtblk_request_dequeue()
903 TAILQ_REMOVE(&sc->vtblk_req_free, req, vbr_link); in vtblk_request_dequeue()
904 bzero(&req->vbr_hdr, sizeof(struct vtblk_request) - in vtblk_request_dequeue()
915 TAILQ_INSERT_HEAD(&sc->vtblk_req_free, req, vbr_link); in vtblk_request_enqueue()
923 req = TAILQ_FIRST(&sc->vtblk_req_ready); in vtblk_request_next_ready()
925 TAILQ_REMOVE(&sc->vtblk_req_ready, req, vbr_link); in vtblk_request_next_ready()
935 TAILQ_INSERT_HEAD(&sc->vtblk_req_ready, req, vbr_link); in vtblk_request_requeue_ready()
957 bioq = &sc->vtblk_bioq; in vtblk_request_bio()
967 req->vbr_bp = bp; in vtblk_request_bio()
968 req->vbr_ack = -1; in vtblk_request_bio()
969 req->vbr_hdr.ioprio = vtblk_gtoh32(sc, 1); in vtblk_request_bio()
971 switch (bp->bio_cmd) { in vtblk_request_bio()
973 req->vbr_hdr.type = vtblk_gtoh32(sc, VIRTIO_BLK_T_FLUSH); in vtblk_request_bio()
974 req->vbr_hdr.sector = 0; in vtblk_request_bio()
977 req->vbr_hdr.type = vtblk_gtoh32(sc, VIRTIO_BLK_T_IN); in vtblk_request_bio()
978 req->vbr_hdr.sector = vtblk_gtoh64(sc, bp->bio_offset / VTBLK_BSIZE); in vtblk_request_bio()
981 req->vbr_hdr.type = vtblk_gtoh32(sc, VIRTIO_BLK_T_OUT); in vtblk_request_bio()
982 req->vbr_hdr.sector = vtblk_gtoh64(sc, bp->bio_offset / VTBLK_BSIZE); in vtblk_request_bio()
985 req->vbr_hdr.type = vtblk_gtoh32(sc, VIRTIO_BLK_T_DISCARD); in vtblk_request_bio()
986 req->vbr_hdr.sector = vtblk_gtoh64(sc, bp->bio_offset / VTBLK_BSIZE); in vtblk_request_bio()
989 panic("%s: bio with unhandled cmd: %d", __func__, bp->bio_cmd); in vtblk_request_bio()
992 if (bp->bio_flags & BIO_ORDERED) in vtblk_request_bio()
993 req->vbr_hdr.type |= vtblk_gtoh32(sc, VIRTIO_BLK_T_BARRIER); in vtblk_request_bio()
1001 struct vtblk_softc *sc = req->vbr_sc; in vtblk_request_execute()
1002 struct bio *bp = req->vbr_bp; in vtblk_request_execute()
1011 if ((req->vbr_mapp != NULL) && in vtblk_request_execute()
1012 (bp->bio_cmd == BIO_READ || bp->bio_cmd == BIO_WRITE)) { in vtblk_request_execute()
1013 error = bus_dmamap_load_bio(sc->vtblk_dmat, req->vbr_mapp, in vtblk_request_execute()
1014 req->vbr_bp, vtblk_request_execute_cb, req, flags); in vtblk_request_execute()
1016 req->vbr_busdma_wait = 1; in vtblk_request_execute()
1017 sc->vtblk_flags |= VTBLK_FLAG_BUSDMA_WAIT; in vtblk_request_execute()
1023 return (error ? error : req->vbr_error); in vtblk_request_execute()
1038 sc = req->vbr_sc; in vtblk_request_execute_cb()
1039 vq = sc->vtblk_vq; in vtblk_request_execute_cb()
1040 sg = sc->vtblk_sglist; in vtblk_request_execute_cb()
1041 bp = req->vbr_bp; in vtblk_request_execute_cb()
1052 if (req->vbr_busdma_wait) in vtblk_request_execute_cb()
1053 sc->vtblk_flags &= ~VTBLK_FLAG_BUSDMA_WAIT; in vtblk_request_execute_cb()
1064 if ((sc->vtblk_flags & VTBLK_FLAG_BARRIER) == 0) { in vtblk_request_execute_cb()
1065 if (sc->vtblk_req_ordered != NULL) { in vtblk_request_execute_cb()
1069 if (bp->bio_flags & BIO_ORDERED) { in vtblk_request_execute_cb()
1074 ordered = 1; in vtblk_request_execute_cb()
1075 req->vbr_hdr.type &= vtblk_gtoh32(sc, in vtblk_request_execute_cb()
1081 sglist_append(sg, &req->vbr_hdr, sizeof(struct virtio_blk_outhdr)); in vtblk_request_execute_cb()
1083 if (bp->bio_cmd == BIO_READ || bp->bio_cmd == BIO_WRITE) { in vtblk_request_execute_cb()
1091 if (error || sg->sg_nseg == sg->sg_maxseg) { in vtblk_request_execute_cb()
1098 if (req->vbr_mapp == NULL) { in vtblk_request_execute_cb()
1100 if (error || sg->sg_nseg == sg->sg_maxseg) { in vtblk_request_execute_cb()
1107 if (bp->bio_cmd == BIO_READ) in vtblk_request_execute_cb()
1108 writable = sg->sg_nseg - 1; in vtblk_request_execute_cb()
1109 } else if (bp->bio_cmd == BIO_DELETE) { in vtblk_request_execute_cb()
1118 bp->bio_driver1 = discard; in vtblk_request_execute_cb()
1119 discard->sector = vtblk_gtoh64(sc, bp->bio_offset / VTBLK_BSIZE); in vtblk_request_execute_cb()
1120 discard->num_sectors = vtblk_gtoh32(sc, bp->bio_bcount / VTBLK_BSIZE); in vtblk_request_execute_cb()
1122 if (error || sg->sg_nseg == sg->sg_maxseg) { in vtblk_request_execute_cb()
1129 sglist_append(sg, &req->vbr_ack, sizeof(uint8_t)); in vtblk_request_execute_cb()
1130 readable = sg->sg_nseg - writable; in vtblk_request_execute_cb()
1132 if (req->vbr_mapp != NULL) { in vtblk_request_execute_cb()
1133 switch (bp->bio_cmd) { in vtblk_request_execute_cb()
1135 bus_dmamap_sync(sc->vtblk_dmat, req->vbr_mapp, in vtblk_request_execute_cb()
1139 bus_dmamap_sync(sc->vtblk_dmat, req->vbr_mapp, in vtblk_request_execute_cb()
1147 sc->vtblk_req_ordered = req; in vtblk_request_execute_cb()
1154 if (error == 0 && req->vbr_busdma_wait) in vtblk_request_execute_cb()
1158 if (error && (req->vbr_mapp != NULL)) in vtblk_request_execute_cb()
1159 bus_dmamap_unload(sc->vtblk_dmat, req->vbr_mapp); in vtblk_request_execute_cb()
1161 if (error && req->vbr_requeue_on_error) in vtblk_request_execute_cb()
1163 req->vbr_error = error; in vtblk_request_execute_cb()
1171 switch (req->vbr_ack) { in vtblk_request_error()
1191 if (sc->vtblk_req_ordered != NULL) { in vtblk_queue_complete_one()
1192 MPASS(sc->vtblk_req_ordered == req); in vtblk_queue_complete_one()
1193 sc->vtblk_req_ordered = NULL; in vtblk_queue_complete_one()
1196 bp = req->vbr_bp; in vtblk_queue_complete_one()
1197 if (req->vbr_mapp != NULL) { in vtblk_queue_complete_one()
1198 switch (bp->bio_cmd) { in vtblk_queue_complete_one()
1200 bus_dmamap_sync(sc->vtblk_dmat, req->vbr_mapp, in vtblk_queue_complete_one()
1202 bus_dmamap_unload(sc->vtblk_dmat, req->vbr_mapp); in vtblk_queue_complete_one()
1205 bus_dmamap_sync(sc->vtblk_dmat, req->vbr_mapp, in vtblk_queue_complete_one()
1207 bus_dmamap_unload(sc->vtblk_dmat, req->vbr_mapp); in vtblk_queue_complete_one()
1211 bp->bio_error = vtblk_request_error(req); in vtblk_queue_complete_one()
1221 while ((req = virtqueue_dequeue(sc->vtblk_vq, NULL)) != NULL) { in vtblk_queue_completed()
1235 if (bp->bio_error != 0) in vtblk_done_completed()
1236 disk_err(bp, "hard error", -1, 1); in vtblk_done_completed()
1237 vtblk_bio_done(sc, bp, bp->bio_error); in vtblk_done_completed()
1248 vq = sc->vtblk_vq; in vtblk_drain_vq()
1252 vtblk_bio_done(sc, req->vbr_bp, ENXIO); in vtblk_drain_vq()
1256 sc->vtblk_req_ordered = NULL; in vtblk_drain_vq()
1267 bioq = &sc->vtblk_bioq; in vtblk_drain()
1269 if (sc->vtblk_vq != NULL) { in vtblk_drain()
1280 vtblk_bio_done(sc, req->vbr_bp, ENXIO); in vtblk_drain()
1300 vq = sc->vtblk_vq; in vtblk_startio()
1303 if (sc->vtblk_flags & (VTBLK_FLAG_SUSPEND | VTBLK_FLAG_BUSDMA_WAIT)) in vtblk_startio()
1311 req->vbr_requeue_on_error = 1; in vtblk_startio()
1331 bp->bio_resid = bp->bio_bcount; in vtblk_bio_done()
1332 bp->bio_error = error; in vtblk_bio_done()
1333 bp->bio_flags |= BIO_ERROR; in vtblk_bio_done()
1338 if (bp->bio_driver1 != NULL) { in vtblk_bio_done()
1339 free(bp->bio_driver1, M_DEVBUF); in vtblk_bio_done()
1340 bp->bio_driver1 = NULL; in vtblk_bio_done()
1350 &(_cfg)->_field, sizeof((_cfg)->_field)); \
1358 dev = sc->vtblk_dev; in vtblk_read_config()
1364 capacity), &blkcfg->capacity, sizeof(blkcfg->capacity)); in vtblk_read_config()
1402 dp = sc->vtblk_disk; in vtblk_ident()
1412 req->vbr_ack = -1; in vtblk_ident()
1413 req->vbr_hdr.type = vtblk_gtoh32(sc, VIRTIO_BLK_T_GET_ID); in vtblk_ident()
1414 req->vbr_hdr.ioprio = vtblk_gtoh32(sc, 1); in vtblk_ident()
1415 req->vbr_hdr.sector = 0; in vtblk_ident()
1417 req->vbr_bp = &buf; in vtblk_ident()
1421 buf.bio_data = dp->d_ident; in vtblk_ident()
1429 device_printf(sc->vtblk_dev, in vtblk_ident()
1442 vq = sc->vtblk_vq; in vtblk_poll_request()
1457 error = bp->bio_error; in vtblk_poll_request()
1459 device_printf(sc->vtblk_dev, in vtblk_poll_request()
1462 if (req != &sc->vtblk_dump_request) in vtblk_poll_request()
1476 while (!virtqueue_empty(sc->vtblk_vq)) { in vtblk_quiesce()
1477 if (mtx_sleep(&sc->vtblk_vq, VTBLK_MTX(sc), PRIBIO, "vtblkq", in vtblk_quiesce()
1495 vq = sc->vtblk_vq; in vtblk_vq_intr()
1501 if (sc->vtblk_flags & VTBLK_FLAG_DETACH) in vtblk_vq_intr()
1512 if (sc->vtblk_flags & VTBLK_FLAG_SUSPEND) in vtblk_vq_intr()
1513 wakeup(&sc->vtblk_vq); in vtblk_vq_intr()
1524 virtqueue_disable_intr(sc->vtblk_vq); in vtblk_stop()
1525 virtio_stop(sc->vtblk_dev); in vtblk_stop()
1533 * Spin here until all the requests in-flight at the time of the in vtblk_dump_quiesce()
1537 while (!virtqueue_empty(sc->vtblk_vq)) in vtblk_dump_quiesce()
1538 vtblk_queue_completed(sc, &sc->vtblk_dump_queue); in vtblk_dump_quiesce()
1548 req = &sc->vtblk_dump_request; in vtblk_dump_write()
1549 req->vbr_sc = sc; in vtblk_dump_write()
1550 req->vbr_ack = -1; in vtblk_dump_write()
1551 req->vbr_hdr.type = vtblk_gtoh32(sc, VIRTIO_BLK_T_OUT); in vtblk_dump_write()
1552 req->vbr_hdr.ioprio = vtblk_gtoh32(sc, 1); in vtblk_dump_write()
1553 req->vbr_hdr.sector = vtblk_gtoh64(sc, offset / VTBLK_BSIZE); in vtblk_dump_write()
1555 req->vbr_bp = &buf; in vtblk_dump_write()
1571 req = &sc->vtblk_dump_request; in vtblk_dump_flush()
1572 req->vbr_sc = sc; in vtblk_dump_flush()
1573 req->vbr_ack = -1; in vtblk_dump_flush()
1574 req->vbr_hdr.type = vtblk_gtoh32(sc, VIRTIO_BLK_T_FLUSH); in vtblk_dump_flush()
1575 req->vbr_hdr.ioprio = vtblk_gtoh32(sc, 1); in vtblk_dump_flush()
1576 req->vbr_hdr.sector = 0; in vtblk_dump_flush()
1578 req->vbr_bp = &buf; in vtblk_dump_flush()
1593 vtblk_done_completed(sc, &sc->vtblk_dump_queue); in vtblk_dump_complete()
1601 /* Set either writeback (1) or writethrough (0) mode. */ in vtblk_set_write_cache()
1602 virtio_write_dev_config_1(sc->vtblk_dev, in vtblk_set_write_cache()
1612 if (sc->vtblk_flags & VTBLK_FLAG_WCE_CONFIG) { in vtblk_write_cache_enabled()
1618 wc = blkcfg->wce; in vtblk_write_cache_enabled()
1620 wc = virtio_with_feature(sc->vtblk_dev, VIRTIO_BLK_F_FLUSH); in vtblk_write_cache_enabled()
1631 sc = oidp->oid_arg1; in vtblk_write_cache_sysctl()
1632 wc = sc->vtblk_write_cache; in vtblk_write_cache_sysctl()
1635 if (error || req->newptr == NULL) in vtblk_write_cache_sysctl()
1637 if ((sc->vtblk_flags & VTBLK_FLAG_WCE_CONFIG) == 0) in vtblk_write_cache_sysctl()
1643 sc->vtblk_write_cache = wc; in vtblk_write_cache_sysctl()
1644 vtblk_set_write_cache(sc, sc->vtblk_write_cache); in vtblk_write_cache_sysctl()
1658 dev = sc->vtblk_dev; in vtblk_setup_sysctl()
1666 "Write cache mode (writethrough (0) or writeback (1))"); in vtblk_setup_sysctl()
1675 "hw.vtblk.%d.%s", device_get_unit(sc->vtblk_dev), knob); in vtblk_tunable_int()