Linux Headquarters
[ Register ]
[ About us ] [ Home Page ]

Advertisement
[ Kernel ] [ Documentation ] [ Links ] [ Books ]

Advertisement

Kernel v2.6.26-rc1 /kernel/printk.c

Filename:/kernel/printk.c
Lines Added:70
Lines Deleted:52
Also changed in: (Previous) 2.6.25-git20  2.6.25-git19  2.6.25-git18  2.6.25-git17  2.6.25-git16  2.6.25-git15 
(Following) 2.6.26-rc2  2.6.26-rc3  2.6.26-rc4  2.6.26-rc5  2.6.26-rc6  2.6.26-rc7 

Location
[  2.6.26-rc1
  [  kernel
     o  printk.c

Patch

diff --git a/kernel/printk.c b/kernel/printk.c
index bdd4ea8..8fb01c3 100644
--- a/kernel/printk.c
+++ b/kernel/printk.c
@@ -111,6 +111,9 @@ struct console_cmdline
    char   name[8];         /* Name of the driver       */
    int   index;            /* Minor dev. to use       */
    char   *options;         /* Options for the driver   */
+#ifdef CONFIG_A11Y_BRAILLE_CONSOLE
+   char   *brl_options;         /* Options for braille driver */
+#endif
 };
 
 #define MAX_CMDLINECONSOLES 8
@@ -808,15 +811,60 @@ static void call_console_drivers(unsigned start, unsigned end)
 
 #endif
 
+static int __add_preferred_console(char *name, int idx, char *options,
+               char *brl_options)
+{
+   struct console_cmdline *c;
+   int i;
+
+   /*
+    *   See if this tty is not yet registered, and
+    *   if we have a slot free.
+    */
+   for (i = 0; i < MAX_CMDLINECONSOLES && console_cmdline[i].name[0]; i++)
+      if (strcmp(console_cmdline[i].name, name) == 0 &&
+           console_cmdline[i].index == idx) {
+            if (!brl_options)
+               selected_console = i;
+            return 0;
+      }
+   if (i == MAX_CMDLINECONSOLES)
+      return -E2BIG;
+   if (!brl_options)
+      selected_console = i;
+   c = &console_cmdline[i];
+   strlcpy(c->name, name, sizeof(c->name));
+   c->options = options;
+#ifdef CONFIG_A11Y_BRAILLE_CONSOLE
+   c->brl_options = brl_options;
+#endif
+   c->index = idx;
+   return 0;
+}
 /*
  * Set up a list of consoles.  Called from init/main.c
  */
 static int __init console_setup(char *str)
 {
    char buf[sizeof(console_cmdline[0].name) + 4]; /* 4 for index */
-   char *s, *options;
+   char *s, *options, *brl_options = NULL;
    int idx;
 
+#ifdef CONFIG_A11Y_BRAILLE_CONSOLE
+   if (!memcmp(str, "brl,", 4)) {
+      brl_options = "";
+      str += 4;
+   } else if (!memcmp(str, "brl=", 4)) {
+      brl_options = str + 4;
+      str = strchr(brl_options, ',');
+      if (!str) {
+         printk(KERN_ERR "need port name after brl=\n");
+         return 1;
+      }
+      *(str++) = 0;
+   }
+#endif
+
    /*
     * Decode str into name, index, options.
     */
@@ -841,7 +889,7 @@ static int __init console_setup(char *str)
    idx = simple_strtoul(s, NULL, 10);
    *s = 0;
 
-   add_preferred_console(buf, idx, options);
+   __add_preferred_console(buf, idx, options, brl_options);
    return 1;
 }
 __setup("console=", console_setup);
@@ -861,28 +909,7 @@ __setup("console=", console_setup);
  */
 int add_preferred_console(char *name, int idx, char *options)
 {
-   struct console_cmdline *c;
-   int i;
-
-   /*
-    *   See if this tty is not yet registered, and
-    *   if we have a slot free.
-    */
-   for (i = 0; i < MAX_CMDLINECONSOLES && console_cmdline[i].name[0]; i++)
-      if (strcmp(console_cmdline[i].name, name) == 0 &&
-           console_cmdline[i].index == idx) {
-            selected_console = i;
-            return 0;
-      }
-   if (i == MAX_CMDLINECONSOLES)
-      return -E2BIG;
-   selected_console = i;
-   c = &console_cmdline[i];
-   memcpy(c->name, name, sizeof(c->name));
-   c->name[sizeof(c->name) - 1] = 0;
-   c->options = options;
-   c->index = idx;
-   return 0;
+   return __add_preferred_console(name, idx, options, NULL);
 }
 
 int update_console_cmdline(char *name, int idx, char *name_new, int idx_new, char *options)
@@ -894,7 +921,7 @@ int update_console_cmdline(char *name, int idx, char *name_new, int idx_new, cha
       if (strcmp(console_cmdline[i].name, name) == 0 &&
            console_cmdline[i].index == idx) {
             c = &console_cmdline[i];
-            memcpy(c->name, name_new, sizeof(c->name));
+            strlcpy(c->name, name_new, sizeof(c->name));
             c->name[sizeof(c->name) - 1] = 0;
             c->options = options;
             c->index = idx_new;
@@ -1163,6 +1190,16 @@ void register_console(struct console *console)
          continue;
       if (console->index < 0)
          console->index = console_cmdline[i].index;
+#ifdef CONFIG_A11Y_BRAILLE_CONSOLE
+      if (console_cmdline[i].brl_options) {
+         console->flags |= CON_BRL;
+         braille_register_console(console,
+               console_cmdline[i].index,
+               console_cmdline[i].options,
+               console_cmdline[i].brl_options);
+         return;
+      }
+#endif
       if (console->setup &&
           console->setup(console, console_cmdline[i].options) != 0)
          break;
@@ -1221,6 +1258,11 @@ int unregister_console(struct console *console)
         struct console *a, *b;
    int res = 1;
 
+#ifdef CONFIG_A11Y_BRAILLE_CONSOLE
+   if (console->flags & CON_BRL)
+      return braille_unregister_console(console);
+#endif
+
    acquire_console_sem();
    if (console_drivers == console) {
       console_drivers=console->next;
@@ -1272,8 +1314,8 @@ late_initcall(disable_boot_consoles);
  */
 void tty_write_message(struct tty_struct *tty, char *msg)
 {
-   if (tty && tty->driver->write)
-      tty->driver->write(tty, msg, strlen(msg));
+   if (tty && tty->ops->write)
+      tty->ops->write(tty, msg, strlen(msg));
    return;
 }
 
@@ -1287,31 +1329,7 @@ void tty_write_message(struct tty_struct *tty, char *msg)
  */
 int __printk_ratelimit(int ratelimit_jiffies, int ratelimit_burst)
 {
-   static DEFINE_SPINLOCK(ratelimit_lock);
-   static unsigned toks = 10 * 5 * HZ;
-   static unsigned long last_msg;
-   static int missed;
-   unsigned long flags;
-   unsigned long now = jiffies;
-
-   spin_lock_irqsave(&ratelimit_lock, flags);
-   toks += now - last_msg;
-   last_msg = now;
-   if (toks > (ratelimit_burst * ratelimit_jiffies))
-      toks = ratelimit_burst * ratelimit_jiffies;
-   if (toks >= ratelimit_jiffies) {
-      int lost = missed;
-
-      missed = 0;
-      toks -= ratelimit_jiffies;
-      spin_unlock_irqrestore(&ratelimit_lock, flags);
-      if (lost)
-         printk(KERN_WARNING "printk: %d messages suppressed.\n", lost);
-      return 1;
-   }
-   missed++;
-   spin_unlock_irqrestore(&ratelimit_lock, flags);
-   return 0;
+   return __ratelimit(ratelimit_jiffies, ratelimit_burst);
 }
 EXPORT_SYMBOL(__printk_ratelimit);
 


Comments: webmaster (at) linuxhq.com.
Advertising: banners (at) linuxhq.com.
Compilation ©1998-2008 Linux Headquarters, Inc.