Module Name: src Committed By: mlelstv Date: Sun Feb 23 22:04:06 UTC 2025
Modified Files: src/sys/dev/pci: ld_virtio.c Log Message: Need to allocate DMA buffer. To generate a diff of this commit: cvs rdiff -u -r1.40 -r1.41 src/sys/dev/pci/ld_virtio.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/dev/pci/ld_virtio.c diff -u src/sys/dev/pci/ld_virtio.c:1.40 src/sys/dev/pci/ld_virtio.c:1.41 --- src/sys/dev/pci/ld_virtio.c:1.40 Sat Feb 22 16:53:37 2025 +++ src/sys/dev/pci/ld_virtio.c Sun Feb 23 22:04:06 2025 @@ -1,4 +1,4 @@ -/* $NetBSD: ld_virtio.c,v 1.40 2025/02/22 16:53:37 mlelstv Exp $ */ +/* $NetBSD: ld_virtio.c,v 1.41 2025/02/23 22:04:06 mlelstv Exp $ */ /* * Copyright (c) 2010 Minoura Makoto. @@ -26,7 +26,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: ld_virtio.c,v 1.40 2025/02/22 16:53:37 mlelstv Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ld_virtio.c,v 1.41 2025/02/23 22:04:06 mlelstv Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -466,7 +466,8 @@ ld_virtio_info(struct ld_softc *ld, bool struct virtio_blk_req *vr; int r; int slot; - uint8_t id_data[20]; /* virtio v1.2 5.2.6 */ + uint8_t *id_data; /* virtio v1.2 5.2.6 */ + size_t id_len = 20; bool unload = false; if (sc->sc_typename != NULL) { @@ -474,6 +475,8 @@ ld_virtio_info(struct ld_softc *ld, bool sc->sc_typename = NULL; } + id_data = kmem_alloc(id_len, KM_SLEEP); + mutex_enter(&sc->sc_sync_wait_lock); while (sc->sc_sync_use != SYNC_FREE) { if (poll) { @@ -495,7 +498,7 @@ ld_virtio_info(struct ld_softc *ld, bool KASSERT(vr->vr_bp == NULL); r = bus_dmamap_load(virtio_dmat(vsc), vr->vr_payload, - id_data, sizeof(id_data), NULL, + id_data, id_len, NULL, BUS_DMA_READ|BUS_DMA_NOWAIT); if (r != 0) { aprint_error_dev(sc->sc_dev, @@ -522,7 +525,7 @@ ld_virtio_info(struct ld_softc *ld, bool 0, sizeof(struct virtio_blk_req_hdr), BUS_DMASYNC_PREWRITE); bus_dmamap_sync(virtio_dmat(vsc), vr->vr_payload, - 0, sizeof(id_data), + 0, id_len, BUS_DMASYNC_PREREAD); bus_dmamap_sync(virtio_dmat(vsc), vr->vr_cmdsts, offsetof(struct virtio_blk_req, vr_status), @@ -562,13 +565,15 @@ done: if (unload) { bus_dmamap_sync(virtio_dmat(vsc), vr->vr_payload, - 0, sizeof(id_data), BUS_DMASYNC_POSTREAD); + 0, id_len, BUS_DMASYNC_POSTREAD); bus_dmamap_unload(virtio_dmat(vsc), vr->vr_payload); } if (r == 0) sc->sc_typename = kmem_strndup(id_data, sizeof(id_data), KM_NOSLEEP); + kmem_free(id_data, id_len); + return r; }