Module Name: src Committed By: dyoung Date: Thu May 21 17:32:32 UTC 2009
Modified Files: src/sys/dev/cardbus: cardslot.c src/sys/dev/pci: pccbb.c Log Message: Let us detach pcmcia0 and cardbus0 at cardslot0, and cardslot0 at cardbus0. To generate a diff of this commit: cvs rdiff -u -r1.49 -r1.50 src/sys/dev/cardbus/cardslot.c cvs rdiff -u -r1.187 -r1.188 src/sys/dev/pci/pccbb.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/dev/cardbus/cardslot.c diff -u src/sys/dev/cardbus/cardslot.c:1.49 src/sys/dev/cardbus/cardslot.c:1.50 --- src/sys/dev/cardbus/cardslot.c:1.49 Tue May 12 14:17:31 2009 +++ src/sys/dev/cardbus/cardslot.c Thu May 21 17:32:32 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: cardslot.c,v 1.49 2009/05/12 14:17:31 cegger Exp $ */ +/* $NetBSD: cardslot.c,v 1.50 2009/05/21 17:32:32 dyoung Exp $ */ /* * Copyright (c) 1999 and 2000 @@ -33,7 +33,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: cardslot.c,v 1.49 2009/05/12 14:17:31 cegger Exp $"); +__KERNEL_RCSID(0, "$NetBSD: cardslot.c,v 1.50 2009/05/21 17:32:32 dyoung Exp $"); #include "opt_cardslot.h" @@ -64,6 +64,7 @@ +STATIC void cardslotchilddet(device_t, device_t); STATIC void cardslotattach(device_t, device_t, void *); STATIC int cardslotdetach(device_t, int); @@ -76,7 +77,7 @@ const int *, void *); CFATTACH_DECL3_NEW(cardslot, sizeof(struct cardslot_softc), - cardslotmatch, cardslotattach, cardslotdetach, NULL, NULL, NULL, + cardslotmatch, cardslotattach, cardslotdetach, NULL, NULL, cardslotchilddet, DVF_DETACH_SHUTDOWN); STATIC int @@ -93,7 +94,19 @@ return 1; } +STATIC void +cardslotchilddet(device_t self, device_t child) +{ + struct cardslot_softc *sc = device_private(self); + KASSERT(sc->sc_cb_softc == device_private(child) || + sc->sc_16_softc == child); + + if (sc->sc_cb_softc == device_private(child)) + sc->sc_cb_softc = NULL; + else if (sc->sc_16_softc == child) + sc->sc_16_softc = NULL; +} STATIC void cardslotattach(device_t parent, device_t self, Index: src/sys/dev/pci/pccbb.c diff -u src/sys/dev/pci/pccbb.c:1.187 src/sys/dev/pci/pccbb.c:1.188 --- src/sys/dev/pci/pccbb.c:1.187 Wed May 6 09:25:16 2009 +++ src/sys/dev/pci/pccbb.c Thu May 21 17:32:32 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: pccbb.c,v 1.187 2009/05/06 09:25:16 cegger Exp $ */ +/* $NetBSD: pccbb.c,v 1.188 2009/05/21 17:32:32 dyoung Exp $ */ /* * Copyright (c) 1998, 1999 and 2000 @@ -31,7 +31,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: pccbb.c,v 1.187 2009/05/06 09:25:16 cegger Exp $"); +__KERNEL_RCSID(0, "$NetBSD: pccbb.c,v 1.188 2009/05/21 17:32:32 dyoung Exp $"); /* #define CBB_DEBUG @@ -99,6 +99,7 @@ int pcicbbmatch(device_t, cfdata_t, void *); void pccbbattach(device_t, device_t, void *); +void pccbbchilddet(device_t, device_t); int pccbbdetach(device_t, int); int pccbbintr(void *); static void pci113x_insert(void *); @@ -212,7 +213,7 @@ #endif CFATTACH_DECL3_NEW(cbb_pci, sizeof(struct pccbb_softc), - pcicbbmatch, pccbbattach, pccbbdetach, NULL, NULL, NULL, + pcicbbmatch, pccbbattach, pccbbdetach, NULL, NULL, pccbbchilddet, DVF_DETACH_SHUTDOWN); static const struct pcmcia_chip_functions pccbb_pcmcia_funcs = { @@ -391,6 +392,20 @@ } void +pccbbchilddet(device_t self, device_t child) +{ + struct pccbb_softc *sc = device_private(self); + int s; + + KASSERT(sc->sc_csc == device_private(child)); + + s = splbio(); + if (sc->sc_csc == device_private(child)) + sc->sc_csc = NULL; + splx(s); +} + +void pccbbattach(device_t parent, device_t self, void *aux) { struct pccbb_softc *sc = device_private(self); @@ -1030,6 +1045,7 @@ pccbbintr(void *arg) { struct pccbb_softc *sc = (struct pccbb_softc *)arg; + struct cardslot_softc *csc; u_int32_t sockevent, sockstate; bus_space_tag_t memt = sc->sc_base_memt; bus_space_handle_t memh = sc->sc_base_memh; @@ -1087,14 +1103,16 @@ device_xname(sc->sc_dev), sockevent)); DPRINTF((" card removed, 0x%08x\n", sockstate)); sc->sc_flags &= ~CBB_CARDEXIST; - if (sc->sc_csc->sc_status & + if ((csc = sc->sc_csc) == NULL) + ; + else if (csc->sc_status & CARDSLOT_STATUS_CARD_16) { - cardslot_event_throw(sc->sc_csc, + cardslot_event_throw(csc, CARDSLOT_EVENT_REMOVAL_16); - } else if (sc->sc_csc->sc_status & + } else if (csc->sc_status & CARDSLOT_STATUS_CARD_CB) { /* Cardbus intr removed */ - cardslot_event_throw(sc->sc_csc, + cardslot_event_throw(csc, CARDSLOT_EVENT_REMOVAL_CB); } } else if (sc->sc_flags & CBB_INSERTING) { @@ -1148,6 +1166,7 @@ pci113x_insert(void *arg) { struct pccbb_softc *sc = arg; + struct cardslot_softc *csc; u_int32_t sockevent, sockstate; if (!(sc->sc_flags & CBB_INSERTING)) { @@ -1166,14 +1185,14 @@ DPRINTF((" card inserted, 0x%08x\n", sockstate)); sc->sc_flags |= CBB_CARDEXIST; /* call pccard interrupt handler here */ - if (sockstate & CB_SOCKET_STAT_16BIT) { + if ((csc = sc->sc_csc) == NULL) + ; + else if (sockstate & CB_SOCKET_STAT_16BIT) { /* 16-bit card found */ - cardslot_event_throw(sc->sc_csc, - CARDSLOT_EVENT_INSERTION_16); + cardslot_event_throw(csc, CARDSLOT_EVENT_INSERTION_16); } else if (sockstate & CB_SOCKET_STAT_CB) { /* cardbus card found */ - cardslot_event_throw(sc->sc_csc, - CARDSLOT_EVENT_INSERTION_CB); + cardslot_event_throw(csc, CARDSLOT_EVENT_INSERTION_CB); } else { /* who are you? */ }