Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 3 Jul 2012 12:40:07 +0200
From:      Matthias Apitz <guru@unixarea.de>
To:        Kaho Toshikazu <kaho@ed.niigata-u.ac.jp>
Cc:        freebsd-current@freebsd.org, Hans Petter Selasky <hselasky@c2i.net>
Subject:   Re: no keyboard after booting r235646 in laptop FS Amilo D 7830
Message-ID:  <20120703104007.GA2780@tinyCurrent>
In-Reply-To: <6039.1341276697@pf2.ed.niigata-u.ac.jp>
References:  <20120629133422.GA2233@tiny.Sisis.de> <201206301349.58930.erich@alogreentechnologies.com> <20120630151130.GA1106@tiny.Sisis.de> <201207010629.29148.erich@alogreentechnologies.com> <20120701065849.GA2681@tinyCurrent> <6039.1341276697@pf2.ed.niigata-u.ac.jp>

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

--9amGYk9869ThD9tj
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
Content-Transfer-Encoding: 8bit

El día Tuesday, July 03, 2012 a las 09:51:37AM +0900, Kaho Toshikazu escribió:

>   Hello Matthias Apitz and -current member,
> 
>   "sys/dev/atkbdc/atkbdc_isa.c" may not have your keyboard controller's ID.
> Run `acpidump -dt` and search your keyboard description. 
> Is your keyboard controller "PNP0303" ?
> 
> -- 
> kaho@ed.niigata-u.ac.jp

Hello Kaho Toshikazu and all,

The command `acpidump -dt` in both releases (r214444 and r235646) gives
an error:

# acpidump -dt > /tmp/acpidump-r214444.txt
acpidump: RSDT entry 2 (sig OEMB) is corrupt

the output in r235646 is only some 70 lines and in r214444 I do not see
any keyboard related; so I can't answer your question if the
keyboard controller is "PNP0303";

Based on r235646 sources, I have checked the SVN-diff between r214444
(where the keyboard is working) and r235646, see attachment
/tmp/atkbdc_isa.c-r214444:r235646; and the logic of the kb detection has
changed; I will just give it a try and will revert this SVN change, i.e.
'svn up -r r214444 atkbdc_isa.c
to see if this works... it does not help;

Thanks

	matthias
-- 
Matthias Apitz
t +49-89-61308 351 - f +49-89-61308 399 - m +49-170-4527211
e <guru@unixarea.de> - w http://www.unixarea.de/
UNIX since V7 on PDP-11 | UNIX on mainframe since ESER 1055 (IBM /370)
UNIX on x86 since SVR4.2 UnixWare 2.1.2 | FreeBSD since 2.2.5

--9amGYk9869ThD9tj
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment; filename="atkbdc_isa.c-r214444:r235646"

Index: atkbdc_isa.c
===================================================================
--- atkbdc_isa.c	(revision 214444)
+++ atkbdc_isa.c	(revision 235646)
@@ -49,6 +49,11 @@
 static int	atkbdc_isa_attach(device_t dev);
 static device_t	atkbdc_isa_add_child(device_t bus, u_int order, const char *name,
 		    int unit);
+static struct resource *atkbdc_isa_alloc_resource(device_t dev, device_t child,
+		    int type, int *rid, u_long start, u_long end,
+		    u_long count, u_int flags);
+static int	atkbdc_isa_release_resource(device_t dev, device_t child,
+		    int type, int rid, struct resource *r);
 
 static device_method_t atkbdc_isa_methods[] = {
 	DEVMETHOD(device_probe,		atkbdc_isa_probe),
@@ -61,8 +66,8 @@
 	DEVMETHOD(bus_read_ivar,	atkbdc_read_ivar),
 	DEVMETHOD(bus_write_ivar,	atkbdc_write_ivar),
 	DEVMETHOD(bus_get_resource_list,atkbdc_get_resource_list),
-	DEVMETHOD(bus_alloc_resource,	bus_generic_rl_alloc_resource),
-	DEVMETHOD(bus_release_resource,	bus_generic_rl_release_resource),
+	DEVMETHOD(bus_alloc_resource,	atkbdc_isa_alloc_resource),
+	DEVMETHOD(bus_release_resource,	atkbdc_isa_release_resource),
 	DEVMETHOD(bus_activate_resource, bus_generic_activate_resource),
 	DEVMETHOD(bus_deactivate_resource, bus_generic_deactivate_resource),
 	DEVMETHOD(bus_get_resource,	bus_generic_rl_get_resource),
@@ -82,6 +87,7 @@
 
 static struct isa_pnp_id atkbdc_ids[] = {
 	{ 0x0303d041, "Keyboard controller (i8042)" },	/* PNP0303 */
+	{ 0x2003d041, "Keyboard controller (i8042)" },	/* PNP0320 */
 	{ 0 }
 };
 
@@ -170,8 +176,6 @@
 	device_verbose(dev);
 
 	error = atkbdc_probe_unit(device_get_unit(dev), port0, port1);
-	if (error == 0)
-		bus_generic_probe(dev);
 
 	bus_release_resource(dev, SYS_RES_IOPORT, 0, port0);
 	bus_release_resource(dev, SYS_RES_IOPORT, 1, port1);
@@ -216,14 +220,25 @@
 		return ENXIO;
 	}
 
+	/*
+	 * If the device is not created by the PnP BIOS or ACPI, then
+	 * the hint for the IRQ is on the child atkbd device, not the
+	 * keyboard controller, so this can fail.
+	 */
+	rid = 0;
+	sc->irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid, RF_ACTIVE);
+
 	error = atkbdc_attach_unit(unit, sc, sc->port0, sc->port1);
 	if (error) {
 		bus_release_resource(dev, SYS_RES_IOPORT, 0, sc->port0);
 		bus_release_resource(dev, SYS_RES_IOPORT, 1, sc->port1);
+		if (sc->irq != NULL)
+			bus_release_resource(dev, SYS_RES_IRQ, 0, sc->irq);
 		return error;
 	}
 	*(atkbdc_softc_t **)device_get_softc(dev) = sc;
 
+	bus_generic_probe(dev);
 	bus_generic_attach(dev);
 
 	return 0;
@@ -233,9 +248,11 @@
 atkbdc_isa_add_child(device_t bus, u_int order, const char *name, int unit)
 {
 	atkbdc_device_t	*ivar;
+	atkbdc_softc_t	*sc;
 	device_t	child;
 	int		t;
 
+	sc = *(atkbdc_softc_t **)device_get_softc(bus);
 	ivar = malloc(sizeof(struct atkbdc_device), M_ATKBDDEV,
 		M_NOWAIT | M_ZERO);
 	if (!ivar)
@@ -251,18 +268,21 @@
 	ivar->rid = order;
 
 	/*
-	 * If the device is not created by the PnP BIOS or ACPI,
-	 * refer to device hints for IRQ.
+	 * If the device is not created by the PnP BIOS or ACPI, refer
+	 * to device hints for IRQ.  We always populate the resource
+	 * list entry so we can use a standard bus_get_resource()
+	 * method.
 	 */
-	if (ISA_PNP_PROBE(device_get_parent(bus), bus, atkbdc_ids) != 0) {
-		if (resource_int_value(name, unit, "irq", &t) != 0)
-			t = -1;
-	} else {
-		t = bus_get_resource_start(bus, SYS_RES_IRQ, ivar->rid);
+	if (order == KBDC_RID_KBD) {
+		if (sc->irq == NULL) {
+			if (resource_int_value(name, unit, "irq", &t) != 0)
+				t = -1;
+		} else
+			t = rman_get_start(sc->irq);
+		if (t > 0)
+			resource_list_add(&ivar->resources, SYS_RES_IRQ,
+			    ivar->rid, t, t, 1);
 	}
-	if (t > 0)
-		resource_list_add(&ivar->resources, SYS_RES_IRQ, ivar->rid,
-				  t, t, 1);
 
 	if (resource_disabled(name, unit))
 		device_disable(child);
@@ -272,5 +292,30 @@
 	return child;
 }
 
+struct resource *
+atkbdc_isa_alloc_resource(device_t dev, device_t child, int type, int *rid,
+    u_long start, u_long end, u_long count, u_int flags)
+{
+	atkbdc_softc_t	*sc;
+	
+	sc = *(atkbdc_softc_t **)device_get_softc(dev);
+	if (type == SYS_RES_IRQ && *rid == KBDC_RID_KBD && sc->irq != NULL)
+		return (sc->irq);
+	return (bus_generic_rl_alloc_resource(dev, child, type, rid, start,
+	    end, count, flags));
+}
+
+static int
+atkbdc_isa_release_resource(device_t dev, device_t child, int type, int rid,
+    struct resource *r)
+{
+	atkbdc_softc_t	*sc;
+	
+	sc = *(atkbdc_softc_t **)device_get_softc(dev);
+	if (type == SYS_RES_IRQ && rid == KBDC_RID_KBD && r == sc->irq)
+		return (0);
+	return (bus_generic_rl_release_resource(dev, child, type, rid, r));
+}
+
 DRIVER_MODULE(atkbdc, isa, atkbdc_isa_driver, atkbdc_devclass, 0, 0);
 DRIVER_MODULE(atkbdc, acpi, atkbdc_isa_driver, atkbdc_devclass, 0, 0);

--9amGYk9869ThD9tj--



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