Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 14 Jul 1999 21:39:19 -0600
From:      Warner Losh <imp@village.org>
To:        mobile@freebsd.org
Subject:   Oooppsss
Message-ID:  <199907150339.VAA60917@harmony.village.org>

next in thread | raw e-mail | index | archive | help

to comment on my patches, alluded to in the last message, you'll need
to see the patches.

Warner

Index: cardd.c
===================================================================
RCS file: /home/imp/FreeBSD/CVS/src/usr.sbin/pccard/pccardd/cardd.c,v
retrieving revision 1.34
diff -u -r1.34 cardd.c
--- cardd.c	1999/02/05 16:00:17	1.34
+++ cardd.c	1999/07/15 02:47:12
@@ -33,6 +33,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
+#include <errno.h>
 #include <fcntl.h>
 #include <sys/ioctl.h>
 #include "cardd.h"
@@ -114,7 +115,8 @@
 			if (mem == 0) {
 				mem = alloc_memory(4 * 1024);
 				if (mem == 0)
-					die("can't allocate memory for controller access");
+					die("can't allocate memory for "
+					    "controller access");
 				if (ioctl(fd, PIOCRWMEM, &mem))
 					logerr("ioctl (PIOCRWMEM)");
 			}
@@ -198,7 +200,7 @@
 {
 	struct card *cp;
 
-	sleep(5);
+	usleep(pccard_init_sleep);
 	sp->cis = readcis(sp->fd);
 	if (sp->cis == 0) {
 		logmsg("Error reading CIS on %s\n", sp->name);
@@ -281,10 +283,10 @@
 		if (conf->inuse == 0 && conf->driver->card == cp &&
 		    conf->driver->config == conf &&
 		    conf->driver->inuse == 0) {
-#ifdef	DEBUG
-			logmsg("Found existing driver (%s) for %s\n",
-			    conf->driver->name, cp->manuf);
-#endif
+			if (dodebug) {
+				logmsg("Found existing driver (%s) for %s\n",
+				    conf->driver->name, cp->manuf);
+			}
 			conf->driver->inuse = 1;
 			conf->inuse = 1;
 			return (conf);
@@ -348,8 +350,11 @@
 	for (cisconf = cis->conf; cisconf; cisconf = cisconf->next)
 		if (cisconf->id == sp->config->index)
 			break;
-	if (cisconf == 0)
+	if (cisconf == 0) {
+		logmsg("Config id %d not present in this card",
+		    sp->config->index);
 		return (-1);
+	}
 	sp->card_config = cisconf;
 
 	/*
@@ -378,10 +383,10 @@
 			sp->config->driver->mem = sp->mem.addr;
 		}
 		sp->mem.cardaddr = 0x4000;
-#ifdef	DEBUG
-		logmsg("Using mem addr 0x%x, size %d, card addr 0x%x\n",
-			sp->mem.addr, sp->mem.size, sp->mem.cardaddr);
-#endif
+		if (dodebug) {
+			logmsg("Using mem addr 0x%x, size %d, card addr 0x%x\n",
+			    sp->mem.addr, sp->mem.size, sp->mem.cardaddr);
+		}
 	}
 
 	/* Now look at I/O. */
@@ -435,10 +440,10 @@
 			sp->io.flags = IODF_WS | IODF_CS16 | IODF_16BIT;
 			break;
 		}
-#ifdef	DEBUG
-		logmsg("Using I/O addr 0x%x, size %d\n",
-		    sp->io.addr, sp->io.size);
-#endif
+		if (dodebug) {
+			logmsg("Using I/O addr 0x%x, size %d\n",
+			    sp->io.addr, sp->io.size);
+		}
 	}
 	sp->irq = sp->config->irq;
 	return (0);
@@ -476,11 +481,12 @@
 	c = sp->config->index;
 	c |= 0x40;
 	write(sp->fd, &c, sizeof(c));
-#ifdef	DEBUG
-	logmsg("Setting config reg at offs 0x%lx to 0x%x, Reset time = %d ms\n",
-		(unsigned long)offs, c, sp->card->reset_time);
-#endif
-	sleep(5);
+	if (dodebug) {
+		logmsg("Setting config reg at offs 0x%lx to 0x%x, "
+		    "Reset time = %d ms\n", (unsigned long)offs, c,
+		    sp->card->reset_time);
+	}
+	usleep(pccard_init_sleep);
 	usleep(sp->card->reset_time * 1000);
 
 	/* If other config registers exist, set them up. */
@@ -520,10 +526,11 @@
 			io.size = 0x300;
 		}
 #endif
-#ifdef	DEBUG
-		logmsg("Assigning I/O window %d, start 0x%x, size 0x%x flags 0x%x\n",
-			io.window, io.start, io.size, io.flags);
-#endif
+		if (dodebug) {
+			logmsg("Assigning I/O window %d, start 0x%x, "
+			    "size 0x%x flags 0x%x\n", io.window, io.start,
+			    io.size, io.flags);
+		}
 		io.flags |= IODF_ACTIVE;
 		if (ioctl(sp->fd, PIOCSIO, &io)) {
 			logerr("ioctl (PIOCSIO)");
@@ -541,14 +548,16 @@
 		drv.mem = 0;
 		drv.memsize = 0;
 	}
-	if (sp->io.size)
+	if (sp->io.size) {
 		drv.iobase = sp->io.addr;
-	else
+	} else {
 		drv.iobase = 0;
-#ifdef	DEBUG
-	logmsg("Assign %s%d, io 0x%x, mem 0x%lx, %d bytes, irq %d, flags %x\n",
-	    drv.name, drv.unit, drv.iobase, drv.mem, drv.memsize, sp->irq, drv.flags);
-#endif
+	}
+	if (dodebug) {
+		logmsg("Assign %s%d, io 0x%x, mem 0x%lx, %d bytes, irq %d, "
+		    "flags %x\n", drv.name, drv.unit, drv.iobase, drv.mem,
+		    drv.memsize, sp->irq, drv.flags);
+	}
 
 	/*
 	 * If the driver fails to be connected to the device,
@@ -556,7 +565,8 @@
 	 */
 	memcpy(drv.misc, sp->eaddr, 6);
 	if (ioctl(sp->fd, PIOCSDRV, &drv)) {
-		logmsg("driver allocation failed for %s", sp->card->manuf);
+		logmsg("driver allocation failed for %s(%s): %s",
+		    sp->card->manuf, sp->card->version, strerror(errno));
 		return (0);
 	}
 	return (1);
Index: cardd.h
===================================================================
RCS file: /home/imp/FreeBSD/CVS/src/usr.sbin/pccard/pccardd/cardd.h,v
retrieving revision 1.12
diff -u -r1.12 cardd.h
--- cardd.h	1998/03/09 05:18:55	1.12
+++ cardd.h	1999/07/15 02:38:59
@@ -118,6 +118,8 @@
 EXTERN struct card *cards;
 EXTERN bitstr_t *mem_avail;
 EXTERN bitstr_t *io_avail;
+EXTERN int pccard_init_sleep;			/* Time to sleep on init */
+EXTERN int dodebug;
 
 /* cardd.c functions */
 void		 dump_config_file(void);
Index: pccardd.8
===================================================================
RCS file: /home/imp/FreeBSD/CVS/src/usr.sbin/pccard/pccardd/pccardd.8,v
retrieving revision 1.14
diff -u -r1.14 pccardd.8
--- pccardd.8	1999/06/30 03:49:30	1.14
+++ pccardd.8	1999/07/15 02:54:58
@@ -38,6 +38,7 @@
 .Op Fl z
 .Op Fl i Ar IRQ
 .Op Fl f Ar configfile
+.Op Fl s Ar initsleeptime
 .Sh DESCRIPTION
 .Nm Pccardd
 is normally started at boot time, and manages the insertion
@@ -121,8 +122,16 @@
 .It Fl v
 After reading the configuration file, print out a summary
 of it.
+.It Fl s Ar initsleep
+Configures the amount of time to sleep at two different points in the
+initialization process.
+The time is in microseconds.
+The default value is 5000000 microseconds, as that works on nearly all
+pccards.
+Newer pc cards may only need as little as 500 microseconds.
+When set too low, the your machine may freeze.
 .It Fl z
-Delays running as a daemon slightly.
+Delays running as a daemon until after the cards have been probed and attached.
 .It Fl i Ar IRQ
 Configures an available IRQ.  It overrides the "irq" line in
 .Pa /etc/pccard.conf .
Index: pccardd.c
===================================================================
RCS file: /home/imp/FreeBSD/CVS/src/usr.sbin/pccard/pccardd/pccardd.c,v
retrieving revision 1.3
diff -u -r1.3 pccardd.c
--- pccardd.c	1999/06/17 21:07:59	1.3
+++ pccardd.c	1999/07/15 02:39:28
@@ -46,12 +46,14 @@
 main(int argc, char *argv[])
 {
 	struct slot *slots, *sp;
-	int count, dodebug = 0;
+	int count;
 	int doverbose = 0;
 	int delay = 0;
 	int i;
 
-	while ((count = getopt(argc, argv, ":dvf:i:z")) != -1) {
+	pccard_init_sleep = 5000000;
+	dodebug = 0;
+	while ((count = getopt(argc, argv, ":dvf:i:s:z")) != -1) {
 		switch (count) {
 		case 'd':
 			setbuf(stdout, 0);
@@ -71,6 +73,9 @@
 				exit(1);
 			}
 			pool_irq[i] = 1;
+			break;
+		case 's':
+			pccard_init_sleep = atoi(optarg);
 			break;
 		case 'z':
 			delay = 1;


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-mobile" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199907150339.VAA60917>