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;
}