Hi,

don't you consider this useful for some drivers. There are many cases, when
tty_insert_flip_stringio might be used.

--

tty, add io tty_insert_flip_string variants

Signed-off-by: Jiri Slaby <[EMAIL PROTECTED]>

---
commit a7dafceb31ff535b793227036f5b2b6a1e8cf233
tree 51e1bd24bfb9a2842bb12e097cec0b97a7bf3998
parent 71c2e9b72594f69e4e226006206ffa74b55c1642
author Jiri Slaby <[EMAIL PROTECTED]> Thu, 19 Apr 2007 00:27:22 +0200
committer Jiri Slaby <[EMAIL PROTECTED]> Thu, 19 Apr 2007 00:27:22 +0200

 drivers/char/tty_io.c   |  101 ++++++++++++++++++++++++++++++++---------------
 1 file changed, 69 insertions(+), 32 deletions(-)

diff --git a/drivers/char/tty_io.c b/drivers/char/tty_io.c
index 959a616..6b215ed 100644
--- a/drivers/char/tty_io.c
+++ b/drivers/char/tty_io.c
@@ -95,6 +95,7 @@
 #include <linux/bitops.h>
 #include <linux/delay.h>
 
+#include <asm/io.h>
 #include <asm/uaccess.h>
 #include <asm/system.h>
 
@@ -441,6 +442,25 @@ int tty_buffer_request_room(struct tty_struct *tty, size_t 
size)
 }
 EXPORT_SYMBOL_GPL(tty_buffer_request_room);
 
+#define __tty_insert_flip_string(tty, chars, flags, size, chrfun, flfun) ({ \
+       int copied = 0;                                                 \
+       do {                                                            \
+               int space = tty_buffer_request_room(tty, size - copied);\
+               struct tty_buffer *tb = tty->buf.tail;                  \
+               /* If there is no space then tb may be NULL */          \
+               if (unlikely(space == 0))                               \
+                       break;                                          \
+               chrfun(tb->char_buf_ptr + tb->used, chars, space);      \
+               flfun(tb->flag_buf_ptr + tb->used, flags, space);       \
+               tb->used += space;                                      \
+               copied += space;                                        \
+               chars += space;                                         \
+               /* There is a small chance that we need to split the data over \
+                  several buffers. If this is the case we must loop */ \
+       } while (unlikely(size > copied));                              \
+       copied;                                                         \
+})
+
 /**
  *     tty_insert_flip_string  -       Add characters to the tty buffer
  *     @tty: tty structure
@@ -456,26 +476,33 @@ EXPORT_SYMBOL_GPL(tty_buffer_request_room);
 int tty_insert_flip_string(struct tty_struct *tty, const unsigned char *chars,
                                size_t size)
 {
-       int copied = 0;
-       do {
-               int space = tty_buffer_request_room(tty, size - copied);
-               struct tty_buffer *tb = tty->buf.tail;
-               /* If there is no space then tb may be NULL */
-               if(unlikely(space == 0))
-                       break;
-               memcpy(tb->char_buf_ptr + tb->used, chars, space);
-               memset(tb->flag_buf_ptr + tb->used, TTY_NORMAL, space);
-               tb->used += space;
-               copied += space;
-               chars += space;
-               /* There is a small chance that we need to split the data over
-                  several buffers. If this is the case we must loop */
-       } while (unlikely(size > copied));
-       return copied;
+       return __tty_insert_flip_string(tty, chars, TTY_NORMAL, size,
+                       memcpy, memset);
 }
 EXPORT_SYMBOL(tty_insert_flip_string);
 
 /**
+ *     tty_insert_flip_stringio        -       Add characters to the tty buffer
+ *     @tty: tty structure
+ *     @chars: characters
+ *     @size: size
+ *
+ *     Queue a series of bytes to the tty buffering from io memory. All the
+ *     characters passed are marked as without error. Returns the number
+ *     added.
+ *
+ *     Locking: Called functions may take tty->buf.lock
+ */
+
+int tty_insert_flip_stringio(struct tty_struct *tty,
+               const unsigned char __iomem *chars, size_t size)
+{
+       return __tty_insert_flip_string(tty, chars, TTY_NORMAL, size,
+                       memcpy_fromio, memset);
+}
+EXPORT_SYMBOL(tty_insert_flip_stringio);
+
+/**
  *     tty_insert_flip_string_flags    -       Add characters to the tty buffer
  *     @tty: tty structure
  *     @chars: characters
@@ -492,27 +519,35 @@ EXPORT_SYMBOL(tty_insert_flip_string);
 int tty_insert_flip_string_flags(struct tty_struct *tty,
                const unsigned char *chars, const char *flags, size_t size)
 {
-       int copied = 0;
-       do {
-               int space = tty_buffer_request_room(tty, size - copied);
-               struct tty_buffer *tb = tty->buf.tail;
-               /* If there is no space then tb may be NULL */
-               if(unlikely(space == 0))
-                       break;
-               memcpy(tb->char_buf_ptr + tb->used, chars, space);
-               memcpy(tb->flag_buf_ptr + tb->used, flags, space);
-               tb->used += space;
-               copied += space;
-               chars += space;
-               flags += space;
-               /* There is a small chance that we need to split the data over
-                  several buffers. If this is the case we must loop */
-       } while (unlikely(size > copied));
-       return copied;
+       return __tty_insert_flip_string(tty, chars, flags, size,
+                       memcpy, memcpy);
 }
 EXPORT_SYMBOL(tty_insert_flip_string_flags);
 
 /**
+ *     tty_insert_flip_string_flagsio  - Add characters to the tty buffer
+ *     @tty: tty structure
+ *     @chars: characters
+ *     @flags: flag bytes
+ *     @size: size
+ *
+ *     Queue a series of bytes to the tty buffering from io memory. For each
+ *     character the flags array indicates the status of the character.
+ *     Returns the number added.
+ *
+ *     Locking: Called functions may take tty->buf.lock
+ */
+
+int tty_insert_flip_string_flagsio(struct tty_struct *tty,
+               const unsigned char __iomem *chars, const char *flags,
+               size_t size)
+{
+       return __tty_insert_flip_string(tty, chars, flags, size,
+                       memcpy_fromio, memcpy_fromio);
+}
+EXPORT_SYMBOL(tty_insert_flip_string_flagsio);
+
+/**
  *     tty_schedule_flip       -       push characters to ldisc
  *     @tty: tty to push from
  *
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to