|
@@ -26,6 +26,7 @@
|
|
#include <linux/tty_flip.h>
|
|
#include <linux/tty_flip.h>
|
|
#include <linux/module.h>
|
|
#include <linux/module.h>
|
|
#include <linux/moduleparam.h>
|
|
#include <linux/moduleparam.h>
|
|
|
|
+#include <linux/seq_file.h>
|
|
#include <linux/spinlock.h>
|
|
#include <linux/spinlock.h>
|
|
#include <linux/mutex.h>
|
|
#include <linux/mutex.h>
|
|
#include <linux/list.h>
|
|
#include <linux/list.h>
|
|
@@ -421,57 +422,52 @@ static int serial_break(struct tty_struct *tty, int break_state)
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
-static int serial_read_proc(char *page, char **start, off_t off, int count,
|
|
|
|
- int *eof, void *data)
|
|
|
|
|
|
+static int serial_proc_show(struct seq_file *m, void *v)
|
|
{
|
|
{
|
|
struct usb_serial *serial;
|
|
struct usb_serial *serial;
|
|
- int length = 0;
|
|
|
|
int i;
|
|
int i;
|
|
- off_t begin = 0;
|
|
|
|
char tmp[40];
|
|
char tmp[40];
|
|
|
|
|
|
dbg("%s", __func__);
|
|
dbg("%s", __func__);
|
|
- length += sprintf(page, "usbserinfo:1.0 driver:2.0\n");
|
|
|
|
- for (i = 0; i < SERIAL_TTY_MINORS && length < PAGE_SIZE; ++i) {
|
|
|
|
|
|
+ seq_puts(m, "usbserinfo:1.0 driver:2.0\n");
|
|
|
|
+ for (i = 0; i < SERIAL_TTY_MINORS; ++i) {
|
|
serial = usb_serial_get_by_index(i);
|
|
serial = usb_serial_get_by_index(i);
|
|
if (serial == NULL)
|
|
if (serial == NULL)
|
|
continue;
|
|
continue;
|
|
|
|
|
|
- length += sprintf(page+length, "%d:", i);
|
|
|
|
|
|
+ seq_printf(m, "%d:", i);
|
|
if (serial->type->driver.owner)
|
|
if (serial->type->driver.owner)
|
|
- length += sprintf(page+length, " module:%s",
|
|
|
|
|
|
+ seq_printf(m, " module:%s",
|
|
module_name(serial->type->driver.owner));
|
|
module_name(serial->type->driver.owner));
|
|
- length += sprintf(page+length, " name:\"%s\"",
|
|
|
|
|
|
+ seq_printf(m, " name:\"%s\"",
|
|
serial->type->description);
|
|
serial->type->description);
|
|
- length += sprintf(page+length, " vendor:%04x product:%04x",
|
|
|
|
|
|
+ seq_printf(m, " vendor:%04x product:%04x",
|
|
le16_to_cpu(serial->dev->descriptor.idVendor),
|
|
le16_to_cpu(serial->dev->descriptor.idVendor),
|
|
le16_to_cpu(serial->dev->descriptor.idProduct));
|
|
le16_to_cpu(serial->dev->descriptor.idProduct));
|
|
- length += sprintf(page+length, " num_ports:%d",
|
|
|
|
- serial->num_ports);
|
|
|
|
- length += sprintf(page+length, " port:%d",
|
|
|
|
- i - serial->minor + 1);
|
|
|
|
|
|
+ seq_printf(m, " num_ports:%d", serial->num_ports);
|
|
|
|
+ seq_printf(m, " port:%d", i - serial->minor + 1);
|
|
usb_make_path(serial->dev, tmp, sizeof(tmp));
|
|
usb_make_path(serial->dev, tmp, sizeof(tmp));
|
|
- length += sprintf(page+length, " path:%s", tmp);
|
|
|
|
|
|
+ seq_printf(m, " path:%s", tmp);
|
|
|
|
|
|
- length += sprintf(page+length, "\n");
|
|
|
|
- if ((length + begin) > (off + count)) {
|
|
|
|
- usb_serial_put(serial);
|
|
|
|
- goto done;
|
|
|
|
- }
|
|
|
|
- if ((length + begin) < off) {
|
|
|
|
- begin += length;
|
|
|
|
- length = 0;
|
|
|
|
- }
|
|
|
|
|
|
+ seq_putc(m, '\n');
|
|
usb_serial_put(serial);
|
|
usb_serial_put(serial);
|
|
}
|
|
}
|
|
- *eof = 1;
|
|
|
|
-done:
|
|
|
|
- if (off >= (length + begin))
|
|
|
|
- return 0;
|
|
|
|
- *start = page + (off-begin);
|
|
|
|
- return (count < begin+length-off) ? count : begin+length-off;
|
|
|
|
|
|
+ return 0;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static int serial_proc_open(struct inode *inode, struct file *file)
|
|
|
|
+{
|
|
|
|
+ return single_open(file, serial_proc_show, NULL);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static const struct file_operations serial_proc_fops = {
|
|
|
|
+ .owner = THIS_MODULE,
|
|
|
|
+ .open = serial_proc_open,
|
|
|
|
+ .read = seq_read,
|
|
|
|
+ .llseek = seq_lseek,
|
|
|
|
+ .release = single_release,
|
|
|
|
+};
|
|
|
|
+
|
|
static int serial_tiocmget(struct tty_struct *tty, struct file *file)
|
|
static int serial_tiocmget(struct tty_struct *tty, struct file *file)
|
|
{
|
|
{
|
|
struct usb_serial_port *port = tty->driver_data;
|
|
struct usb_serial_port *port = tty->driver_data;
|
|
@@ -1113,9 +1109,9 @@ static const struct tty_operations serial_ops = {
|
|
.unthrottle = serial_unthrottle,
|
|
.unthrottle = serial_unthrottle,
|
|
.break_ctl = serial_break,
|
|
.break_ctl = serial_break,
|
|
.chars_in_buffer = serial_chars_in_buffer,
|
|
.chars_in_buffer = serial_chars_in_buffer,
|
|
- .read_proc = serial_read_proc,
|
|
|
|
.tiocmget = serial_tiocmget,
|
|
.tiocmget = serial_tiocmget,
|
|
.tiocmset = serial_tiocmset,
|
|
.tiocmset = serial_tiocmset,
|
|
|
|
+ .proc_fops = &serial_proc_fops,
|
|
};
|
|
};
|
|
|
|
|
|
struct tty_driver *usb_serial_tty_driver;
|
|
struct tty_driver *usb_serial_tty_driver;
|