svn commit: r261149 - head/sys/dev/virtio/scsi
Bryan Venteicher
bryanv at FreeBSD.org
Sat Jan 25 07:01:52 UTC 2014
Author: bryanv
Date: Sat Jan 25 07:01:51 2014
New Revision: 261149
URL: http://svnweb.freebsd.org/changeset/base/261149
Log:
Read each field of the configuration individually
In the forthcoming VirtIO spec, the device configuration is
always in little endian instead of guest edian. This is a
noop change for now.
Modified:
head/sys/dev/virtio/scsi/virtio_scsi.c
Modified: head/sys/dev/virtio/scsi/virtio_scsi.c
==============================================================================
--- head/sys/dev/virtio/scsi/virtio_scsi.c Sat Jan 25 06:58:41 2014 (r261148)
+++ head/sys/dev/virtio/scsi/virtio_scsi.c Sat Jan 25 07:01:51 2014 (r261149)
@@ -75,6 +75,8 @@ static int vtscsi_suspend(device_t);
static int vtscsi_resume(device_t);
static void vtscsi_negotiate_features(struct vtscsi_softc *);
+static void vtscsi_read_config(struct vtscsi_softc *,
+ struct virtio_scsi_config *);
static int vtscsi_maximum_segments(struct vtscsi_softc *, int);
static int vtscsi_alloc_virtqueues(struct vtscsi_softc *);
static void vtscsi_write_device_config(struct vtscsi_softc *);
@@ -287,8 +289,7 @@ vtscsi_attach(device_t dev)
if (virtio_with_feature(dev, VIRTIO_SCSI_F_HOTPLUG))
sc->vtscsi_flags |= VTSCSI_FLAG_HOTPLUG;
- virtio_read_device_config(dev, 0, &scsicfg,
- sizeof(struct virtio_scsi_config));
+ vtscsi_read_config(sc, &scsicfg);
sc->vtscsi_max_channel = scsicfg.max_channel;
sc->vtscsi_max_target = scsicfg.max_target;
@@ -408,6 +409,35 @@ vtscsi_negotiate_features(struct vtscsi_
sc->vtscsi_features = features;
}
+#define VTSCSI_GET_CONFIG(_dev, _field, _cfg) \
+ virtio_read_device_config(_dev, \
+ offsetof(struct virtio_scsi_config, _field), \
+ &(_cfg)->_field, sizeof((_cfg)->_field)) \
+
+static void
+vtscsi_read_config(struct vtscsi_softc *sc,
+ struct virtio_scsi_config *scsicfg)
+{
+ device_t dev;
+
+ dev = sc->vtscsi_dev;
+
+ bzero(scsicfg, sizeof(struct virtio_scsi_config));
+
+ VTSCSI_GET_CONFIG(dev, num_queues, scsicfg);
+ VTSCSI_GET_CONFIG(dev, seg_max, scsicfg);
+ VTSCSI_GET_CONFIG(dev, max_sectors, scsicfg);
+ VTSCSI_GET_CONFIG(dev, cmd_per_lun, scsicfg);
+ VTSCSI_GET_CONFIG(dev, event_info_size, scsicfg);
+ VTSCSI_GET_CONFIG(dev, sense_size, scsicfg);
+ VTSCSI_GET_CONFIG(dev, cdb_size, scsicfg);
+ VTSCSI_GET_CONFIG(dev, max_channel, scsicfg);
+ VTSCSI_GET_CONFIG(dev, max_target, scsicfg);
+ VTSCSI_GET_CONFIG(dev, max_lun, scsicfg);
+}
+
+#undef VTSCSI_GET_CONFIG
+
static int
vtscsi_maximum_segments(struct vtscsi_softc *sc, int seg_max)
{
More information about the svn-src-head
mailing list