|
@@ -32,6 +32,7 @@
|
|
|
#include <linux/tty.h>
|
|
|
#include <linux/tty_flip.h>
|
|
|
#include <linux/serial.h>
|
|
|
+#include <linux/seq_file.h>
|
|
|
#include <linux/cd1400.h>
|
|
|
#include <linux/sc26198.h>
|
|
|
#include <linux/comstats.h>
|
|
@@ -1379,52 +1380,47 @@ static void stl_sendxchar(struct tty_struct *tty, char ch)
|
|
|
stl_putchar(tty, ch);
|
|
|
}
|
|
|
|
|
|
-/*****************************************************************************/
|
|
|
-
|
|
|
-#define MAXLINE 80
|
|
|
-
|
|
|
-/*
|
|
|
- * Format info for a specified port. The line is deliberately limited
|
|
|
- * to 80 characters. (If it is too long it will be truncated, if too
|
|
|
- * short then padded with spaces).
|
|
|
- */
|
|
|
-
|
|
|
-static int stl_portinfo(struct stlport *portp, int portnr, char *pos)
|
|
|
+static void stl_portinfo(struct seq_file *m, struct stlport *portp, int portnr)
|
|
|
{
|
|
|
- char *sp;
|
|
|
- int sigs, cnt;
|
|
|
+ int sigs;
|
|
|
+ char sep;
|
|
|
|
|
|
- sp = pos;
|
|
|
- sp += sprintf(sp, "%d: uart:%s tx:%d rx:%d",
|
|
|
+ seq_printf(m, "%d: uart:%s tx:%d rx:%d",
|
|
|
portnr, (portp->hwid == 1) ? "SC26198" : "CD1400",
|
|
|
(int) portp->stats.txtotal, (int) portp->stats.rxtotal);
|
|
|
|
|
|
if (portp->stats.rxframing)
|
|
|
- sp += sprintf(sp, " fe:%d", (int) portp->stats.rxframing);
|
|
|
+ seq_printf(m, " fe:%d", (int) portp->stats.rxframing);
|
|
|
if (portp->stats.rxparity)
|
|
|
- sp += sprintf(sp, " pe:%d", (int) portp->stats.rxparity);
|
|
|
+ seq_printf(m, " pe:%d", (int) portp->stats.rxparity);
|
|
|
if (portp->stats.rxbreaks)
|
|
|
- sp += sprintf(sp, " brk:%d", (int) portp->stats.rxbreaks);
|
|
|
+ seq_printf(m, " brk:%d", (int) portp->stats.rxbreaks);
|
|
|
if (portp->stats.rxoverrun)
|
|
|
- sp += sprintf(sp, " oe:%d", (int) portp->stats.rxoverrun);
|
|
|
+ seq_printf(m, " oe:%d", (int) portp->stats.rxoverrun);
|
|
|
|
|
|
sigs = stl_getsignals(portp);
|
|
|
- cnt = sprintf(sp, "%s%s%s%s%s ",
|
|
|
- (sigs & TIOCM_RTS) ? "|RTS" : "",
|
|
|
- (sigs & TIOCM_CTS) ? "|CTS" : "",
|
|
|
- (sigs & TIOCM_DTR) ? "|DTR" : "",
|
|
|
- (sigs & TIOCM_CD) ? "|DCD" : "",
|
|
|
- (sigs & TIOCM_DSR) ? "|DSR" : "");
|
|
|
- *sp = ' ';
|
|
|
- sp += cnt;
|
|
|
-
|
|
|
- for (cnt = sp - pos; cnt < (MAXLINE - 1); cnt++)
|
|
|
- *sp++ = ' ';
|
|
|
- if (cnt >= MAXLINE)
|
|
|
- pos[(MAXLINE - 2)] = '+';
|
|
|
- pos[(MAXLINE - 1)] = '\n';
|
|
|
-
|
|
|
- return MAXLINE;
|
|
|
+ sep = ' ';
|
|
|
+ if (sigs & TIOCM_RTS) {
|
|
|
+ seq_printf(m, "%c%s", sep, "RTS");
|
|
|
+ sep = '|';
|
|
|
+ }
|
|
|
+ if (sigs & TIOCM_CTS) {
|
|
|
+ seq_printf(m, "%c%s", sep, "CTS");
|
|
|
+ sep = '|';
|
|
|
+ }
|
|
|
+ if (sigs & TIOCM_DTR) {
|
|
|
+ seq_printf(m, "%c%s", sep, "DTR");
|
|
|
+ sep = '|';
|
|
|
+ }
|
|
|
+ if (sigs & TIOCM_CD) {
|
|
|
+ seq_printf(m, "%c%s", sep, "DCD");
|
|
|
+ sep = '|';
|
|
|
+ }
|
|
|
+ if (sigs & TIOCM_DSR) {
|
|
|
+ seq_printf(m, "%c%s", sep, "DSR");
|
|
|
+ sep = '|';
|
|
|
+ }
|
|
|
+ seq_putc(m, '\n');
|
|
|
}
|
|
|
|
|
|
/*****************************************************************************/
|
|
@@ -1433,30 +1429,17 @@ static int stl_portinfo(struct stlport *portp, int portnr, char *pos)
|
|
|
* Port info, read from the /proc file system.
|
|
|
*/
|
|
|
|
|
|
-static int stl_readproc(char *page, char **start, off_t off, int count, int *eof, void *data)
|
|
|
+static int stl_proc_show(struct seq_file *m, void *v)
|
|
|
{
|
|
|
struct stlbrd *brdp;
|
|
|
struct stlpanel *panelp;
|
|
|
struct stlport *portp;
|
|
|
unsigned int brdnr, panelnr, portnr;
|
|
|
- int totalport, curoff, maxoff;
|
|
|
- char *pos;
|
|
|
+ int totalport;
|
|
|
|
|
|
- pr_debug("stl_readproc(page=%p,start=%p,off=%lx,count=%d,eof=%p,"
|
|
|
- "data=%p\n", page, start, off, count, eof, data);
|
|
|
-
|
|
|
- pos = page;
|
|
|
totalport = 0;
|
|
|
- curoff = 0;
|
|
|
-
|
|
|
- if (off == 0) {
|
|
|
- pos += sprintf(pos, "%s: version %s", stl_drvtitle,
|
|
|
- stl_drvversion);
|
|
|
- while (pos < (page + MAXLINE - 1))
|
|
|
- *pos++ = ' ';
|
|
|
- *pos++ = '\n';
|
|
|
- }
|
|
|
- curoff = MAXLINE;
|
|
|
+
|
|
|
+ seq_printf(m, "%s: version %s\n", stl_drvtitle, stl_drvversion);
|
|
|
|
|
|
/*
|
|
|
* We scan through for each board, panel and port. The offset is
|
|
@@ -1469,46 +1452,37 @@ static int stl_readproc(char *page, char **start, off_t off, int count, int *eof
|
|
|
if (brdp->state == 0)
|
|
|
continue;
|
|
|
|
|
|
- maxoff = curoff + (brdp->nrports * MAXLINE);
|
|
|
- if (off >= maxoff) {
|
|
|
- curoff = maxoff;
|
|
|
- continue;
|
|
|
- }
|
|
|
-
|
|
|
totalport = brdnr * STL_MAXPORTS;
|
|
|
for (panelnr = 0; panelnr < brdp->nrpanels; panelnr++) {
|
|
|
panelp = brdp->panels[panelnr];
|
|
|
if (panelp == NULL)
|
|
|
continue;
|
|
|
|
|
|
- maxoff = curoff + (panelp->nrports * MAXLINE);
|
|
|
- if (off >= maxoff) {
|
|
|
- curoff = maxoff;
|
|
|
- totalport += panelp->nrports;
|
|
|
- continue;
|
|
|
- }
|
|
|
-
|
|
|
for (portnr = 0; portnr < panelp->nrports; portnr++,
|
|
|
totalport++) {
|
|
|
portp = panelp->ports[portnr];
|
|
|
if (portp == NULL)
|
|
|
continue;
|
|
|
- if (off >= (curoff += MAXLINE))
|
|
|
- continue;
|
|
|
- if ((pos - page + MAXLINE) > count)
|
|
|
- goto stl_readdone;
|
|
|
- pos += stl_portinfo(portp, totalport, pos);
|
|
|
+ stl_portinfo(m, portp, totalport);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
+ return 0;
|
|
|
+}
|
|
|
|
|
|
- *eof = 1;
|
|
|
-
|
|
|
-stl_readdone:
|
|
|
- *start = page;
|
|
|
- return pos - page;
|
|
|
+static int stl_proc_open(struct inode *inode, struct file *file)
|
|
|
+{
|
|
|
+ return single_open(file, stl_proc_show, NULL);
|
|
|
}
|
|
|
|
|
|
+static const struct file_operations stl_proc_fops = {
|
|
|
+ .owner = THIS_MODULE,
|
|
|
+ .open = stl_proc_open,
|
|
|
+ .read = seq_read,
|
|
|
+ .llseek = seq_lseek,
|
|
|
+ .release = single_release,
|
|
|
+};
|
|
|
+
|
|
|
/*****************************************************************************/
|
|
|
|
|
|
/*
|
|
@@ -2566,9 +2540,9 @@ static const struct tty_operations stl_ops = {
|
|
|
.break_ctl = stl_breakctl,
|
|
|
.wait_until_sent = stl_waituntilsent,
|
|
|
.send_xchar = stl_sendxchar,
|
|
|
- .read_proc = stl_readproc,
|
|
|
.tiocmget = stl_tiocmget,
|
|
|
.tiocmset = stl_tiocmset,
|
|
|
+ .proc_fops = &stl_proc_fops,
|
|
|
};
|
|
|
|
|
|
static const struct tty_port_operations stl_port_ops = {
|