STATIC void cardslotattach(struct device *parent, struct device *self, void *aux) { struct cardslot_softc *sc = (struct cardslot_softc *)self; struct cardslot_attach_args *caa = aux; struct cbslot_attach_args *cba = caa->caa_cb_attach; struct pcmciabus_attach_args *pa = caa->caa_16_attach; struct cardbus_softc *csc; struct pcmcia_softc *psc; sc->sc_slot = sc->sc_dev.dv_unit; sc->sc_cb_softc = NULL; sc->sc_16_softc = NULL; SIMPLEQ_INIT(&sc->sc_events); sc->sc_th_enable = 0; printf(" slot %d flags %x\n", sc->sc_slot, sc->sc_dev.dv_cfdata->cf_flags); DPRINTF(("%s attaching CardBus bus...\n", sc->sc_dev.dv_xname)); if (cba != NULL) { if ((csc = (void *)config_found(self, cba, cardslot_cb_print)) != NULL) { /* cardbus found */ DPRINTF(("cardslotattach: found cardbus on %s\n", sc->sc_dev.dv_xname)); sc->sc_cb_softc = csc; } } if (pa != NULL) { if ((psc = (void *)config_found_sm(self, pa, cardslot_16_print, cardslot_16_submatch)) != NULL) { /* pcmcia 16-bit bus found */ DPRINTF(("cardslotattach: found 16-bit pcmcia bus\n")); sc->sc_16_softc = psc; /* XXX: dirty. This code should be removed * to achieve MI */ caa->caa_ph->pcmcia = (struct device *)psc; } } if (csc != NULL || psc != NULL) kthread_create_deferred(create_slot_manager, (void *)sc); if (csc && (csc->sc_cf->cardbus_ctrl)(csc->sc_cc, CARDBUS_CD)) { DPRINTF(("cardslotattach: CardBus card found\n")); /* attach deferred */ cardslot_event_throw(sc, CARDSLOT_EVENT_INSERTION_CB); } if (psc && (psc->pct->card_detect)(psc->pch)) { DPRINTF(("cardbusattach: 16-bit card found\n")); /* attach deferred */ cardslot_event_throw(sc, CARDSLOT_EVENT_INSERTION_16); } }
STATIC void cardslotattach(device_t parent, device_t self, void *aux) { struct cardslot_softc *sc = device_private(self); struct cardslot_attach_args *caa = aux; struct cbslot_attach_args *cba = caa->caa_cb_attach; struct pcmciabus_attach_args *pa = caa->caa_16_attach; struct cardbus_softc *csc = NULL; struct pcmcia_softc *psc = NULL; sc->sc_dev = self; sc->sc_cb_softc = NULL; sc->sc_16_softc = NULL; SIMPLEQ_INIT(&sc->sc_events); sc->sc_th_enable = 0; aprint_naive("\n"); aprint_normal("\n"); DPRINTF(("%s attaching CardBus bus...\n", device_xname(self))); if (cba != NULL) { csc = device_private(config_found_ia(self, "cbbus", cba, cardslot_cb_print)); if (csc) { /* cardbus found */ DPRINTF(("%s: found cardbus on %s\n", __func__, device_xname(self))); sc->sc_cb_softc = csc; } } if (pa != NULL) { sc->sc_16_softc = config_found_sm_loc(self, "pcmciabus", NULL, pa, cardslot_16_print, cardslot_16_submatch); if (sc->sc_16_softc) { /* pcmcia 16-bit bus found */ DPRINTF(("%s: found 16-bit pcmcia bus\n", __func__)); psc = device_private(sc->sc_16_softc); } } if (csc != NULL || psc != NULL) { config_pending_incr(self); if (kthread_create(PRI_NONE, 0, NULL, cardslot_event_thread, sc, &sc->sc_event_thread, "%s", device_xname(self))) { aprint_error_dev(sc->sc_dev, "unable to create thread\n"); panic("cardslotattach"); } sc->sc_th_enable = 1; } if (csc && (csc->sc_cf->cardbus_ctrl)(csc->sc_cc, CARDBUS_CD)) { DPRINTF(("%s: CardBus card found\n", __func__)); /* attach deferred */ cardslot_event_throw(sc, CARDSLOT_EVENT_INSERTION_CB); } if (psc && (psc->pct->card_detect)(psc->pch)) { DPRINTF(("%s: 16-bit card found\n", __func__)); /* attach deferred */ cardslot_event_throw(sc, CARDSLOT_EVENT_INSERTION_16); } if (!pmf_device_register(self, NULL, NULL)) aprint_error_dev(self, "couldn't establish power handler\n"); }