From owner-freebsd-hackers@FreeBSD.ORG Sat Jan 14 00:41:38 2006 Return-Path: X-Original-To: freebsd-hackers@freebsd.org Delivered-To: freebsd-hackers@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id F338016A41F for ; Sat, 14 Jan 2006 00:41:37 +0000 (GMT) (envelope-from imp@bsdimp.com) Received: from harmony.bsdimp.com (vc4-2-0-87.dsl.netrack.net [199.45.160.85]) by mx1.FreeBSD.org (Postfix) with ESMTP id 2559E43D46 for ; Sat, 14 Jan 2006 00:41:37 +0000 (GMT) (envelope-from imp@bsdimp.com) Received: from localhost (localhost.village.org [127.0.0.1] (may be forged)) by harmony.bsdimp.com (8.13.3/8.13.3) with ESMTP id k0E0dsNl046948; Fri, 13 Jan 2006 17:39:54 -0700 (MST) (envelope-from imp@bsdimp.com) Date: Fri, 13 Jan 2006 17:39:54 -0700 (MST) Message-Id: <20060113.173954.02259183.imp@bsdimp.com> To: NKoch@demig.de From: Warner Losh In-Reply-To: <000701c6184c$d3f27060$4801a8c0@ws-ew-3.demig.intra> References: <000701c6184c$d3f27060$4801a8c0@ws-ew-3.demig.intra> X-Mailer: Mew version 3.3 on Emacs 21.3 / Mule 5.0 (SAKAKI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-2.0 (harmony.bsdimp.com [127.0.0.1]); Fri, 13 Jan 2006 17:39:54 -0700 (MST) Cc: freebsd-hackers@freebsd.org Subject: Re: device probe re-tried for failed isa device X-BeenThere: freebsd-hackers@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Technical Discussions relating to FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 14 Jan 2006 00:41:38 -0000 > I wrote two isa device drivers A and B for FreeBSD4.11. > Both are kld-loaded and have identify() entries. > > Here is the pseudo code for the identify() routines: > > A_identify() /* 2 units */ > { > for (i = 0; i <=1; ++ i) > { > dev = BUS_ADD_CHILD(parent, ISA-ORDER_SPECULATIVE, "a", 0); > If (bus_set_resource (dev, ...) != 0) > { > device_delete_child (parent, dev); > continue; > }; > init (device_get_softc (dev, i)); > } > } Don't get softc in your identify routine. It isn't allowed there. > B_identify() /* 1 unit */ > { > dev = BUS_ADD_CHILD(parent, ISA-ORDER_SPECULATIVE, "a", 0); > If (bus_set_resource (dev, ...) != 0) > { > device_delete_child (parent, dev); > } > } > > When I kldload the two drivers I see these function calls: > 1. A_identify > 2. A_probe(unit 0) > 3. A_attach(unit 0) > 4. A_probe(unit 1) > <-- fails with ENXIO because hardware is not present > 5. B_identify > 6. A_probe(unit 1) > <-- probed again!? Yes. It should be. The child hasn't been deleted. > 7. B_probe(unit 0) > 8. B_attach(unit 0) > > Is it correct, that the isa bus re-tries > to probe failed devices? Yes. > The results from calling device_get_softc() > differ for the two probe() calls 4 and 6. > Is this correct? Yes. softc is only valid if probe() returns 0. It is deleted otherwise. > Is it correct to initialize softc in identify()? No. It isn't, > Should I call device_delete_child() in > probe() when the hardware fails? No. You shouldn't. Warner