Re: cbb patch: fixing the can't reinsert a card problem

"M. Warner Losh" <[email protected]>
Newsgroups gmane.os.freebsd.devel.mobile
Message-ID <[email protected]>
Last call.  I plan to commit this unless people complain.  And
complain SOON!

Warner


In message: <[email protected]>
            "M. Warner Losh" <[email protected]> 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 */
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-mobile
To unsubscribe, send any mail to "[email protected]"
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.