Date: Wed, 14 Jul 1999 23:49:54 -0600 From: Warner Losh <imp@village.org> To: NAKAGAWA Yoshihisa <y-nakaga@nwsl.mesh.ad.jp> Cc: mobile@FreeBSD.ORG Subject: Re: Oooppsss Message-ID: <199907150549.XAA68558@harmony.village.org> In-Reply-To: Your message of "Thu, 15 Jul 1999 12:53:45 %2B0900." <199907150353.DAA22017@chandra.eatell.msr.prug.or.jp> References: <199907150353.DAA22017@chandra.eatell.msr.prug.or.jp>
index | next in thread | previous in thread | raw e-mail
In message <199907150353.DAA22017@chandra.eatell.msr.prug.or.jp> NAKAGAWA Yoshihisa writes:
: I don't like many start-up argument. New config-file's entry is
: better for me.
I've added this and debuglevel, fixed the dodebug abuse and documented
it all.
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 05:46:22
@@ -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 (debug_level > 0) {
+ 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 (debug_level > 0) {
+ 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 (debug_level > 0) {
+ 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 (debug_level > 0) {
+ 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 (debug_level > 0) {
+ 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 (debug_level > 0) {
+ 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 05:45:38
@@ -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 debug_level;
/* cardd.c functions */
void dump_config_file(void);
Index: file.c
===================================================================
RCS file: /home/imp/FreeBSD/CVS/src/usr.sbin/pccard/pccardd/file.c,v
retrieving revision 1.17
diff -u -r1.17 file.c
--- file.c 1999/06/17 21:07:58 1.17
+++ file.c 1999/07/15 05:45:14
@@ -52,6 +52,8 @@
"ether", /* 9 */
"insert", /* 10 */
"remove", /* 11 */
+ "initsleep", /* 12 */
+ "debuglevel", /* 13 */
0
};
@@ -66,6 +68,8 @@
#define KWD_ETHER 9
#define KWD_INSERT 10
#define KWD_REMOVE 11
+#define KWD_INITSLEEP 12
+#define KWD_DEBUGLEVEL 13
struct flags {
char *name;
@@ -79,6 +83,8 @@
static void error(char *);
static int keyword(char *);
static int irq_tok(int);
+static int initsleep_tok(int);
+static int debuglevel_tok(int);
static struct allocblk *ioblk_tok(int);
static struct allocblk *memblk_tok(int);
static struct driver *new_driver(char *);
@@ -166,6 +172,16 @@
/* Card definition. */
parse_card();
break;
+ case KWD_INITSLEEP:
+ i = initsleep_tok(0);
+ if (i > 0)
+ pccard_init_sleep = i;
+ break;
+ case KWD_DEBUGLEVEL:
+ i = debuglevel_tok(0);
+ if (i > 0)
+ debug_level = i;
+ break;
default:
error("syntax error");
pusht = 0;
@@ -375,6 +391,34 @@
return (i);
if (force)
error("illegal IRQ value");
+ return (-1);
+}
+
+/*
+ * initsleep token. Must be number > 500 && < 10 * 1000 * 1000.
+ */
+static int
+initsleep_tok(int force)
+{
+ int i;
+
+ i = num_tok();
+ if (i > 500 && i < 10 * 1000 * 1000)
+ return (i);
+ return (-1);
+}
+
+/*
+ * debuglevel token. Must be between 0 and 9.
+ */
+static int
+debuglevel_tok(int force)
+{
+ int i;
+
+ i = num_tok();
+ if (i >= 0 && i <= 9)
+ return (i);
return (-1);
}
Index: pccard.conf.5
===================================================================
RCS file: /home/imp/FreeBSD/CVS/src/usr.sbin/pccard/pccardd/pccard.conf.5,v
retrieving revision 1.8
diff -u -r1.8 pccard.conf.5
--- pccard.conf.5 1999/07/12 20:12:16 1.8
+++ pccard.conf.5 1999/07/15 05:42:28
@@ -116,6 +116,22 @@
blocks that can be used to allocate to drivers when
they are initialized.
.Pp
+The syntax of the initsleep parameter:
+.Pp
+.Dl initsleep Ar time
+.Pp
+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.
+.Pp
+The syntax of the debuglevel parameter:
+.Pp
+.Dl debuglevel Ar level
+.Pp
Multiple lines of any of the above statements may be
present to allow separate blocks of each resource to be
defined.
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 05:40:07
@@ -122,7 +122,7 @@
After reading the configuration file, print out a summary
of it.
.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 05:48:45
@@ -51,6 +51,8 @@
int delay = 0;
int i;
+ pccard_init_sleep = 5000000;
+ debug_level = 0;
while ((count = getopt(argc, argv, ":dvf:i:z")) != -1) {
switch (count) {
case 'd':
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-mobile" in the body of the message
help
Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199907150549.XAA68558>
