Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 16 Aug 2002 18:08:31 -0500
From:      dmk <gh@over-yonder.net>
To:        Robert Watson <rwatson@freebsd.org>
Cc:        freebsd-current@freebsd.org
Subject:   Re: emulators/rtc and vmware2
Message-ID:  <20020816230831.GD35400@over-yonder.net>
In-Reply-To: <Pine.NEB.3.96L.1020815133521.8976D-100000@fledge.watson.org>
References:  <20020815121105.GA35400@over-yonder.net> <Pine.NEB.3.96L.1020815133521.8976D-100000@fledge.watson.org>

next in thread | previous in thread | raw e-mail | index | archive | help

--mojUlQ0s9EVzWg2t
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline

On Thu, 15 Aug 2002, dmk wrote:
> 
> Is anybody successfully using the port emulators/rtc with vmware2 on
> -current?
[...]

On Thu, Aug 15, 2002 at 01:36:46PM -0400 Robert Watson wrote:
> My recollection is that the problem relates to calling make_dev() from the
> attach routine, and attach from the open call, and of course you can't
> open before you make_dev with devfs.  Someone needs to restructure the
> driver to match some our other pseudo-device drivers where the device is
> properly created as part of module initialization.  
[...]
> Robert N M Watson             FreeBSD Core Team, TrustedBSD Projects
> robert@fledge.watson.org      Network Associates Laboratories

The attached diff effectively restructures the rtc device driver to
perform the make_dev() at module load. The driver may have problems, but
it does work, and, unlike the first diff, doesn't segfault on unload. ;-)

(I don't claim to write C or hack kernels, so this presented as-is in
that it "works for me.")

Daniel M. Kurry


--mojUlQ0s9EVzWg2t
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment; filename="rtc.diff"

--- rtc.c.bk	Thu Aug 15 03:50:21 2002
+++ rtc.c	Thu Aug 15 12:08:00 2002
@@ -77,6 +77,8 @@
 
 static struct rtc_softc *rtc_sc=NULL;
 
+static dev_t	rtc_dev=NULL;
+
 static d_open_t		rtc_open;
 static d_close_t 	rtc_close;
 static d_ioctl_t	rtc_ioctl;
@@ -115,43 +117,6 @@
 
 /* -=-=-=-=-=-=-=-=-= attach/detach device stuff -=-=-=-=-=-=-=-=-= */
 
-static struct rtc_softc *
-rtc_attach(dev_t dev)
-{
-	struct rtc_softc *sc;
-	int unit;
-
-#if __FreeBSD_version >= 500014
-	unit = dev2unit(dev);
-#else
-	unit = lminor(dev);
-#endif
-	DLog(Lenter, "%d %p", unit, dev);
-	if (dev->si_drv1) {
-		DLog(Lexit, "old %p, %p", dev, dev->si_drv1);
-		return dev->si_drv1;
-	}
-
-	if (rtc_sc!=NULL)
-		return NULL;
-
-  	dev = make_dev(&rtc_cdevsw, minor(dev), UID_ROOT, GID_WHEEL, 0600, DEVICE_NAME); 
-	if (dev==NULL)
-		return (NULL);
-
-	MALLOC(sc, struct rtc_softc*, sizeof(*sc), M_DEVBUF, M_WAITOK);
-	if (sc==NULL)
-		return NULL;
-
-	bzero(sc, sizeof(*sc));
-	rtc_sc = sc;
-	dev->si_drv1 = sc; /* Link together */
-	sc->dev = dev;
-	
-	DLog(Lexit, "new %p,%p", dev, sc);
-	return sc;
-}
-
 static int
 rtc_detach(struct rtc_softc *sc) 
 {
@@ -163,7 +128,7 @@
 	if (sc->var.flags.opened) {
 		return EBUSY;
 	}
-	destroy_dev(sc->dev);
+	destroy_dev(rtc_sc->dev);
 	FREE(sc, M_DEVBUF);
 	return error;
 }
@@ -177,9 +142,8 @@
 rtc_open(dev_t dev, int oflag, int otyp, struct proc *p)
 #endif
 {
-	struct rtc_softc *sc;
+	struct rtc_softc *sc = (struct rtc_softc *) dev->si_drv1;
 	
-	sc = rtc_attach(dev);
 	
 	if (sc==NULL)
 		return (EAGAIN);
@@ -264,7 +228,21 @@
 static int
 init_module(void)
 {
-int error;
+	int error;
+	struct rtc_softc *sc;
+
+	rtc_dev = make_dev(&rtc_cdevsw, 0, UID_ROOT, GID_WHEEL, 0600, DEVICE_NAME);
+	if(rtc_dev==NULL)
+		return (NULL);
+
+	MALLOC(sc, struct rtc_softc*, sizeof(*sc), M_DEVBUF, M_WAITOK);
+	if(sc==NULL)
+		return NULL;
+
+	bzero(sc, sizeof(*sc));
+	rtc_sc = sc;
+	rtc_dev->si_drv1 = rtc_sc; /* Link together */
+	rtc_sc->dev = rtc_dev;
 
    	error = cdevsw_add(&rtc_cdevsw);
 	if (error) 

--mojUlQ0s9EVzWg2t--

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-current" in the body of the message




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