Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 8 Jan 2013 07:32:38 +0000 (UTC)
From:      Bryan Venteicher <bryanv@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r245159 - projects/vmxnet/sys/dev/vmware/vmxnet
Message-ID:  <201301080732.r087Wc4E068569@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: bryanv
Date: Tue Jan  8 07:32:38 2013
New Revision: 245159
URL: http://svnweb.freebsd.org/changeset/base/245159

Log:
  Use a bus space subregion for flexible devices
  
  A flexible vmxnet device appears as a PCNET device until transformed.
  The vmxnet registers are located after the PCNET registers in the same
  BAR, so a use subregion rather than manually adjusting our offset.
  
  Approved by:	grehan (implicit)

Modified:
  projects/vmxnet/sys/dev/vmware/vmxnet/if_vic.c
  projects/vmxnet/sys/dev/vmware/vmxnet/if_vicvar.h

Modified: projects/vmxnet/sys/dev/vmware/vmxnet/if_vic.c
==============================================================================
--- projects/vmxnet/sys/dev/vmware/vmxnet/if_vic.c	Tue Jan  8 07:25:29 2013	(r245158)
+++ projects/vmxnet/sys/dev/vmware/vmxnet/if_vic.c	Tue Jan  8 07:32:38 2013	(r245159)
@@ -419,8 +419,6 @@ static uint32_t
 vic_read(struct vic_softc *sc, bus_size_t r)
 {
 
-	r += sc->vic_ioadj;
-
 	bus_space_barrier(sc->vic_iot, sc->vic_ioh, r, 4,
 	    BUS_SPACE_BARRIER_READ);
 	return (bus_space_read_4(sc->vic_iot, sc->vic_ioh, r));
@@ -430,8 +428,6 @@ static void
 vic_write(struct vic_softc *sc, bus_size_t r, uint32_t v)
 {
 
-	r += sc->vic_ioadj;
-
 	bus_space_write_4(sc->vic_iot, sc->vic_ioh, r, v);
 	bus_space_barrier(sc->vic_iot, sc->vic_ioh, r, 4,
 	    BUS_SPACE_BARRIER_WRITE);
@@ -1811,7 +1807,6 @@ vic_get_lladdr(struct vic_softc *sc)
 	uint32_t r;
 
 	r = (sc->vic_cap & VIC_CMD_HWCAP_VPROM) ? VIC_VPROM : VIC_LLADDR;
-	r += sc->vic_ioadj;
 
 	bus_space_barrier(sc->vic_iot, sc->vic_ioh, r, ETHER_ADDR_LEN,
 	    BUS_SPACE_BARRIER_READ);
@@ -1826,13 +1821,10 @@ vic_get_lladdr(struct vic_softc *sc)
 static void
 vic_set_lladdr(struct vic_softc *sc)
 {
-	uint32_t r;
 
-	r = VIC_LLADDR + sc->vic_ioadj;
-
-	bus_space_write_region_1(sc->vic_iot, sc->vic_ioh, r,
+	bus_space_write_region_1(sc->vic_iot, sc->vic_ioh, VIC_LLADDR,
 	    sc->vic_lladdr, ETHER_ADDR_LEN);
-	bus_space_barrier(sc->vic_iot, sc->vic_ioh, r,
+	bus_space_barrier(sc->vic_iot, sc->vic_ioh, VIC_LLADDR,
 	    ETHER_ADDR_LEN, BUS_SPACE_BARRIER_WRITE);
 }
 
@@ -1947,7 +1939,7 @@ vic_pcnet_restore(struct vic_softc *sc)
 	uint32_t morph;
 
 	sc->vic_flags &= ~VIC_FLAGS_MORPHED_PCNET;
-	sc->vic_ioadj = 0;
+	sc->vic_ioh = sc->vic_orig_ioh;
 
 	morph = vic_read(sc, VIC_LANCE_SIZE);
 	morph &= ~VIC_MORPH_MASK;
@@ -1960,12 +1952,22 @@ vic_pcnet_transform(struct vic_softc *sc
 {
 	device_t dev;
 	uint32_t morph;
+	bus_space_handle_t handle;
+	int error;
 
 	dev = sc->vic_dev;
 
 	if (rman_get_size(sc->vic_res) < VIC_LANCE_MINLEN)
 		return (ENOSPC);
 
+	/* Set up the subregion now - it doesn't require any cleanup. */
+	error = bus_space_subregion(sc->vic_iot, sc->vic_ioh,
+	    VIC_LANCE_SIZE + VIC_MORPH_SIZE, VIC_VMXNET_SIZE, &handle);
+	if (error) {
+		device_printf(dev, "unable to create bus space subregion\n");
+		return (error);
+	}
+
 	morph = vic_read(sc, VIC_LANCE_SIZE);
 	if ((morph & VIC_MORPH_MASK) == VIC_MORPH_VMXNET)
 		goto morphed;
@@ -1988,7 +1990,9 @@ vic_pcnet_transform(struct vic_softc *sc
 
 morphed:
 	sc->vic_flags |= VIC_FLAGS_MORPHED_PCNET;
-	sc->vic_ioadj = VIC_LANCE_SIZE + VIC_MORPH_SIZE;
+	sc->vic_orig_ioh = sc->vic_ioh;
+	sc->vic_ioh = handle;
+
 	if (bootverbose)
 		device_printf(dev, "transformed PCNet into VMXNET\n");
 

Modified: projects/vmxnet/sys/dev/vmware/vmxnet/if_vicvar.h
==============================================================================
--- projects/vmxnet/sys/dev/vmware/vmxnet/if_vicvar.h	Tue Jan  8 07:25:29 2013	(r245158)
+++ projects/vmxnet/sys/dev/vmware/vmxnet/if_vicvar.h	Tue Jan  8 07:32:38 2013	(r245159)
@@ -70,7 +70,7 @@ struct vic_softc {
 	struct resource		*vic_res;
 	bus_space_tag_t		 vic_iot;
 	bus_space_handle_t	 vic_ioh;
-	int			 vic_ioadj;
+	bus_space_handle_t	 vic_orig_ioh;
 
 	bus_dma_tag_t		 vic_dma_tag;
 	bus_dmamap_t		 vic_dma_map;



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201301080732.r087Wc4E068569>