Module Name: src
Committed By: hannken
Date: Wed Nov 23 19:40:42 UTC 2011
Modified Files:
src/sys/dev/pci: ld_virtio.c
Log Message:
According to "Virtio PCI Card Specification v0.9.2 DRAFT" there is no
feature named VIRTIO_BLK_F_SECTOR_MAX so remove it. Linux seems to use
this feature bit as VIRTIO_BLK_F_TOPOLOGY.
Use VIRTIO_BLK_F_BLK_SIZE * VIRTIO_BLK_F_SEG_MAX as the drivers maxxfer
and reorder so sc_secsize gets set before use.
As maxxfer may not be a multiple of page size add one more segment to
the dma maps.
Tested on Linux 3.1.1 host by Guillaume Lasmayous.
To generate a diff of this commit:
cvs rdiff -u -r1.2 -r1.3 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.2 src/sys/dev/pci/ld_virtio.c:1.3
--- src/sys/dev/pci/ld_virtio.c:1.2 Wed Nov 2 14:34:09 2011
+++ src/sys/dev/pci/ld_virtio.c Wed Nov 23 19:40:42 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: ld_virtio.c,v 1.2 2011/11/02 14:34:09 hannken Exp $ */
+/* $NetBSD: ld_virtio.c,v 1.3 2011/11/23 19:40:42 hannken Exp $ */
/*
* Copyright (c) 2010 Minoura Makoto.
@@ -26,7 +26,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ld_virtio.c,v 1.2 2011/11/02 14:34:09 hannken Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ld_virtio.c,v 1.3 2011/11/23 19:40:42 hannken Exp $");
#include "rnd.h"
@@ -61,7 +61,6 @@ __KERNEL_RCSID(0, "$NetBSD: ld_virtio.c,
#define VIRTIO_BLK_CONFIG_GEOMETRY_H 18 /* 8bit */
#define VIRTIO_BLK_CONFIG_GEOMETRY_S 19 /* 8bit */
#define VIRTIO_BLK_CONFIG_BLK_SIZE 20 /* 32bit */
-#define VIRTIO_BLK_CONFIG_SECTORS_MAX 24 /* 32bit */
/* Feature bits */
#define VIRTIO_BLK_F_BARRIER (1<<0)
@@ -72,7 +71,6 @@ __KERNEL_RCSID(0, "$NetBSD: ld_virtio.c,
#define VIRTIO_BLK_F_BLK_SIZE (1<<6)
#define VIRTIO_BLK_F_SCSI (1<<7)
#define VIRTIO_BLK_F_FLUSH (1<<9)
-#define VIRTIO_BLK_F_SECTOR_MAX (1<<10)
/* Command */
#define VIRTIO_BLK_T_IN 0
@@ -194,7 +192,7 @@ ld_virtio_alloc_reqs(struct ld_virtio_so
}
r = bus_dmamap_create(sc->sc_virtio->sc_dmat,
ld->sc_maxxfer,
- (ld->sc_maxxfer / NBPG) + 1,
+ (ld->sc_maxxfer / NBPG) + 2,
ld->sc_maxxfer,
0,
BUS_DMA_NOWAIT|BUS_DMA_ALLOCNOW,
@@ -262,17 +260,21 @@ ld_virtio_attach(device_t parent, device
VIRTIO_BLK_F_SEG_MAX |
VIRTIO_BLK_F_GEOMETRY |
VIRTIO_BLK_F_RO |
- VIRTIO_BLK_F_BLK_SIZE |
- VIRTIO_BLK_F_SECTOR_MAX));
+ VIRTIO_BLK_F_BLK_SIZE));
if (features & VIRTIO_BLK_F_RO)
sc->sc_readonly = 1;
else
sc->sc_readonly = 0;
+ ld->sc_secsize = 512;
+ if (features & VIRTIO_BLK_F_BLK_SIZE) {
+ ld->sc_secsize = virtio_read_device_config_4(vsc,
+ VIRTIO_BLK_CONFIG_BLK_SIZE);
+ }
maxxfersize = MAXPHYS;
- if (features & VIRTIO_BLK_F_SECTOR_MAX) {
+ if (features & VIRTIO_BLK_F_SEG_MAX) {
maxxfersize = virtio_read_device_config_4(vsc,
- VIRTIO_BLK_CONFIG_SECTORS_MAX)
+ VIRTIO_BLK_CONFIG_SEG_MAX)
* ld->sc_secsize;
if (maxxfersize > MAXPHYS)
maxxfersize = MAXPHYS;
@@ -289,11 +291,6 @@ ld_virtio_attach(device_t parent, device
ld->sc_dv = self;
ld->sc_secperunit = virtio_read_device_config_8(vsc,
VIRTIO_BLK_CONFIG_CAPACITY);
- ld->sc_secsize = 512;
- if (features & VIRTIO_BLK_F_BLK_SIZE) {
- ld->sc_secsize = virtio_read_device_config_4(vsc,
- VIRTIO_BLK_CONFIG_BLK_SIZE);
- }
ld->sc_maxxfer = maxxfersize;
if (features & VIRTIO_BLK_F_GEOMETRY) {
ld->sc_ncylinders = virtio_read_device_config_2(vsc,