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 [EMAIL PROTECTED]
with "unsubscribe freebsd-current" in the body of the message

Reply via email to