CVS commit: [netbsd-6] src/sys/arch/powerpc/booke/dev

2012-07-03 Thread Julian Coleman
Module Name:src
Committed By:   jdc
Date:   Tue Jul  3 21:16:15 UTC 2012

Modified Files:
src/sys/arch/powerpc/booke/dev [netbsd-6]: pq3etsec.c

Log Message:
Pull up revision 1.10 (requested by matt in ticket #382).

Don't rely on being able to allocate while in a softintr.  So preallocate
all the bus_dma maps in ifinit where we can sleep.


To generate a diff of this commit:
cvs rdiff -u -r1.9.8.1 -r1.9.8.2 src/sys/arch/powerpc/booke/dev/pq3etsec.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/arch/powerpc/booke/dev/pq3etsec.c
diff -u src/sys/arch/powerpc/booke/dev/pq3etsec.c:1.9.8.1 src/sys/arch/powerpc/booke/dev/pq3etsec.c:1.9.8.2
--- src/sys/arch/powerpc/booke/dev/pq3etsec.c:1.9.8.1	Thu May 17 18:09:44 2012
+++ src/sys/arch/powerpc/booke/dev/pq3etsec.c	Tue Jul  3 21:16:15 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: pq3etsec.c,v 1.9.8.1 2012/05/17 18:09:44 riz Exp $	*/
+/*	$NetBSD: pq3etsec.c,v 1.9.8.2 2012/07/03 21:16:15 jdc Exp $	*/
 /*-
  * Copyright (c) 2010, 2011 The NetBSD Foundation, Inc.
  * All rights reserved.
@@ -38,7 +38,7 @@
 
 #include sys/cdefs.h
 
-__KERNEL_RCSID(0, $NetBSD: pq3etsec.c,v 1.9.8.1 2012/05/17 18:09:44 riz Exp $);
+__KERNEL_RCSID(0, $NetBSD: pq3etsec.c,v 1.9.8.2 2012/07/03 21:16:15 jdc Exp $);
 
 #include sys/param.h
 #include sys/cpu.h
@@ -240,7 +240,7 @@ static void pq3etsec_ifstop(struct ifnet
 static int pq3etsec_ifioctl(struct ifnet *, u_long, void *);
 
 static int pq3etsec_mapcache_create(struct pq3etsec_softc *,
-struct pq3etsec_mapcache **, size_t, size_t, size_t, size_t);
+struct pq3etsec_mapcache **, size_t, size_t, size_t);
 static void pq3etsec_mapcache_destroy(struct pq3etsec_softc *,
 struct pq3etsec_mapcache *);
 static bus_dmamap_t pq3etsec_mapcache_get(struct pq3etsec_softc *,
@@ -546,14 +546,14 @@ pq3etsec_attach(device_t parent, device_
 	}
 
 	error = pq3etsec_mapcache_create(sc, sc-sc_rx_mapcache, 
-	ETSEC_MAXRXMBUFS, ETSEC_MINRXMBUFS, MCLBYTES, ETSEC_NRXSEGS);
+	ETSEC_MAXRXMBUFS, MCLBYTES, ETSEC_NRXSEGS);
 	if (error) {
 		aprint_error(: failed to allocate rx dmamaps: %d\n, error);
 		return;
 	}
 
 	error = pq3etsec_mapcache_create(sc, sc-sc_tx_mapcache, 
-	ETSEC_MAXTXMBUFS, ETSEC_MAXTXMBUFS, MCLBYTES, ETSEC_NTXSEGS);
+	ETSEC_MAXTXMBUFS, MCLBYTES, ETSEC_NTXSEGS);
 	if (error) {
 		aprint_error(: failed to allocate tx dmamaps: %d\n, error);
 		return;
@@ -693,6 +693,8 @@ pq3etsec_ifinit(struct ifnet *ifp)
 	struct pq3etsec_softc * const sc = ifp-if_softc;
 	int error = 0;
 
+	KASSERT(!cpu_softintr_p());
+
 	sc-sc_maxfrm = max(ifp-if_mtu + 32, MCLBYTES);
 	if (ifp-if_mtu  ETHERMTU_JUMBO)
 		return error;
@@ -717,8 +719,7 @@ pq3etsec_ifinit(struct ifnet *ifp)
 
 	if (sc-sc_tx_mapcache == NULL) {
 		error = pq3etsec_mapcache_create(sc, sc-sc_tx_mapcache,
-		ETSEC_MAXTXMBUFS, ETSEC_MAXTXMBUFS, sc-sc_maxfrm,
-		ETSEC_NTXSEGS);
+		ETSEC_MAXTXMBUFS, sc-sc_maxfrm, ETSEC_NTXSEGS);
 		if (error)
 			return error;
 	}
@@ -1106,20 +1107,7 @@ pq3etsec_mapcache_get(
 	struct pq3etsec_softc *sc,
 	struct pq3etsec_mapcache *dmc)
 {
-	if (dmc-dmc_nmaps == 0) {
-		bus_dmamap_t map;
-		int error = bus_dmamap_create(sc-sc_dmat, dmc-dmc_maxmapsize,
-			dmc-dmc_maxseg, dmc-dmc_maxmapsize, 0,
-			BUS_DMA_WAITOK|BUS_DMA_ALLOCNOW, map);
-		if (error) {
-			aprint_error_dev(sc-sc_dev,
-			failed to allocate a %zuB map: %d\n,
-			dmc-dmc_maxmapsize, error);
-			return NULL;
-		}
-		return map;
-	}
-
+	KASSERT(dmc-dmc_nmaps  0);
 	KASSERT(dmc-dmc_maps[dmc-dmc_nmaps-1] != NULL);
 	return dmc-dmc_maps[--dmc-dmc_nmaps];
 }
@@ -1154,7 +1142,6 @@ pq3etsec_mapcache_create(
 	struct pq3etsec_softc *sc,
 	struct pq3etsec_mapcache **dmc_p,
 	size_t maxmaps,
-	size_t minmaps,
 	size_t maxmapsize,
 	size_t maxseg)
 {
@@ -1163,19 +1150,19 @@ pq3etsec_mapcache_create(
 	struct pq3etsec_mapcache * const dmc = kmem_zalloc(dmc_size, KM_SLEEP);
 
 	dmc-dmc_maxmaps = maxmaps;
-	dmc-dmc_nmaps = minmaps;
+	dmc-dmc_nmaps = maxmaps;
 	dmc-dmc_maxmapsize = maxmapsize;
 	dmc-dmc_maxseg = maxseg;
 
-	for (u_int i = 0; i  minmaps; i++) {
+	for (u_int i = 0; i  maxmaps; i++) {
 		int error = bus_dmamap_create(sc-sc_dmat, dmc-dmc_maxmapsize,
 		 dmc-dmc_maxseg, dmc-dmc_maxmapsize, 0,
 		 BUS_DMA_WAITOK|BUS_DMA_ALLOCNOW, dmc-dmc_maps[i]);
 		if (error) {
 			aprint_error_dev(sc-sc_dev,
 			failed to creat dma map cache 
-			entry %u of %zu (max %zu): %d\n,
-			i, minmaps, maxmaps, error);
+			entry %u of %zu: %d\n,
+			i, maxmaps, error);
 			while (i--  0) {
 bus_dmamap_destroy(sc-sc_dmat,
 dmc-dmc_maps[i]);



CVS commit: [netbsd-6] src/sys/arch/powerpc/booke/dev

2012-05-09 Thread Jeff Rizzo
Module Name:src
Committed By:   riz
Date:   Wed May  9 22:49:06 UTC 2012

Modified Files:
src/sys/arch/powerpc/booke/dev [netbsd-6]: pq3gpio.c

Log Message:
Pull up following revision(s) (requested by matt in ticket #243):
sys/arch/powerpc/booke/dev/pq3gpio.c: revision 1.5
Fix P2020 GPIO support (which has pins that are input/output instead of just
input or output).


To generate a diff of this commit:
cvs rdiff -u -r1.4 -r1.4.8.1 src/sys/arch/powerpc/booke/dev/pq3gpio.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/arch/powerpc/booke/dev/pq3gpio.c
diff -u src/sys/arch/powerpc/booke/dev/pq3gpio.c:1.4 src/sys/arch/powerpc/booke/dev/pq3gpio.c:1.4.8.1
--- src/sys/arch/powerpc/booke/dev/pq3gpio.c:1.4	Thu Jun 30 04:43:47 2011
+++ src/sys/arch/powerpc/booke/dev/pq3gpio.c	Wed May  9 22:49:06 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: pq3gpio.c,v 1.4 2011/06/30 04:43:47 matt Exp $	*/
+/*	$NetBSD: pq3gpio.c,v 1.4.8.1 2012/05/09 22:49:06 riz Exp $	*/
 /*-
  * Copyright (c) 2010, 2011 The NetBSD Foundation, Inc.
  * All rights reserved.
@@ -35,12 +35,13 @@
  */
 
 #define	GLOBAL_PRIVATE
+#define	GPIO_PRIVATE
 
 #include opt_mpc85xx.h
 
 #include sys/cdefs.h
 
-__KERNEL_RCSID(0, $NetBSD: pq3gpio.c,v 1.4 2011/06/30 04:43:47 matt Exp $);
+__KERNEL_RCSID(0, $NetBSD: pq3gpio.c,v 1.4.8.1 2012/05/09 22:49:06 riz Exp $);
 
 #include sys/param.h
 #include sys/cpu.h
@@ -108,6 +109,19 @@ pq3gpio_pin_write(void *v, int num, int 
 static void
 pq3gpio_pin_ctl(void *v, int num, int ctl)
 {
+	struct pq3gpio_group * const gc = v;
+	const u_int mask = 1  (gc-gc_pins[num].pin_num ^ 31);
+uint32_t old, new; 
+  
+old = bus_space_read_4(gc-gc_bst, gc-gc_bsh, GPDIR);
+new = old;
+switch (ctl  (GPIO_PIN_INPUT|GPIO_PIN_OUTPUT)) {
+case GPIO_PIN_OUTPUT:new |= mask; break;
+case GPIO_PIN_INPUT:   new = ~mask; break;
+default:return;
+}
+if (old != new)
+		bus_space_write_4(gc-gc_bst, gc-gc_bsh, GPDIR, new);
 }
 
 static void
@@ -291,19 +305,21 @@ pq3gpio_p20x0_attach(device_t self, bus_
 	bus_space_handle_t bsh, u_int svr)
 {
 	static const uint32_t gpio2pmuxcr_map[][2] = {
-		{ __BIT(10), PMUXCR_TSEC3_TS|PMUXCR_USB },
-		{ __BIT(11), PMUXCR_TSEC3_TS|PMUXCR_USB },
-		{ __BIT(12), PMUXCR_TSEC1_TS },
-		{ __BIT(13), PMUXCR_TSEC1_TS },
-		{ __BIT(14), PMUXCR_TSEC2_TS },
-		{ __BIT(15), PMUXCR_TSEC2_TS },
+		{ __BIT(8), PMUXCR_SDHC_CD },
+		{ __BIT(9), PMUXCR_SDHC_WP },
+		/*
+		 * These are really two bits but the low bit MBZ so we ignore
+		 * it.
+		 */
+		{ __BIT(10), PMUXCR_TSEC3_TS },
+		{ __BIT(11), PMUXCR_TSEC3_TS },
 	};
 	
-	uint32_t pinmask = ~0;	/* assume all bits are valid */
-	size_t pincnt = 32;
+	uint32_t pinmask = 0x;	/* assume all bits are valid */
+	size_t pincnt = 16;
 	const uint32_t pmuxcr = bus_space_read_4(bst, bsh, PMUXCR);
 	for (size_t i = 0; i  __arraycount(gpio2pmuxcr_map); i++) {
-		if (pmuxcr  gpio2pmuxcr_map[i][1]) {
+		if ((pmuxcr  gpio2pmuxcr_map[i][1]) == 0) {
 			pinmask = ~gpio2pmuxcr_map[i][0];
 			pincnt--;
 		}
@@ -312,10 +328,10 @@ pq3gpio_p20x0_attach(device_t self, bus_
 	/*
 	 * Create GPIO pin groups
 	 */
-	aprint_normal_dev(self, %zu input pins, %zu output pins\n,
-	pincnt, pincnt);
-	pq3gpio_group_create(self, bst, bsh, GPINDR, pinmask, GPIO_PIN_INPUT);
-	pq3gpio_group_create(self, bst, bsh, GPOUTDR, pinmask, GPIO_PIN_OUTPUT);
+	aprint_normal_dev(self, %zu input/output pins\n,
+	pincnt);
+	pq3gpio_group_create(self, bst, bsh, GPDAT, pinmask,
+	GPIO_PIN_INPUT|GPIO_PIN_OUTPUT);
 }
 #endif /* P2020 */