Date: Sun, 09 Feb 2003 10:06:54 -0700 (MST) From: "M. Warner Losh" <imp@bsdimp.com> To: simokawa@sat.t.u-tokyo.ac.jp Cc: andrea@webcom.it, current@FreeBSD.ORG Subject: Re: firewire hangs on Thinkpad Message-ID: <20030209.100654.133045082.imp@bsdimp.com> In-Reply-To: <ybsy94psbp8.wl@ett.sat.t.u-tokyo.ac.jp> References: <20030129114951.GA3635@webcom.it> <ybs8yx3x6s0.wl@ett.sat.t.u-tokyo.ac.jp> <ybsy94psbp8.wl@ett.sat.t.u-tokyo.ac.jp>
next in thread | previous in thread | raw e-mail | index | archive | help
P.S. With full debugs hw.cbb.debug: 1 hw.cardbus.debug: 1 hw.cardbus.cis_debug: 1 hw.pccard.debug: 1 hw.pccard.cis_debug: 1 I see the following sequence of events in my /var/log/messages: Feb 9 09:52:35 hammer sudo: imp : TTY=ttyp1 ; PWD=/dell/imp ; USER=root ; COMMAND=/sbin/kldload if_rl Feb 9 09:52:40 hammer kernel: cbb_pcic_socket_enable: Feb 9 09:52:40 hammer kernel: cbb1: cbb_power: CARD_VCC_0V and CARD_VPP_0V [44] Feb 9 09:52:40 hammer kernel: cbb1: cbb_power: CARD_VCC_5V and CARD_VPP_VCC [15 ] Feb 9 09:52:40 hammer kernel: an0: RID access failed Most cards do *NOT* like being turned off. This suggests that the following code may be wrong: static void cardbus_driver_added(device_t cbdev, driver_t *driver) { ... device_get_children(cbdev, &devlist, &numdevs); DEVICE_IDENTIFY(driver, cbdev); --> POWER_ENABLE_SOCKET(device_get_parent(cbdev), cbdev); for (tmp = 0; tmp < numdevs; tmp++) { if (device_get_state(devlist[tmp]) == DS_NOTPRESENT) { dinfo = device_get_ivars(devlist[tmp]); ... } At a guess, the POWER_ENABLE_SOCKET should be done later. Or maybe not even at all (the pccard code that does this works :-). In fact, I'm positive that this is what's causing the breakage. Maybe something more like the following would be closer to correct: static void cardbus_driver_added(device_t cbdev, driver_t *driver) { int numdevs; device_t *devlist; int tmp; struct cardbus_devinfo *dinfo; DEVICE_IDENTIFY(driver, cbdev); device_get_children(cbdev, &devlist, &numdevs); for (tmp = 0; tmp < numdevs; tmp++) { if (device_get_state(devlist[tmp]) != DS_NOTPRESENT) continue; dinfo = device_get_ivars(devlist[tmp]); cardbus_print_verbose(dinfo); resource_list_init(&dinfo->pci.resources); cardbus_do_cis(cbdev, dinfo->pci.cfg.dev); if (device_probe_and_attach(dinfo->pci.cfg.dev) != 0) cardbus_release_all_resources(cbdev, dinfo); } free(devlist, M_TEMP); } Warner 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?20030209.100654.133045082.imp>