This is second stab at the ussp driver.
I'm not sure about the TTY_NORMAL that was in port->tty->flip.flag_buf_ptr
under the USSP_READ - should this flag character be inserted into the flip
buffer after the data bytes, as seen in the patch?
Thanks,
Hinko
--
ČETRTA POT, d.o.o., Kranj
Planina 3
4000 Kranj
Slovenia, Europe
Tel. +386 (0) 4 280 66 03
E-mail: [EMAIL PROTECTED]
Http: www.cetrtapot.si
diff -urN ussp26-10/Makefile ussp26-26/Makefile
--- ussp26-10/Makefile 2005-03-08 23:08:01.000000000 +0100
+++ ussp26-26/Makefile 2008-07-08 13:23:02.000000000 +0200
@@ -1,6 +1,7 @@
obj-m += ussp.o
default:
- make -C /lib/modules/$(shell uname -r)/build/ SUBDIRS=$(PWD) modules
+ make -C $(shell pwd)/../linux-2.6/ SUBDIRS=$(PWD) modules
clean:
rm ussp.o ussp.ko ussp.mod* .ussp.*
rm -r .tmp_versions
+ rm -f [Mm]odule*
diff -urN ussp26-10/ussp.c ussp26-26/ussp.c
--- ussp26-10/ussp.c 2005-03-08 22:46:08.000000000 +0100
+++ ussp26-26/ussp.c 2008-07-09 09:22:27.000000000 +0200
@@ -53,7 +53,7 @@
#define RCS_ID "$Id: ussp.c,v 1.5 2005/03/08 22:00:02 jth Exp $"
#define RCS_REV "$Revision: 1.5 $"
-#include <linux/config.h>
+//#include <linux/config.h>
#include <linux/ctype.h>
#if 0
@@ -66,6 +66,7 @@
#endif
#include <linux/module.h>
+#include <linux/moduleparam.h>
#include <linux/kdev_t.h>
#include <asm/io.h>
#include <linux/kernel.h>
@@ -115,8 +116,8 @@
/* Configurable options:
(Don't be too sure that it'll work if you toggle them) */
-MODULE_PARM(ussp_debug, "i");
-MODULE_PARM(ussp_set_lowlatency, "i");
+module_param(ussp_debug, int, 0);
+module_param(ussp_set_lowlatency, int, 0);
MODULE_AUTHOR("[EMAIL PROTECTED], [EMAIL PROTECTED]");
MODULE_DESCRIPTION("User Space Serial Ports");
@@ -224,14 +225,14 @@
static void ussp_tty_close (struct tty_struct *, struct file *);
static int ussp_tty_write_room (struct tty_struct * );
static int ussp_tty_chars_in_buffer (struct tty_struct * );
-static void ussp_tty_put_char (struct tty_struct *, unsigned char);
+static int ussp_tty_put_char (struct tty_struct *, unsigned char);
void ussp_tty_flush_buffer (struct tty_struct *tty);
void ussp_tty_flush_chars (struct tty_struct *tty);
void ussp_tty_stop (struct tty_struct *tty);
void ussp_tty_start (struct tty_struct *tty);
void ussp_tty_set_termios (struct tty_struct * tty,
- struct termios * old_termios);
+ struct ktermios * old_termios);
void ussp_tty_hangup (struct tty_struct *tty);
struct ussp_port ussp_ports[USSP_MAX_PORTS];
@@ -240,8 +241,8 @@
static struct tty_driver ussp_driver;
static struct tty_struct * ussp_table[USSP_MAX_PORTS] = { NULL, };
-static struct termios * ussp_termios[USSP_MAX_PORTS];
-static struct termios * ussp_termios_locked[USSP_MAX_PORTS];
+static struct ktermios * ussp_termios[USSP_MAX_PORTS];
+static struct ktermios * ussp_termios_locked[USSP_MAX_PORTS];
#define D_DATA_AVAILABLE(port) ((port->daemon_head - port->daemon_tail) & (PAGE_SIZE-1))
#define TTY_DATA_AVAILABLE(port) ((port->tty_head - port->tty_tail) & (PAGE_SIZE-1))
@@ -312,6 +313,24 @@
+static struct tty_operations ttyops = {
+ .open = ussp_tty_open,
+ .close = ussp_tty_close,
+ .write = ussp_tty_write,
+ .put_char = ussp_tty_put_char,
+ .flush_chars = ussp_tty_flush_chars,
+ .write_room = ussp_tty_write_room,
+ .chars_in_buffer = ussp_tty_chars_in_buffer,
+ .flush_buffer = ussp_tty_flush_buffer,
+ .ioctl = ussp_tty_ioctl,
+ .throttle = ussp_dummy,
+ .unthrottle = ussp_dummy,
+ .set_termios = ussp_tty_set_termios,
+ .stop = ussp_tty_stop,
+ .start = ussp_tty_start,
+ .hangup = ussp_tty_hangup,
+};
+
int ussp_init (void)
{
int status;
@@ -340,21 +359,7 @@
ussp_driver.termios = ussp_termios;
ussp_driver.termios_locked = ussp_termios_locked;
- ussp_driver.open = ussp_tty_open;
- ussp_driver.close = ussp_tty_close;
- ussp_driver.write = ussp_tty_write;
- ussp_driver.put_char = ussp_tty_put_char;
- ussp_driver.flush_chars = ussp_tty_flush_chars;
- ussp_driver.write_room = ussp_tty_write_room;
- ussp_driver.chars_in_buffer = ussp_tty_chars_in_buffer;
- ussp_driver.flush_buffer = ussp_tty_flush_buffer;
- ussp_driver.ioctl = ussp_tty_ioctl;
- ussp_driver.throttle = ussp_dummy;
- ussp_driver.unthrottle = ussp_dummy;
- ussp_driver.set_termios = ussp_tty_set_termios;
- ussp_driver.stop = ussp_tty_stop;
- ussp_driver.start = ussp_tty_start;
- ussp_driver.hangup = ussp_tty_hangup;
+ ussp_driver.ops = &ttyops;
status = tty_register_driver (&ussp_driver);
//printk (KERN_INFO "Return value registering: %d\n", status);
@@ -547,7 +552,7 @@
void ussp_tty_set_termios (struct tty_struct * tty,
- struct termios * old_termios)
+ struct ktermios * old_termios)
{
func_enter ();
@@ -579,7 +584,7 @@
}
-static void ussp_tty_put_char (struct tty_struct * tty, unsigned char ch)
+static int ussp_tty_put_char (struct tty_struct * tty, unsigned char ch)
{
char tempchar = ch;
int count;
@@ -591,7 +596,7 @@
count = ussp_tty_write (tty, &tempchar, 1);
ussp_dprintk (DEBUG_WRITE_TO_CTL, "writing char: %c %d\n", ch, count);
func_exit ();
- return;
+ return count;
}
@@ -672,15 +677,6 @@
return -EINTR;
}
- ussp_dprintk (DEBUG_OPEN, "current->signal->leader: %d current->signal->tty: %d tty->session: %d\n", (int)current->signal->leader, (int)current->signal->tty, (int)tty->session);
- if (current->signal->leader && !current->signal->tty && tty->session == 0){
- ussp_dprintk (DEBUG_OPEN, "setting!\n");
- current->signal->tty = tty;
- current->signal->tty_old_pgrp = 0;
- tty->session = current->signal->session;
- tty->pgrp = process_group(current);
- }
-
func_exit();
return op.arg;
}
@@ -754,13 +750,10 @@
break;
case TIOCSSOFTCAR:
- if ((rc = verify_area(VERIFY_READ, (void *) arg,
- sizeof(int))) == 0) {
- get_user(ival, (unsigned int *) arg);
- tty->termios->c_cflag =
- (tty->termios->c_cflag & ~CLOCAL) |
- (ival ? CLOCAL : 0);
- }
+ get_user(ival, (unsigned int *) arg);
+ tty->termios->c_cflag =
+ (tty->termios->c_cflag & ~CLOCAL) |
+ (ival ? CLOCAL : 0);
break;
case TIOCMGET:
ussp_dprintk (DEBUG_IOCTL, "TIOCMGET\n");
@@ -794,6 +787,10 @@
rc = -EFAULT;
break;
+ case TCSETS:
+ ussp_dprintk (DEBUG_IOCTL, "TCSETS -- what to do here!?\n");
+ break;
+
default:
printk (KERN_DEBUG "illegal ioctl: %x (mget = %x)\n",
cmd, TIOCMGET);
@@ -977,6 +974,7 @@
int rc;
struct ussp_operation op;
struct ussp_port *port;
+ char *buff;
func_enter();
port = filp->private_data;
@@ -1011,13 +1009,20 @@
break;
case USSP_READ:
ussp_dprintk (DEBUG_IOCTL, "USSP_READ %d\n", (int)op.len);
- rc = copy_from_user (port->tty->flip.char_buf_ptr, buf + sizeof(struct ussp_operation), op.len);
- memset(port->tty->flip.flag_buf_ptr, TTY_NORMAL, op.len);
- port->tty->flip.count += op.len;
- port->tty->flip.char_buf_ptr += op.len;
- port->tty->flip.flag_buf_ptr += op.len;
+ buff = kmalloc((int)op.len, GFP_KERNEL);
+ rc = copy_from_user (buff, buf + sizeof(struct ussp_operation), op.len);
+ if (rc)
+ {
+ kfree(buff);
+ return -ENOMEM;
+ }
+ rc = tty_buffer_request_room(port->tty, (int)op.len);
+ if (rc > 0)
+ tty_insert_flip_string(port->tty, buff, (int)op.len);
+ tty_insert_flip_char(port->tty, 0, TTY_NORMAL);
tty_flip_buffer_push (port->tty);
port->stats.rxcount += op.len;
+ kfree(buff);
break;
case USSP_FORCE_CLOSE:
ussp_dprintk (USSP_CLOSE, "USSP_FORCE_CLOSE %d\n", (int)op.arg);
@@ -1145,6 +1150,7 @@
if (tty_unregister_driver(&ussp_driver) < 0) {
printk (KERN_INFO "ussp: couldn't deregister tty device.\n");
}
+ printk(KERN_INFO "USSP driver de-registered.\n");
func_exit();
}
diff -urN ussp26-10/ussp.h ussp26-26/ussp.h
--- ussp26-10/ussp.h 2004-04-21 18:55:10.000000000 +0200
+++ ussp26-26/ussp.h 2008-07-08 11:44:11.000000000 +0200
@@ -74,8 +74,8 @@
struct stats stats;
int deamon_pid;
- struct termios normal_termios;
- struct termios callout_termios;
+ struct ktermios normal_termios;
+ struct ktermios callout_termios;
struct tty_struct *tty;
};
#endif