cbb patch: fixing the can't reinsert a card problem
M. Warner Losh
imp at bsdimp.com
Tue Jul 10 22:44:18 UTC 2007
Last call. I plan to commit this unless people complain. And
complain SOON!
Warner
In message: <20070620.234419.-1540389296.imp at bsdimp.com>
"M. Warner Losh" <imp at bsdimp.com> writes:
: Index: pccbb.c
: ===================================================================
: RCS file: /cache/ncvs/src/sys/dev/pccbb/pccbb.c,v
: retrieving revision 1.164
: diff -u -r1.164 pccbb.c
: --- pccbb.c 4 Jun 2007 05:59:44 -0000 1.164
: +++ pccbb.c 21 Jun 2007 05:21:55 -0000
: @@ -344,7 +344,7 @@
: sc->flags |= CBB_KTHREAD_DONE;
: while (sc->flags & CBB_KTHREAD_RUNNING) {
: DEVPRINTF((sc->dev, "Waiting for thread to die\n"));
: - cv_broadcast(&sc->cv);
: + wakeup(&sc->intrhand);
: msleep(sc->event_thread, &sc->mtx, PWAIT, "cbbun", 0);
: }
: mtx_unlock(&sc->mtx);
: @@ -353,8 +353,6 @@
: bus_release_resource(brdev, SYS_RES_MEMORY, CBBR_SOCKBASE,
: sc->base_res);
: mtx_destroy(&sc->mtx);
: - cv_destroy(&sc->cv);
: - cv_destroy(&sc->powercv);
: return (0);
: }
:
: @@ -435,11 +433,8 @@
: }
: free(devlist, M_TEMP);
:
: - if (wake > 0) {
: - mtx_lock(&sc->mtx);
: - cv_signal(&sc->cv);
: - mtx_unlock(&sc->mtx);
: - }
: + if (wake > 0)
: + wakeup(&sc->intrhand);
: }
:
: void
: @@ -519,12 +514,14 @@
: * a chance to run.
: */
: mtx_lock(&sc->mtx);
: - cbb_setb(sc, CBB_SOCKET_MASK, CBB_SOCKET_MASK_CD);
: - cv_wait(&sc->cv, &sc->mtx);
: + printf("Setting change request and waiting\n");
: + cbb_setb(sc, CBB_SOCKET_MASK, CBB_SOCKET_MASK_CD | CBB_SOCKET_MASK_CSTS);
: + msleep(&sc->intrhand, &sc->mtx, PZERO, "-", 0);
: err = 0;
: + printf("Wokeup after change, debouncing\n");
: while (err != EWOULDBLOCK &&
: (sc->flags & CBB_KTHREAD_DONE) == 0)
: - err = cv_timedwait(&sc->cv, &sc->mtx, hz / 4);
: + err = msleep(&sc->intrhand, &sc->mtx, PZERO, "-", hz / 5);
: }
: DEVPRINTF((sc->dev, "Thread terminating\n"));
: sc->flags &= ~CBB_KTHREAD_RUNNING;
: @@ -800,7 +797,7 @@
: sane = 10;
: while (!(cbb_get(sc, CBB_SOCKET_STATE) & CBB_STATE_POWER_CYCLE) &&
: cnt == sc->powerintr && sane-- > 0)
: - cv_timedwait(&sc->powercv, &sc->mtx, hz / 20);
: + msleep(&sc->powerintr, &sc->mtx, PZERO, "-", hz / 20);
: mtx_unlock(&sc->mtx);
: /*
: * The TOPIC95B requires a little bit extra time to get
: @@ -1534,9 +1531,7 @@
: cbb_setb(sc, CBB_SOCKET_MASK, CBB_SOCKET_MASK_CD);
:
: /* Signal the thread to wakeup. */
: - mtx_lock(&sc->mtx);
: - cv_signal(&sc->cv);
: - mtx_unlock(&sc->mtx);
: + wakeup(&sc->intrhand);
:
: error = bus_generic_resume(self);
:
: Index: pccbb_pci.c
: ===================================================================
: RCS file: /cache/ncvs/src/sys/dev/pccbb/pccbb_pci.c,v
: retrieving revision 1.25
: diff -u -r1.25 pccbb_pci.c
: --- pccbb_pci.c 4 Jun 2007 05:59:44 -0000 1.25
: +++ pccbb_pci.c 21 Jun 2007 05:32:50 -0000
: @@ -117,7 +117,7 @@
: pci_read_config(DEV, REG, SIZE) MASK1) MASK2, SIZE)
:
: static void cbb_chipinit(struct cbb_softc *sc);
: -static void cbb_pci_intr(void *arg);
: +static int cbb_pci_filt(void *arg);
:
: static struct yenta_chipinfo {
: uint32_t yc_id;
: @@ -310,8 +310,6 @@
:
: parent = device_get_parent(brdev);
: mtx_init(&sc->mtx, device_get_nameunit(brdev), "cbb", MTX_DEF);
: - cv_init(&sc->cv, "cbb cv");
: - cv_init(&sc->powercv, "cbb cv");
: sc->chipset = cbb_chipset(pci_get_devid(brdev), NULL);
: sc->dev = brdev;
: sc->cbdev = NULL;
: @@ -328,7 +326,6 @@
: if (!sc->base_res) {
: device_printf(brdev, "Could not map register memory\n");
: mtx_destroy(&sc->mtx);
: - cv_destroy(&sc->cv);
: return (ENOMEM);
: } else {
: DEVPRINTF((brdev, "Found memory at %08lx\n",
: @@ -410,7 +407,7 @@
: }
:
: if (bus_setup_intr(brdev, sc->irq_res, INTR_TYPE_AV | INTR_MPSAFE,
: - NULL, cbb_pci_intr, sc, &sc->intrhand)) {
: + cbb_pci_filt, NULL, sc, &sc->intrhand)) {
: device_printf(brdev, "couldn't establish interrupt\n");
: goto err;
: }
: @@ -445,7 +442,6 @@
: sc->base_res);
: }
: mtx_destroy(&sc->mtx);
: - cv_destroy(&sc->cv);
: return (ENOMEM);
: }
:
: @@ -680,8 +676,9 @@
: return (0);
: }
:
: -static void
: -cbb_pci_intr(void *arg)
: +#define DELTA (CBB_SOCKET_MASK_CD)
: +static int
: +cbb_pci_filt(void *arg)
: {
: struct cbb_softc *sc = arg;
: uint32_t sockevent;
: @@ -699,9 +696,6 @@
: */
: sockevent = cbb_get(sc, CBB_SOCKET_EVENT);
: if (sockevent != 0 && (sockevent & ~CBB_SOCKET_EVENT_VALID_MASK) == 0) {
: - /* ack the interrupt */
: - cbb_set(sc, CBB_SOCKET_EVENT, sockevent);
: -
: /*
: * If anything has happened to the socket, we assume that
: * the card is no longer OK, and we shouldn't call its
: @@ -715,23 +709,22 @@
: * of the pccard software used a similar trick and achieved
: * excellent results.
: */
: - if (sockevent & CBB_SOCKET_EVENT_CD) {
: - mtx_lock(&sc->mtx);
: - cbb_clrb(sc, CBB_SOCKET_MASK, CBB_SOCKET_MASK_CD);
: + if (sockevent & DELTA) {
: + cbb_clrb(sc, CBB_SOCKET_MASK, DELTA);
: + cbb_set(sc, CBB_SOCKET_EVENT, DELTA);
: sc->cardok = 0;
: cbb_disable_func_intr(sc);
: - cv_signal(&sc->cv);
: - mtx_unlock(&sc->mtx);
: + wakeup(&sc->intrhand);
: }
: /*
: * If we get a power interrupt, wakeup anybody that might
: * be waiting for one.
: */
: if (sockevent & CBB_SOCKET_EVENT_POWER) {
: - mtx_lock(&sc->mtx);
: + cbb_clrb(sc, CBB_SOCKET_MASK, CBB_SOCKET_EVENT_POWER);
: + cbb_set(sc, CBB_SOCKET_EVENT, CBB_SOCKET_EVENT_POWER);
: sc->powerintr++;
: - cv_signal(&sc->powercv);
: - mtx_unlock(&sc->mtx);
: + wakeup((void *)&sc->powerintr);
: }
: }
: /*
: @@ -747,6 +740,7 @@
: * the event independent of the CBB_SOCKET_EVENT_CD above.
: */
: exca_getb(&sc->exca[0], EXCA_CSC);
: + return FILTER_HANDLED;
: }
:
: /************************************************************************/
: Index: pccbbvar.h
: ===================================================================
: RCS file: /cache/ncvs/src/sys/dev/pccbb/pccbbvar.h,v
: retrieving revision 1.31
: diff -u -r1.31 pccbbvar.h
: --- pccbbvar.h 4 Jun 2007 05:59:44 -0000 1.31
: +++ pccbbvar.h 21 Jun 2007 05:24:13 -0000
: @@ -66,8 +66,6 @@
: unsigned int secbus;
: unsigned int subbus;
: struct mtx mtx;
: - struct cv cv;
: - struct cv powercv;
: int cardok;
: u_int32_t flags;
: #define CBB_16BIT_CARD 0x20000000
: @@ -88,7 +86,7 @@
: device_t cbdev;
: struct proc *event_thread;
: void (*chipinit)(struct cbb_softc *);
: - volatile int powerintr;
: + int powerintr;
: };
:
: /* result of detect_card */
More information about the freebsd-mobile
mailing list