diff options
author | Olaf Hering <olh@suse.de> | 2006-02-01 12:05:58 +0100 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-02-01 17:53:19 +0100 |
commit | e61997881e0402aedbfad8696e369568a0583f14 (patch) | |
tree | 2b66d348024b41c22966c386f3ca6647a9efdb00 /drivers/macintosh/macio_asic.c | |
parent | [PATCH] powerpc: fix for kexec ppc32 (diff) | |
download | linux-e61997881e0402aedbfad8696e369568a0583f14.tar.xz linux-e61997881e0402aedbfad8696e369568a0583f14.zip |
[PATCH] MODALIAS= for macio
Prodive a MODALIAS= enviroment variable for devices on the mac-io bus.
Change the buffer length counter to not waste memory by advancing the
pointer for the next string too far. Tested on an ibook1 with modular
pmac_zilog.
Signed-off-by: Olaf Hering <olh@suse.de>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Paul Mackerras <paulus@samba.org>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'drivers/macintosh/macio_asic.c')
-rw-r--r-- | drivers/macintosh/macio_asic.c | 72 |
1 files changed, 48 insertions, 24 deletions
diff --git a/drivers/macintosh/macio_asic.c b/drivers/macintosh/macio_asic.c index ed6d3174d660..69596f6438e9 100644 --- a/drivers/macintosh/macio_asic.c +++ b/drivers/macintosh/macio_asic.c @@ -140,10 +140,9 @@ static int macio_uevent(struct device *dev, char **envp, int num_envp, { struct macio_dev * macio_dev; struct of_device * of; - char *scratch, *compat; + char *scratch, *compat, *compat2; int i = 0; - int length = 0; - int cplen, seen = 0; + int length, cplen, cplen2, seen = 0; if (!dev) return -ENODEV; @@ -153,23 +152,22 @@ static int macio_uevent(struct device *dev, char **envp, int num_envp, return -ENODEV; of = &macio_dev->ofdev; - scratch = buffer; /* stuff we want to pass to /sbin/hotplug */ - envp[i++] = scratch; - length += scnprintf (scratch, buffer_size - length, "OF_NAME=%s", - of->node->name); - if ((buffer_size - length <= 0) || (i >= num_envp)) - return -ENOMEM; + envp[i++] = scratch = buffer; + length = scnprintf (scratch, buffer_size, "OF_NAME=%s", of->node->name); ++length; + buffer_size -= length; + if ((buffer_size <= 0) || (i >= num_envp)) + return -ENOMEM; scratch += length; envp[i++] = scratch; - length += scnprintf (scratch, buffer_size - length, "OF_TYPE=%s", - of->node->type); - if ((buffer_size - length <= 0) || (i >= num_envp)) - return -ENOMEM; + length = scnprintf (scratch, buffer_size, "OF_TYPE=%s", of->node->type); ++length; + buffer_size -= length; + if ((buffer_size <= 0) || (i >= num_envp)) + return -ENOMEM; scratch += length; /* Since the compatible field can contain pretty much anything @@ -177,29 +175,55 @@ static int macio_uevent(struct device *dev, char **envp, int num_envp, * up using a number of environment variables instead. */ compat = (char *) get_property(of->node, "compatible", &cplen); + compat2 = compat; + cplen2= cplen; while (compat && cplen > 0) { - int l; envp[i++] = scratch; - length += scnprintf (scratch, buffer_size - length, + length = scnprintf (scratch, buffer_size, "OF_COMPATIBLE_%d=%s", seen, compat); - if ((buffer_size - length <= 0) || (i >= num_envp)) + ++length; + buffer_size -= length; + if ((buffer_size <= 0) || (i >= num_envp)) return -ENOMEM; - length++; scratch += length; - l = strlen (compat) + 1; - compat += l; - cplen -= l; + length = strlen (compat) + 1; + compat += length; + cplen -= length; seen++; } envp[i++] = scratch; - length += scnprintf (scratch, buffer_size - length, - "OF_COMPATIBLE_N=%d", seen); - if ((buffer_size - length <= 0) || (i >= num_envp)) - return -ENOMEM; + length = scnprintf (scratch, buffer_size, "OF_COMPATIBLE_N=%d", seen); ++length; + buffer_size -= length; + if ((buffer_size <= 0) || (i >= num_envp)) + return -ENOMEM; + scratch += length; + + envp[i++] = scratch; + length = scnprintf (scratch, buffer_size, "MODALIAS=of:N%sT%s", + of->node->name, of->node->type); + /* overwrite '\0' */ + buffer_size -= length; + if ((buffer_size <= 0) || (i >= num_envp)) + return -ENOMEM; scratch += length; + if (!compat2) { + compat2 = ""; + cplen2 = 1; + } + while (cplen2 > 0) { + length = snprintf (scratch, buffer_size, "C%s", compat2); + buffer_size -= length; + if (buffer_size <= 0) + return -ENOMEM; + scratch += length; + length = strlen (compat2) + 1; + compat2 += length; + cplen2 -= length; + } + envp[i] = NULL; return 0; |