Module Name:    src
Committed By:   dyoung
Date:           Thu Jul 23 21:22:25 UTC 2009

Modified Files:
        src/sys/dev/pci: pccbb.c pccbbvar.h

Log Message:
Use kpause(9), cv_timedwait(9), and cv_signal(9) instead of tsleep(9)
and wakeup(9).

Use mstohz(9).

XXX Protection against spurious wakeups is still needed, but this patch
XXX makes the code no worse than before in this regard.


To generate a diff of this commit:
cvs rdiff -u -r1.188 -r1.189 src/sys/dev/pci/pccbb.c
cvs rdiff -u -r1.37 -r1.38 src/sys/dev/pci/pccbbvar.h

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/pci/pccbb.c
diff -u src/sys/dev/pci/pccbb.c:1.188 src/sys/dev/pci/pccbb.c:1.189
--- src/sys/dev/pci/pccbb.c:1.188	Thu May 21 17:32:32 2009
+++ src/sys/dev/pci/pccbb.c	Thu Jul 23 21:22:25 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: pccbb.c,v 1.188 2009/05/21 17:32:32 dyoung Exp $	*/
+/*	$NetBSD: pccbb.c,v 1.189 2009/07/23 21:22:25 dyoung Exp $	*/
 
 /*
  * Copyright (c) 1998, 1999 and 2000
@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pccbb.c,v 1.188 2009/05/21 17:32:32 dyoung Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pccbb.c,v 1.189 2009/07/23 21:22:25 dyoung Exp $");
 
 /*
 #define CBB_DEBUG
@@ -89,12 +89,12 @@
  * of delay() if you want to wait more than 1 ms.
  */
 static inline void
-delay_ms(int millis, void *param)
+delay_ms(int millis, struct pccbb_softc *sc)
 {
 	if (cold)
 		delay(millis * 1000);
 	else
-		tsleep(param, PWAIT, "pccbb", MAX(2, hz * millis / 1000));
+		kpause("pccbb", false, mstohz(millis), NULL);
 }
 
 int pcicbbmatch(device_t, cfdata_t, void *);
@@ -422,6 +422,9 @@
 
 	sc->sc_dev = self;
 
+	mutex_init(&sc->sc_pwr_mtx, MUTEX_DEFAULT, IPL_BIO);
+	cv_init(&sc->sc_pwr_cv, "pccpwr");
+
 	callout_init(&sc->sc_insert_ch, 0);
 	callout_setfunc(&sc->sc_insert_ch, pci113x_insert, sc);
 
@@ -1069,8 +1072,10 @@
 	if (sockevent & CB_SOCKET_EVENT_POWER) {
 		DPRINTF(("Powercycling because of socket event\n"));
 		/* XXX: Does not happen when attaching a 16-bit card */
+		mutex_enter(&sc->sc_pwr_mtx);
 		sc->sc_pwrcycle++;
-		wakeup(&sc->sc_pwrcycle);
+		cv_signal(&sc->sc_pwr_cv);
+		mutex_exit(&sc->sc_pwr_mtx);
 	}
 
 	/* Sometimes a change of CSTSCHG# accompanies the first
@@ -1129,7 +1134,7 @@
 			if (sc->sc_flags & CBB_INSERTING) {
 				callout_stop(&sc->sc_insert_ch);
 			}
-			callout_schedule(&sc->sc_insert_ch, hz / 5);
+			callout_schedule(&sc->sc_insert_ch, mstohz(200));
 			sc->sc_flags |= CBB_INSERTING;
 		}
 	}
@@ -1197,7 +1202,7 @@
 			/* who are you? */
 		}
 	} else {
-		callout_schedule(&sc->sc_insert_ch, hz / 10);
+		callout_schedule(&sc->sc_insert_ch, mstohz(100));
 	}
 }
 
@@ -1285,7 +1290,7 @@
 	u_int32_t status, osock_ctrl, sock_ctrl, reg_ctrl;
 	bus_space_tag_t memt = sc->sc_base_memt;
 	bus_space_handle_t memh = sc->sc_base_memh;
-	int on = 0, pwrcycle, s, times;
+	int on = 0, pwrcycle, times;
 	struct timeval before, after, diff;
 
 	DPRINTF(("pccbb_power: %s and %s [0x%x]\n",
@@ -1352,13 +1357,13 @@
 		sock_ctrl |= CB_SOCKET_CTRL_VPP_12V;
 		break;
 	}
-
-	pwrcycle = sc->sc_pwrcycle;
 	aprint_debug_dev(sc->sc_dev, "osock_ctrl %#" PRIx32
 	    " sock_ctrl %#" PRIx32 "\n", osock_ctrl, sock_ctrl);
 
 	microtime(&before);
-	s = splbio();
+	mutex_enter(&sc->sc_pwr_mtx);
+	pwrcycle = sc->sc_pwrcycle;
+
 	bus_space_write_4(memt, memh, CB_SOCKET_CTRL, sock_ctrl);
 
 	/*
@@ -1380,8 +1385,8 @@
 		if (cold)
 			DELAY(40 * 1000);
 		else {
-			(void)tsleep(&sc->sc_pwrcycle, PWAIT, "pccpwr",
-			    hz / 25);
+			(void)cv_timedwait(&sc->sc_pwr_cv, &sc->sc_pwr_mtx,
+			    mstohz(40));
 			if (pwrcycle == sc->sc_pwrcycle)
 				continue;
 		}
@@ -1391,7 +1396,7 @@
 		if ((status & CB_SOCKET_STAT_PWRCYCLE) == 0 && !on)
 			break;
 	}
-	splx(s);
+	mutex_exit(&sc->sc_pwr_mtx);
 	microtime(&after);
 	timersub(&after, &before, &diff);
 	aprint_debug_dev(sc->sc_dev, "wait took%s %lld.%06lds\n",
@@ -2307,7 +2312,7 @@
 		panic("pccbb_pcmcia_delay: called in interrupt context");
 #endif
 	DPRINTF(("pccbb_pcmcia_delay: \"%s\", sleep %d ms\n", wmesg, timo));
-	tsleep(pccbb_pcmcia_delay, PWAIT, wmesg, roundup(timo * hz, 1000) / 1000);
+	kpause(wmesg, false, max(mstohz(timo), 1), NULL);
 }
 
 /*

Index: src/sys/dev/pci/pccbbvar.h
diff -u src/sys/dev/pci/pccbbvar.h:1.37 src/sys/dev/pci/pccbbvar.h:1.38
--- src/sys/dev/pci/pccbbvar.h:1.37	Thu Jun 26 20:57:10 2008
+++ src/sys/dev/pci/pccbbvar.h	Thu Jul 23 21:22:25 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: pccbbvar.h,v 1.37 2008/06/26 20:57:10 drochner Exp $	*/
+/*	$NetBSD: pccbbvar.h,v 1.38 2009/07/23 21:22:25 dyoung Exp $	*/
 /*
  * Copyright (c) 1999 HAYAKAWA Koichi.  All rights reserved.
  *
@@ -36,6 +36,9 @@
 #ifndef _DEV_PCI_PCCBBVAR_H_
 #define	_DEV_PCI_PCCBBVAR_H_
 
+#include <sys/mutex.h>
+#include <sys/condvar.h>
+
 #define	PCIC_FLAG_SOCKETP	0x0001
 #define	PCIC_FLAG_CARDP		0x0002
 
@@ -133,6 +136,8 @@
 #define	PCCBB_PCMCIA_MEM_32	0x02	/* 32-bit memory address ready */
 
 	volatile int sc_pwrcycle;
+	kcondvar_t sc_pwr_cv;
+	kmutex_t sc_pwr_mtx;
 
 	/* interrupt handler list on the bridge */
 	LIST_HEAD(, pccbb_intrhand_list) sc_pil;

Reply via email to