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,

Reply via email to