diff options
author | Alexey Dobriyan <adobriyan@gmail.com> | 2010-01-14 06:10:54 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2010-01-14 06:10:54 -0500 |
commit | 9a58a80a701bdb2d220cdab4914218df5b48d781 (patch) | |
tree | 01eeb65ec70f22ec326d0938d002cc6a2aec73e8 /drivers | |
parent | 508e14b4a4fb1a824a14f2c5b8d7df67b313f8e4 (diff) |
proc_fops: convert drivers/isdn/ to seq_file
Convert code away from ->read_proc/->write_proc interfaces. Switch to
proc_create()/proc_create_data() which make addition of proc entries
reliable wrt NULL ->proc_fops, NULL ->data and so on.
Problem with ->read_proc et al is described here commit
786d7e1612f0b0adb6046f19b906609e4fe8b1ba "Fix rmmod/read/write races in
/proc entries"
[akpm@linux-foundation.org: CONFIG_PROC_FS=n build fix]
Signed-off-by: Alexey Dobriyan <adobriyan@gmail.com>
Signed-off-by: Tilman Schmidt <tilman@imap.cc>
Signed-off-by: Karsten Keil <keil@b1-systems.de>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/isdn/capi/capi.c | 99 | ||||
-rw-r--r-- | drivers/isdn/capi/capidrv.c | 55 | ||||
-rw-r--r-- | drivers/isdn/capi/kcapi.c | 8 | ||||
-rw-r--r-- | drivers/isdn/gigaset/capi.c | 75 | ||||
-rw-r--r-- | drivers/isdn/hardware/avm/avmcard.h | 6 | ||||
-rw-r--r-- | drivers/isdn/hardware/avm/b1.c | 54 | ||||
-rw-r--r-- | drivers/isdn/hardware/avm/b1dma.c | 71 | ||||
-rw-r--r-- | drivers/isdn/hardware/avm/b1isa.c | 2 | ||||
-rw-r--r-- | drivers/isdn/hardware/avm/b1pci.c | 4 | ||||
-rw-r--r-- | drivers/isdn/hardware/avm/b1pcmcia.c | 2 | ||||
-rw-r--r-- | drivers/isdn/hardware/avm/c4.c | 53 | ||||
-rw-r--r-- | drivers/isdn/hardware/avm/t1isa.c | 2 | ||||
-rw-r--r-- | drivers/isdn/hardware/avm/t1pci.c | 2 | ||||
-rw-r--r-- | drivers/isdn/hardware/eicon/capimain.c | 40 | ||||
-rw-r--r-- | drivers/isdn/hardware/eicon/diva_didd.c | 45 | ||||
-rw-r--r-- | drivers/isdn/hardware/eicon/divasi.c | 48 | ||||
-rw-r--r-- | drivers/isdn/hardware/eicon/divasproc.c | 198 | ||||
-rw-r--r-- | drivers/isdn/hysdn/hycapi.c | 56 |
18 files changed, 384 insertions, 436 deletions
diff --git a/drivers/isdn/capi/capi.c b/drivers/isdn/capi/capi.c index 65bf91e16a42..79f9364aded6 100644 --- a/drivers/isdn/capi/capi.c +++ b/drivers/isdn/capi/capi.c | |||
@@ -33,6 +33,7 @@ | |||
33 | #endif /* CONFIG_ISDN_CAPI_MIDDLEWARE */ | 33 | #endif /* CONFIG_ISDN_CAPI_MIDDLEWARE */ |
34 | #include <linux/skbuff.h> | 34 | #include <linux/skbuff.h> |
35 | #include <linux/proc_fs.h> | 35 | #include <linux/proc_fs.h> |
36 | #include <linux/seq_file.h> | ||
36 | #include <linux/poll.h> | 37 | #include <linux/poll.h> |
37 | #include <linux/capi.h> | 38 | #include <linux/capi.h> |
38 | #include <linux/kernelcapi.h> | 39 | #include <linux/kernelcapi.h> |
@@ -1407,114 +1408,84 @@ static void capinc_tty_exit(void) | |||
1407 | * /proc/capi/capi20: | 1408 | * /proc/capi/capi20: |
1408 | * minor applid nrecvctlpkt nrecvdatapkt nsendctlpkt nsenddatapkt | 1409 | * minor applid nrecvctlpkt nrecvdatapkt nsendctlpkt nsenddatapkt |
1409 | */ | 1410 | */ |
1410 | static int proc_capidev_read_proc(char *page, char **start, off_t off, | 1411 | static int capi20_proc_show(struct seq_file *m, void *v) |
1411 | int count, int *eof, void *data) | ||
1412 | { | 1412 | { |
1413 | struct capidev *cdev; | 1413 | struct capidev *cdev; |
1414 | struct list_head *l; | 1414 | struct list_head *l; |
1415 | int len = 0; | ||
1416 | 1415 | ||
1417 | read_lock(&capidev_list_lock); | 1416 | read_lock(&capidev_list_lock); |
1418 | list_for_each(l, &capidev_list) { | 1417 | list_for_each(l, &capidev_list) { |
1419 | cdev = list_entry(l, struct capidev, list); | 1418 | cdev = list_entry(l, struct capidev, list); |
1420 | len += sprintf(page+len, "0 %d %lu %lu %lu %lu\n", | 1419 | seq_printf(m, "0 %d %lu %lu %lu %lu\n", |
1421 | cdev->ap.applid, | 1420 | cdev->ap.applid, |
1422 | cdev->ap.nrecvctlpkt, | 1421 | cdev->ap.nrecvctlpkt, |
1423 | cdev->ap.nrecvdatapkt, | 1422 | cdev->ap.nrecvdatapkt, |
1424 | cdev->ap.nsentctlpkt, | 1423 | cdev->ap.nsentctlpkt, |
1425 | cdev->ap.nsentdatapkt); | 1424 | cdev->ap.nsentdatapkt); |
1426 | if (len <= off) { | ||
1427 | off -= len; | ||
1428 | len = 0; | ||
1429 | } else { | ||
1430 | if (len-off > count) | ||
1431 | goto endloop; | ||
1432 | } | ||
1433 | } | 1425 | } |
1434 | |||
1435 | endloop: | ||
1436 | read_unlock(&capidev_list_lock); | 1426 | read_unlock(&capidev_list_lock); |
1437 | if (len < count) | 1427 | return 0; |
1438 | *eof = 1; | ||
1439 | if (len > count) len = count; | ||
1440 | if (len < 0) len = 0; | ||
1441 | return len; | ||
1442 | } | 1428 | } |
1443 | 1429 | ||
1430 | static int capi20_proc_open(struct inode *inode, struct file *file) | ||
1431 | { | ||
1432 | return single_open(file, capi20_proc_show, NULL); | ||
1433 | } | ||
1434 | |||
1435 | static const struct file_operations capi20_proc_fops = { | ||
1436 | .owner = THIS_MODULE, | ||
1437 | .open = capi20_proc_open, | ||
1438 | .read = seq_read, | ||
1439 | .llseek = seq_lseek, | ||
1440 | .release = single_release, | ||
1441 | }; | ||
1442 | |||
1444 | /* | 1443 | /* |
1445 | * /proc/capi/capi20ncci: | 1444 | * /proc/capi/capi20ncci: |
1446 | * applid ncci | 1445 | * applid ncci |
1447 | */ | 1446 | */ |
1448 | static int proc_capincci_read_proc(char *page, char **start, off_t off, | 1447 | static int capi20ncci_proc_show(struct seq_file *m, void *v) |
1449 | int count, int *eof, void *data) | ||
1450 | { | 1448 | { |
1451 | struct capidev *cdev; | 1449 | struct capidev *cdev; |
1452 | struct capincci *np; | 1450 | struct capincci *np; |
1453 | struct list_head *l; | 1451 | struct list_head *l; |
1454 | int len = 0; | ||
1455 | 1452 | ||
1456 | read_lock(&capidev_list_lock); | 1453 | read_lock(&capidev_list_lock); |
1457 | list_for_each(l, &capidev_list) { | 1454 | list_for_each(l, &capidev_list) { |
1458 | cdev = list_entry(l, struct capidev, list); | 1455 | cdev = list_entry(l, struct capidev, list); |
1459 | for (np=cdev->nccis; np; np = np->next) { | 1456 | for (np=cdev->nccis; np; np = np->next) { |
1460 | len += sprintf(page+len, "%d 0x%x\n", | 1457 | seq_printf(m, "%d 0x%x\n", |
1461 | cdev->ap.applid, | 1458 | cdev->ap.applid, |
1462 | np->ncci); | 1459 | np->ncci); |
1463 | if (len <= off) { | ||
1464 | off -= len; | ||
1465 | len = 0; | ||
1466 | } else { | ||
1467 | if (len-off > count) | ||
1468 | goto endloop; | ||
1469 | } | ||
1470 | } | 1460 | } |
1471 | } | 1461 | } |
1472 | endloop: | ||
1473 | read_unlock(&capidev_list_lock); | 1462 | read_unlock(&capidev_list_lock); |
1474 | *start = page+off; | 1463 | return 0; |
1475 | if (len < count) | ||
1476 | *eof = 1; | ||
1477 | if (len>count) len = count; | ||
1478 | if (len<0) len = 0; | ||
1479 | return len; | ||
1480 | } | 1464 | } |
1481 | 1465 | ||
1482 | static struct procfsentries { | 1466 | static int capi20ncci_proc_open(struct inode *inode, struct file *file) |
1483 | char *name; | 1467 | { |
1484 | mode_t mode; | 1468 | return single_open(file, capi20ncci_proc_show, NULL); |
1485 | int (*read_proc)(char *page, char **start, off_t off, | 1469 | } |
1486 | int count, int *eof, void *data); | 1470 | |
1487 | struct proc_dir_entry *procent; | 1471 | static const struct file_operations capi20ncci_proc_fops = { |
1488 | } procfsentries[] = { | 1472 | .owner = THIS_MODULE, |
1489 | /* { "capi", S_IFDIR, 0 }, */ | 1473 | .open = capi20ncci_proc_open, |
1490 | { "capi/capi20", 0 , proc_capidev_read_proc }, | 1474 | .read = seq_read, |
1491 | { "capi/capi20ncci", 0 , proc_capincci_read_proc }, | 1475 | .llseek = seq_lseek, |
1476 | .release = single_release, | ||
1492 | }; | 1477 | }; |
1493 | 1478 | ||
1494 | static void __init proc_init(void) | 1479 | static void __init proc_init(void) |
1495 | { | 1480 | { |
1496 | int nelem = ARRAY_SIZE(procfsentries); | 1481 | proc_create("capi/capi20", 0, NULL, &capi20_proc_fops); |
1497 | int i; | 1482 | proc_create("capi/capi20ncci", 0, NULL, &capi20ncci_proc_fops); |
1498 | |||
1499 | for (i=0; i < nelem; i++) { | ||
1500 | struct procfsentries *p = procfsentries + i; | ||
1501 | p->procent = create_proc_entry(p->name, p->mode, NULL); | ||
1502 | if (p->procent) p->procent->read_proc = p->read_proc; | ||
1503 | } | ||
1504 | } | 1483 | } |
1505 | 1484 | ||
1506 | static void __exit proc_exit(void) | 1485 | static void __exit proc_exit(void) |
1507 | { | 1486 | { |
1508 | int nelem = ARRAY_SIZE(procfsentries); | 1487 | remove_proc_entry("capi/capi20", NULL); |
1509 | int i; | 1488 | remove_proc_entry("capi/capi20ncci", NULL); |
1510 | |||
1511 | for (i=nelem-1; i >= 0; i--) { | ||
1512 | struct procfsentries *p = procfsentries + i; | ||
1513 | if (p->procent) { | ||
1514 | remove_proc_entry(p->name, NULL); | ||
1515 | p->procent = NULL; | ||
1516 | } | ||
1517 | } | ||
1518 | } | 1489 | } |
1519 | 1490 | ||
1520 | /* -------- init function and module interface ---------------------- */ | 1491 | /* -------- init function and module interface ---------------------- */ |
diff --git a/drivers/isdn/capi/capidrv.c b/drivers/isdn/capi/capidrv.c index 66b7d7a86474..bb450152fb74 100644 --- a/drivers/isdn/capi/capidrv.c +++ b/drivers/isdn/capi/capidrv.c | |||
@@ -24,6 +24,7 @@ | |||
24 | #include <linux/isdn.h> | 24 | #include <linux/isdn.h> |
25 | #include <linux/isdnif.h> | 25 | #include <linux/isdnif.h> |
26 | #include <linux/proc_fs.h> | 26 | #include <linux/proc_fs.h> |
27 | #include <linux/seq_file.h> | ||
27 | #include <linux/capi.h> | 28 | #include <linux/capi.h> |
28 | #include <linux/kernelcapi.h> | 29 | #include <linux/kernelcapi.h> |
29 | #include <linux/ctype.h> | 30 | #include <linux/ctype.h> |
@@ -2229,59 +2230,37 @@ static void lower_callback(unsigned int cmd, u32 contr, void *data) | |||
2229 | * /proc/capi/capidrv: | 2230 | * /proc/capi/capidrv: |
2230 | * nrecvctlpkt nrecvdatapkt nsendctlpkt nsenddatapkt | 2231 | * nrecvctlpkt nrecvdatapkt nsendctlpkt nsenddatapkt |
2231 | */ | 2232 | */ |
2232 | static int proc_capidrv_read_proc(char *page, char **start, off_t off, | 2233 | static int capidrv_proc_show(struct seq_file *m, void *v) |
2233 | int count, int *eof, void *data) | ||
2234 | { | 2234 | { |
2235 | int len = 0; | 2235 | seq_printf(m, "%lu %lu %lu %lu\n", |
2236 | |||
2237 | len += sprintf(page+len, "%lu %lu %lu %lu\n", | ||
2238 | global.ap.nrecvctlpkt, | 2236 | global.ap.nrecvctlpkt, |
2239 | global.ap.nrecvdatapkt, | 2237 | global.ap.nrecvdatapkt, |
2240 | global.ap.nsentctlpkt, | 2238 | global.ap.nsentctlpkt, |
2241 | global.ap.nsentdatapkt); | 2239 | global.ap.nsentdatapkt); |
2242 | if (off+count >= len) | 2240 | return 0; |
2243 | *eof = 1; | 2241 | } |
2244 | if (len < off) | 2242 | |
2245 | return 0; | 2243 | static int capidrv_proc_open(struct inode *inode, struct file *file) |
2246 | *start = page + off; | 2244 | { |
2247 | return ((count < len-off) ? count : len-off); | 2245 | return single_open(file, capidrv_proc_show, NULL); |
2248 | } | 2246 | } |
2249 | 2247 | ||
2250 | static struct procfsentries { | 2248 | static const struct file_operations capidrv_proc_fops = { |
2251 | char *name; | 2249 | .owner = THIS_MODULE, |
2252 | mode_t mode; | 2250 | .open = capidrv_proc_open, |
2253 | int (*read_proc)(char *page, char **start, off_t off, | 2251 | .read = seq_read, |
2254 | int count, int *eof, void *data); | 2252 | .llseek = seq_lseek, |
2255 | struct proc_dir_entry *procent; | 2253 | .release = single_release, |
2256 | } procfsentries[] = { | ||
2257 | /* { "capi", S_IFDIR, 0 }, */ | ||
2258 | { "capi/capidrv", 0 , proc_capidrv_read_proc }, | ||
2259 | }; | 2254 | }; |
2260 | 2255 | ||
2261 | static void __init proc_init(void) | 2256 | static void __init proc_init(void) |
2262 | { | 2257 | { |
2263 | int nelem = ARRAY_SIZE(procfsentries); | 2258 | proc_create("capi/capidrv", 0, NULL, &capidrv_proc_fops); |
2264 | int i; | ||
2265 | |||
2266 | for (i=0; i < nelem; i++) { | ||
2267 | struct procfsentries *p = procfsentries + i; | ||
2268 | p->procent = create_proc_entry(p->name, p->mode, NULL); | ||
2269 | if (p->procent) p->procent->read_proc = p->read_proc; | ||
2270 | } | ||
2271 | } | 2259 | } |
2272 | 2260 | ||
2273 | static void __exit proc_exit(void) | 2261 | static void __exit proc_exit(void) |
2274 | { | 2262 | { |
2275 | int nelem = ARRAY_SIZE(procfsentries); | 2263 | remove_proc_entry("capi/capidrv", NULL); |
2276 | int i; | ||
2277 | |||
2278 | for (i=nelem-1; i >= 0; i--) { | ||
2279 | struct procfsentries *p = procfsentries + i; | ||
2280 | if (p->procent) { | ||
2281 | remove_proc_entry(p->name, NULL); | ||
2282 | p->procent = NULL; | ||
2283 | } | ||
2284 | } | ||
2285 | } | 2264 | } |
2286 | 2265 | ||
2287 | static int __init capidrv_init(void) | 2266 | static int __init capidrv_init(void) |
diff --git a/drivers/isdn/capi/kcapi.c b/drivers/isdn/capi/kcapi.c index dc506ab99cac..b0bacf377c18 100644 --- a/drivers/isdn/capi/kcapi.c +++ b/drivers/isdn/capi/kcapi.c | |||
@@ -490,13 +490,7 @@ attach_capi_ctr(struct capi_ctr *card) | |||
490 | card->traceflag = showcapimsgs; | 490 | card->traceflag = showcapimsgs; |
491 | 491 | ||
492 | sprintf(card->procfn, "capi/controllers/%d", card->cnr); | 492 | sprintf(card->procfn, "capi/controllers/%d", card->cnr); |
493 | card->procent = create_proc_entry(card->procfn, 0, NULL); | 493 | card->procent = proc_create_data(card->procfn, 0, NULL, card->proc_fops, card); |
494 | if (card->procent) { | ||
495 | card->procent->read_proc = | ||
496 | (int (*)(char *,char **,off_t,int,int *,void *)) | ||
497 | card->ctr_read_proc; | ||
498 | card->procent->data = card; | ||
499 | } | ||
500 | 494 | ||
501 | ncards++; | 495 | ncards++; |
502 | printk(KERN_NOTICE "kcapi: Controller [%03d]: %s attached\n", | 496 | printk(KERN_NOTICE "kcapi: Controller [%03d]: %s attached\n", |
diff --git a/drivers/isdn/gigaset/capi.c b/drivers/isdn/gigaset/capi.c index 3f5cd06af104..6f0ae32906bf 100644 --- a/drivers/isdn/gigaset/capi.c +++ b/drivers/isdn/gigaset/capi.c | |||
@@ -13,6 +13,8 @@ | |||
13 | 13 | ||
14 | #include "gigaset.h" | 14 | #include "gigaset.h" |
15 | #include <linux/ctype.h> | 15 | #include <linux/ctype.h> |
16 | #include <linux/proc_fs.h> | ||
17 | #include <linux/seq_file.h> | ||
16 | #include <linux/isdn/capilli.h> | 18 | #include <linux/isdn/capilli.h> |
17 | #include <linux/isdn/capicmd.h> | 19 | #include <linux/isdn/capicmd.h> |
18 | #include <linux/isdn/capiutil.h> | 20 | #include <linux/isdn/capiutil.h> |
@@ -2106,35 +2108,22 @@ static char *gigaset_procinfo(struct capi_ctr *ctr) | |||
2106 | return ctr->name; /* ToDo: more? */ | 2108 | return ctr->name; /* ToDo: more? */ |
2107 | } | 2109 | } |
2108 | 2110 | ||
2109 | /** | 2111 | static int gigaset_proc_show(struct seq_file *m, void *v) |
2110 | * gigaset_ctr_read_proc() - build controller proc file entry | ||
2111 | * @page: buffer of PAGE_SIZE bytes for receiving the entry. | ||
2112 | * @start: unused. | ||
2113 | * @off: unused. | ||
2114 | * @count: unused. | ||
2115 | * @eof: unused. | ||
2116 | * @ctr: controller descriptor structure. | ||
2117 | * | ||
2118 | * Return value: length of generated entry | ||
2119 | */ | ||
2120 | static int gigaset_ctr_read_proc(char *page, char **start, off_t off, | ||
2121 | int count, int *eof, struct capi_ctr *ctr) | ||
2122 | { | 2112 | { |
2113 | struct capi_ctr *ctr = m->private; | ||
2123 | struct cardstate *cs = ctr->driverdata; | 2114 | struct cardstate *cs = ctr->driverdata; |
2124 | char *s; | 2115 | char *s; |
2125 | int i; | 2116 | int i; |
2126 | int len = 0; | 2117 | |
2127 | len += sprintf(page+len, "%-16s %s\n", "name", ctr->name); | 2118 | seq_printf(m, "%-16s %s\n", "name", ctr->name); |
2128 | len += sprintf(page+len, "%-16s %s %s\n", "dev", | 2119 | seq_printf(m, "%-16s %s %s\n", "dev", |
2129 | dev_driver_string(cs->dev), dev_name(cs->dev)); | 2120 | dev_driver_string(cs->dev), dev_name(cs->dev)); |
2130 | len += sprintf(page+len, "%-16s %d\n", "id", cs->myid); | 2121 | seq_printf(m, "%-16s %d\n", "id", cs->myid); |
2131 | if (cs->gotfwver) | 2122 | if (cs->gotfwver) |
2132 | len += sprintf(page+len, "%-16s %d.%d.%d.%d\n", "firmware", | 2123 | seq_printf(m, "%-16s %d.%d.%d.%d\n", "firmware", |
2133 | cs->fwver[0], cs->fwver[1], cs->fwver[2], cs->fwver[3]); | 2124 | cs->fwver[0], cs->fwver[1], cs->fwver[2], cs->fwver[3]); |
2134 | len += sprintf(page+len, "%-16s %d\n", "channels", | 2125 | seq_printf(m, "%-16s %d\n", "channels", cs->channels); |
2135 | cs->channels); | 2126 | seq_printf(m, "%-16s %s\n", "onechannel", cs->onechannel ? "yes" : "no"); |
2136 | len += sprintf(page+len, "%-16s %s\n", "onechannel", | ||
2137 | cs->onechannel ? "yes" : "no"); | ||
2138 | 2127 | ||
2139 | switch (cs->mode) { | 2128 | switch (cs->mode) { |
2140 | case M_UNKNOWN: | 2129 | case M_UNKNOWN: |
@@ -2152,7 +2141,7 @@ static int gigaset_ctr_read_proc(char *page, char **start, off_t off, | |||
2152 | default: | 2141 | default: |
2153 | s = "??"; | 2142 | s = "??"; |
2154 | } | 2143 | } |
2155 | len += sprintf(page+len, "%-16s %s\n", "mode", s); | 2144 | seq_printf(m, "%-16s %s\n", "mode", s); |
2156 | 2145 | ||
2157 | switch (cs->mstate) { | 2146 | switch (cs->mstate) { |
2158 | case MS_UNINITIALIZED: | 2147 | case MS_UNINITIALIZED: |
@@ -2176,25 +2165,21 @@ static int gigaset_ctr_read_proc(char *page, char **start, off_t off, | |||
2176 | default: | 2165 | default: |
2177 | s = "??"; | 2166 | s = "??"; |
2178 | } | 2167 | } |
2179 | len += sprintf(page+len, "%-16s %s\n", "mstate", s); | 2168 | seq_printf(m, "%-16s %s\n", "mstate", s); |
2180 | 2169 | ||
2181 | len += sprintf(page+len, "%-16s %s\n", "running", | 2170 | seq_printf(m, "%-16s %s\n", "running", cs->running ? "yes" : "no"); |
2182 | cs->running ? "yes" : "no"); | 2171 | seq_printf(m, "%-16s %s\n", "connected", cs->connected ? "yes" : "no"); |
2183 | len += sprintf(page+len, "%-16s %s\n", "connected", | 2172 | seq_printf(m, "%-16s %s\n", "isdn_up", cs->isdn_up ? "yes" : "no"); |
2184 | cs->connected ? "yes" : "no"); | 2173 | seq_printf(m, "%-16s %s\n", "cidmode", cs->cidmode ? "yes" : "no"); |
2185 | len += sprintf(page+len, "%-16s %s\n", "isdn_up", | ||
2186 | cs->isdn_up ? "yes" : "no"); | ||
2187 | len += sprintf(page+len, "%-16s %s\n", "cidmode", | ||
2188 | cs->cidmode ? "yes" : "no"); | ||
2189 | 2174 | ||
2190 | for (i = 0; i < cs->channels; i++) { | 2175 | for (i = 0; i < cs->channels; i++) { |
2191 | len += sprintf(page+len, "[%d]%-13s %d\n", i, "corrupted", | 2176 | seq_printf(m, "[%d]%-13s %d\n", i, "corrupted", |
2192 | cs->bcs[i].corrupted); | 2177 | cs->bcs[i].corrupted); |
2193 | len += sprintf(page+len, "[%d]%-13s %d\n", i, "trans_down", | 2178 | seq_printf(m, "[%d]%-13s %d\n", i, "trans_down", |
2194 | cs->bcs[i].trans_down); | 2179 | cs->bcs[i].trans_down); |
2195 | len += sprintf(page+len, "[%d]%-13s %d\n", i, "trans_up", | 2180 | seq_printf(m, "[%d]%-13s %d\n", i, "trans_up", |
2196 | cs->bcs[i].trans_up); | 2181 | cs->bcs[i].trans_up); |
2197 | len += sprintf(page+len, "[%d]%-13s %d\n", i, "chstate", | 2182 | seq_printf(m, "[%d]%-13s %d\n", i, "chstate", |
2198 | cs->bcs[i].chstate); | 2183 | cs->bcs[i].chstate); |
2199 | switch (cs->bcs[i].proto2) { | 2184 | switch (cs->bcs[i].proto2) { |
2200 | case L2_BITSYNC: | 2185 | case L2_BITSYNC: |
@@ -2209,11 +2194,23 @@ static int gigaset_ctr_read_proc(char *page, char **start, off_t off, | |||
2209 | default: | 2194 | default: |
2210 | s = "??"; | 2195 | s = "??"; |
2211 | } | 2196 | } |
2212 | len += sprintf(page+len, "[%d]%-13s %s\n", i, "proto2", s); | 2197 | seq_printf(m, "[%d]%-13s %s\n", i, "proto2", s); |
2213 | } | 2198 | } |
2214 | return len; | 2199 | return 0; |
2215 | } | 2200 | } |
2216 | 2201 | ||
2202 | static int gigaset_proc_open(struct inode *inode, struct file *file) | ||
2203 | { | ||
2204 | return single_open(file, gigaset_proc_show, PDE(inode)->data); | ||
2205 | } | ||
2206 | |||
2207 | static const struct file_operations gigaset_proc_fops = { | ||
2208 | .owner = THIS_MODULE, | ||
2209 | .open = gigaset_proc_open, | ||
2210 | .read = seq_read, | ||
2211 | .llseek = seq_lseek, | ||
2212 | .release = single_release, | ||
2213 | }; | ||
2217 | 2214 | ||
2218 | static struct capi_driver capi_driver_gigaset = { | 2215 | static struct capi_driver capi_driver_gigaset = { |
2219 | .name = "gigaset", | 2216 | .name = "gigaset", |
@@ -2256,7 +2253,7 @@ int gigaset_isdn_register(struct cardstate *cs, const char *isdnid) | |||
2256 | iif->ctr.release_appl = gigaset_release_appl; | 2253 | iif->ctr.release_appl = gigaset_release_appl; |
2257 | iif->ctr.send_message = gigaset_send_message; | 2254 | iif->ctr.send_message = gigaset_send_message; |
2258 | iif->ctr.procinfo = gigaset_procinfo; | 2255 | iif->ctr.procinfo = gigaset_procinfo; |
2259 | iif->ctr.ctr_read_proc = gigaset_ctr_read_proc; | 2256 | iif->ctr.proc_fops = &gigaset_proc_fops; |
2260 | INIT_LIST_HEAD(&iif->appls); | 2257 | INIT_LIST_HEAD(&iif->appls); |
2261 | skb_queue_head_init(&iif->sendqueue); | 2258 | skb_queue_head_init(&iif->sendqueue); |
2262 | atomic_set(&iif->sendqlen, 0); | 2259 | atomic_set(&iif->sendqlen, 0); |
diff --git a/drivers/isdn/hardware/avm/avmcard.h b/drivers/isdn/hardware/avm/avmcard.h index d964f07e4a56..a70e8854461d 100644 --- a/drivers/isdn/hardware/avm/avmcard.h +++ b/drivers/isdn/hardware/avm/avmcard.h | |||
@@ -556,8 +556,7 @@ u16 b1_send_message(struct capi_ctr *ctrl, struct sk_buff *skb); | |||
556 | void b1_parse_version(avmctrl_info *card); | 556 | void b1_parse_version(avmctrl_info *card); |
557 | irqreturn_t b1_interrupt(int interrupt, void *devptr); | 557 | irqreturn_t b1_interrupt(int interrupt, void *devptr); |
558 | 558 | ||
559 | int b1ctl_read_proc(char *page, char **start, off_t off, | 559 | extern const struct file_operations b1ctl_proc_fops; |
560 | int count, int *eof, struct capi_ctr *ctrl); | ||
561 | 560 | ||
562 | avmcard_dmainfo *avmcard_dma_alloc(char *name, struct pci_dev *, | 561 | avmcard_dmainfo *avmcard_dma_alloc(char *name, struct pci_dev *, |
563 | long rsize, long ssize); | 562 | long rsize, long ssize); |
@@ -577,7 +576,6 @@ void b1dma_register_appl(struct capi_ctr *ctrl, | |||
577 | capi_register_params *rp); | 576 | capi_register_params *rp); |
578 | void b1dma_release_appl(struct capi_ctr *ctrl, u16 appl); | 577 | void b1dma_release_appl(struct capi_ctr *ctrl, u16 appl); |
579 | u16 b1dma_send_message(struct capi_ctr *ctrl, struct sk_buff *skb); | 578 | u16 b1dma_send_message(struct capi_ctr *ctrl, struct sk_buff *skb); |
580 | int b1dmactl_read_proc(char *page, char **start, off_t off, | 579 | extern const struct file_operations b1dmactl_proc_fops; |
581 | int count, int *eof, struct capi_ctr *ctrl); | ||
582 | 580 | ||
583 | #endif /* _AVMCARD_H_ */ | 581 | #endif /* _AVMCARD_H_ */ |
diff --git a/drivers/isdn/hardware/avm/b1.c b/drivers/isdn/hardware/avm/b1.c index a7c0083e78a7..c38fa0f4c729 100644 --- a/drivers/isdn/hardware/avm/b1.c +++ b/drivers/isdn/hardware/avm/b1.c | |||
@@ -12,6 +12,8 @@ | |||
12 | #include <linux/module.h> | 12 | #include <linux/module.h> |
13 | #include <linux/kernel.h> | 13 | #include <linux/kernel.h> |
14 | #include <linux/pci.h> | 14 | #include <linux/pci.h> |
15 | #include <linux/proc_fs.h> | ||
16 | #include <linux/seq_file.h> | ||
15 | #include <linux/skbuff.h> | 17 | #include <linux/skbuff.h> |
16 | #include <linux/delay.h> | 18 | #include <linux/delay.h> |
17 | #include <linux/mm.h> | 19 | #include <linux/mm.h> |
@@ -634,18 +636,17 @@ irqreturn_t b1_interrupt(int interrupt, void *devptr) | |||
634 | } | 636 | } |
635 | 637 | ||
636 | /* ------------------------------------------------------------- */ | 638 | /* ------------------------------------------------------------- */ |
637 | int b1ctl_read_proc(char *page, char **start, off_t off, | 639 | static int b1ctl_proc_show(struct seq_file *m, void *v) |
638 | int count, int *eof, struct capi_ctr *ctrl) | ||
639 | { | 640 | { |
641 | struct capi_ctr *ctrl = m->private; | ||
640 | avmctrl_info *cinfo = (avmctrl_info *)(ctrl->driverdata); | 642 | avmctrl_info *cinfo = (avmctrl_info *)(ctrl->driverdata); |
641 | avmcard *card = cinfo->card; | 643 | avmcard *card = cinfo->card; |
642 | u8 flag; | 644 | u8 flag; |
643 | int len = 0; | ||
644 | char *s; | 645 | char *s; |
645 | 646 | ||
646 | len += sprintf(page+len, "%-16s %s\n", "name", card->name); | 647 | seq_printf(m, "%-16s %s\n", "name", card->name); |
647 | len += sprintf(page+len, "%-16s 0x%x\n", "io", card->port); | 648 | seq_printf(m, "%-16s 0x%x\n", "io", card->port); |
648 | len += sprintf(page+len, "%-16s %d\n", "irq", card->irq); | 649 | seq_printf(m, "%-16s %d\n", "irq", card->irq); |
649 | switch (card->cardtype) { | 650 | switch (card->cardtype) { |
650 | case avm_b1isa: s = "B1 ISA"; break; | 651 | case avm_b1isa: s = "B1 ISA"; break; |
651 | case avm_b1pci: s = "B1 PCI"; break; | 652 | case avm_b1pci: s = "B1 PCI"; break; |
@@ -658,20 +659,20 @@ int b1ctl_read_proc(char *page, char **start, off_t off, | |||
658 | case avm_c2: s = "C2"; break; | 659 | case avm_c2: s = "C2"; break; |
659 | default: s = "???"; break; | 660 | default: s = "???"; break; |
660 | } | 661 | } |
661 | len += sprintf(page+len, "%-16s %s\n", "type", s); | 662 | seq_printf(m, "%-16s %s\n", "type", s); |
662 | if (card->cardtype == avm_t1isa) | 663 | if (card->cardtype == avm_t1isa) |
663 | len += sprintf(page+len, "%-16s %d\n", "cardnr", card->cardnr); | 664 | seq_printf(m, "%-16s %d\n", "cardnr", card->cardnr); |
664 | if ((s = cinfo->version[VER_DRIVER]) != NULL) | 665 | if ((s = cinfo->version[VER_DRIVER]) != NULL) |
665 | len += sprintf(page+len, "%-16s %s\n", "ver_driver", s); | 666 | seq_printf(m, "%-16s %s\n", "ver_driver", s); |
666 | if ((s = cinfo->version[VER_CARDTYPE]) != NULL) | 667 | if ((s = cinfo->version[VER_CARDTYPE]) != NULL) |
667 | len += sprintf(page+len, "%-16s %s\n", "ver_cardtype", s); | 668 | seq_printf(m, "%-16s %s\n", "ver_cardtype", s); |
668 | if ((s = cinfo->version[VER_SERIAL]) != NULL) | 669 | if ((s = cinfo->version[VER_SERIAL]) != NULL) |
669 | len += sprintf(page+len, "%-16s %s\n", "ver_serial", s); | 670 | seq_printf(m, "%-16s %s\n", "ver_serial", s); |
670 | 671 | ||
671 | if (card->cardtype != avm_m1) { | 672 | if (card->cardtype != avm_m1) { |
672 | flag = ((u8 *)(ctrl->profile.manu))[3]; | 673 | flag = ((u8 *)(ctrl->profile.manu))[3]; |
673 | if (flag) | 674 | if (flag) |
674 | len += sprintf(page+len, "%-16s%s%s%s%s%s%s%s\n", | 675 | seq_printf(m, "%-16s%s%s%s%s%s%s%s\n", |
675 | "protocol", | 676 | "protocol", |
676 | (flag & 0x01) ? " DSS1" : "", | 677 | (flag & 0x01) ? " DSS1" : "", |
677 | (flag & 0x02) ? " CT1" : "", | 678 | (flag & 0x02) ? " CT1" : "", |
@@ -685,7 +686,7 @@ int b1ctl_read_proc(char *page, char **start, off_t off, | |||
685 | if (card->cardtype != avm_m1) { | 686 | if (card->cardtype != avm_m1) { |
686 | flag = ((u8 *)(ctrl->profile.manu))[5]; | 687 | flag = ((u8 *)(ctrl->profile.manu))[5]; |
687 | if (flag) | 688 | if (flag) |
688 | len += sprintf(page+len, "%-16s%s%s%s%s\n", | 689 | seq_printf(m, "%-16s%s%s%s%s\n", |
689 | "linetype", | 690 | "linetype", |
690 | (flag & 0x01) ? " point to point" : "", | 691 | (flag & 0x01) ? " point to point" : "", |
691 | (flag & 0x02) ? " point to multipoint" : "", | 692 | (flag & 0x02) ? " point to multipoint" : "", |
@@ -693,16 +694,25 @@ int b1ctl_read_proc(char *page, char **start, off_t off, | |||
693 | (flag & 0x04) ? " leased line with D-channel" : "" | 694 | (flag & 0x04) ? " leased line with D-channel" : "" |
694 | ); | 695 | ); |
695 | } | 696 | } |
696 | len += sprintf(page+len, "%-16s %s\n", "cardname", cinfo->cardname); | 697 | seq_printf(m, "%-16s %s\n", "cardname", cinfo->cardname); |
697 | 698 | ||
698 | if (off+count >= len) | 699 | return 0; |
699 | *eof = 1; | 700 | } |
700 | if (len < off) | 701 | |
701 | return 0; | 702 | static int b1ctl_proc_open(struct inode *inode, struct file *file) |
702 | *start = page + off; | 703 | { |
703 | return ((count < len-off) ? count : len-off); | 704 | return single_open(file, b1ctl_proc_show, PDE(inode)->data); |
704 | } | 705 | } |
705 | 706 | ||
707 | const struct file_operations b1ctl_proc_fops = { | ||
708 | .owner = THIS_MODULE, | ||
709 | .open = b1ctl_proc_open, | ||
710 | .read = seq_read, | ||
711 | .llseek = seq_lseek, | ||
712 | .release = single_release, | ||
713 | }; | ||
714 | EXPORT_SYMBOL(b1ctl_proc_fops); | ||
715 | |||
706 | /* ------------------------------------------------------------- */ | 716 | /* ------------------------------------------------------------- */ |
707 | 717 | ||
708 | #ifdef CONFIG_PCI | 718 | #ifdef CONFIG_PCI |
@@ -781,8 +791,6 @@ EXPORT_SYMBOL(b1_send_message); | |||
781 | EXPORT_SYMBOL(b1_parse_version); | 791 | EXPORT_SYMBOL(b1_parse_version); |
782 | EXPORT_SYMBOL(b1_interrupt); | 792 | EXPORT_SYMBOL(b1_interrupt); |
783 | 793 | ||
784 | EXPORT_SYMBOL(b1ctl_read_proc); | ||
785 | |||
786 | static int __init b1_init(void) | 794 | static int __init b1_init(void) |
787 | { | 795 | { |
788 | char *p; | 796 | char *p; |
diff --git a/drivers/isdn/hardware/avm/b1dma.c b/drivers/isdn/hardware/avm/b1dma.c index 0e84aaae43fd..124550d0dbf3 100644 --- a/drivers/isdn/hardware/avm/b1dma.c +++ b/drivers/isdn/hardware/avm/b1dma.c | |||
@@ -11,6 +11,8 @@ | |||
11 | 11 | ||
12 | #include <linux/module.h> | 12 | #include <linux/module.h> |
13 | #include <linux/kernel.h> | 13 | #include <linux/kernel.h> |
14 | #include <linux/proc_fs.h> | ||
15 | #include <linux/seq_file.h> | ||
14 | #include <linux/skbuff.h> | 16 | #include <linux/skbuff.h> |
15 | #include <linux/delay.h> | 17 | #include <linux/delay.h> |
16 | #include <linux/mm.h> | 18 | #include <linux/mm.h> |
@@ -855,21 +857,20 @@ u16 b1dma_send_message(struct capi_ctr *ctrl, struct sk_buff *skb) | |||
855 | 857 | ||
856 | /* ------------------------------------------------------------- */ | 858 | /* ------------------------------------------------------------- */ |
857 | 859 | ||
858 | int b1dmactl_read_proc(char *page, char **start, off_t off, | 860 | static int b1dmactl_proc_show(struct seq_file *m, void *v) |
859 | int count, int *eof, struct capi_ctr *ctrl) | ||
860 | { | 861 | { |
862 | struct capi_ctr *ctrl = m->private; | ||
861 | avmctrl_info *cinfo = (avmctrl_info *)(ctrl->driverdata); | 863 | avmctrl_info *cinfo = (avmctrl_info *)(ctrl->driverdata); |
862 | avmcard *card = cinfo->card; | 864 | avmcard *card = cinfo->card; |
863 | u8 flag; | 865 | u8 flag; |
864 | int len = 0; | ||
865 | char *s; | 866 | char *s; |
866 | u32 txoff, txlen, rxoff, rxlen, csr; | 867 | u32 txoff, txlen, rxoff, rxlen, csr; |
867 | unsigned long flags; | 868 | unsigned long flags; |
868 | 869 | ||
869 | len += sprintf(page+len, "%-16s %s\n", "name", card->name); | 870 | seq_printf(m, "%-16s %s\n", "name", card->name); |
870 | len += sprintf(page+len, "%-16s 0x%x\n", "io", card->port); | 871 | seq_printf(m, "%-16s 0x%x\n", "io", card->port); |
871 | len += sprintf(page+len, "%-16s %d\n", "irq", card->irq); | 872 | seq_printf(m, "%-16s %d\n", "irq", card->irq); |
872 | len += sprintf(page+len, "%-16s 0x%lx\n", "membase", card->membase); | 873 | seq_printf(m, "%-16s 0x%lx\n", "membase", card->membase); |
873 | switch (card->cardtype) { | 874 | switch (card->cardtype) { |
874 | case avm_b1isa: s = "B1 ISA"; break; | 875 | case avm_b1isa: s = "B1 ISA"; break; |
875 | case avm_b1pci: s = "B1 PCI"; break; | 876 | case avm_b1pci: s = "B1 PCI"; break; |
@@ -882,18 +883,18 @@ int b1dmactl_read_proc(char *page, char **start, off_t off, | |||
882 | case avm_c2: s = "C2"; break; | 883 | case avm_c2: s = "C2"; break; |
883 | default: s = "???"; break; | 884 | default: s = "???"; break; |
884 | } | 885 | } |
885 | len += sprintf(page+len, "%-16s %s\n", "type", s); | 886 | seq_printf(m, "%-16s %s\n", "type", s); |
886 | if ((s = cinfo->version[VER_DRIVER]) != NULL) | 887 | if ((s = cinfo->version[VER_DRIVER]) != NULL) |
887 | len += sprintf(page+len, "%-16s %s\n", "ver_driver", s); | 888 | seq_printf(m, "%-16s %s\n", "ver_driver", s); |
888 | if ((s = cinfo->version[VER_CARDTYPE]) != NULL) | 889 | if ((s = cinfo->version[VER_CARDTYPE]) != NULL) |
889 | len += sprintf(page+len, "%-16s %s\n", "ver_cardtype", s); | 890 | seq_printf(m, "%-16s %s\n", "ver_cardtype", s); |
890 | if ((s = cinfo->version[VER_SERIAL]) != NULL) | 891 | if ((s = cinfo->version[VER_SERIAL]) != NULL) |
891 | len += sprintf(page+len, "%-16s %s\n", "ver_serial", s); | 892 | seq_printf(m, "%-16s %s\n", "ver_serial", s); |
892 | 893 | ||
893 | if (card->cardtype != avm_m1) { | 894 | if (card->cardtype != avm_m1) { |
894 | flag = ((u8 *)(ctrl->profile.manu))[3]; | 895 | flag = ((u8 *)(ctrl->profile.manu))[3]; |
895 | if (flag) | 896 | if (flag) |
896 | len += sprintf(page+len, "%-16s%s%s%s%s%s%s%s\n", | 897 | seq_printf(m, "%-16s%s%s%s%s%s%s%s\n", |
897 | "protocol", | 898 | "protocol", |
898 | (flag & 0x01) ? " DSS1" : "", | 899 | (flag & 0x01) ? " DSS1" : "", |
899 | (flag & 0x02) ? " CT1" : "", | 900 | (flag & 0x02) ? " CT1" : "", |
@@ -907,7 +908,7 @@ int b1dmactl_read_proc(char *page, char **start, off_t off, | |||
907 | if (card->cardtype != avm_m1) { | 908 | if (card->cardtype != avm_m1) { |
908 | flag = ((u8 *)(ctrl->profile.manu))[5]; | 909 | flag = ((u8 *)(ctrl->profile.manu))[5]; |
909 | if (flag) | 910 | if (flag) |
910 | len += sprintf(page+len, "%-16s%s%s%s%s\n", | 911 | seq_printf(m, "%-16s%s%s%s%s\n", |
911 | "linetype", | 912 | "linetype", |
912 | (flag & 0x01) ? " point to point" : "", | 913 | (flag & 0x01) ? " point to point" : "", |
913 | (flag & 0x02) ? " point to multipoint" : "", | 914 | (flag & 0x02) ? " point to multipoint" : "", |
@@ -915,7 +916,7 @@ int b1dmactl_read_proc(char *page, char **start, off_t off, | |||
915 | (flag & 0x04) ? " leased line with D-channel" : "" | 916 | (flag & 0x04) ? " leased line with D-channel" : "" |
916 | ); | 917 | ); |
917 | } | 918 | } |
918 | len += sprintf(page+len, "%-16s %s\n", "cardname", cinfo->cardname); | 919 | seq_printf(m, "%-16s %s\n", "cardname", cinfo->cardname); |
919 | 920 | ||
920 | 921 | ||
921 | spin_lock_irqsave(&card->lock, flags); | 922 | spin_lock_irqsave(&card->lock, flags); |
@@ -930,27 +931,30 @@ int b1dmactl_read_proc(char *page, char **start, off_t off, | |||
930 | 931 | ||
931 | spin_unlock_irqrestore(&card->lock, flags); | 932 | spin_unlock_irqrestore(&card->lock, flags); |
932 | 933 | ||
933 | len += sprintf(page+len, "%-16s 0x%lx\n", | 934 | seq_printf(m, "%-16s 0x%lx\n", "csr (cached)", (unsigned long)card->csr); |
934 | "csr (cached)", (unsigned long)card->csr); | 935 | seq_printf(m, "%-16s 0x%lx\n", "csr", (unsigned long)csr); |
935 | len += sprintf(page+len, "%-16s 0x%lx\n", | 936 | seq_printf(m, "%-16s %lu\n", "txoff", (unsigned long)txoff); |
936 | "csr", (unsigned long)csr); | 937 | seq_printf(m, "%-16s %lu\n", "txlen", (unsigned long)txlen); |
937 | len += sprintf(page+len, "%-16s %lu\n", | 938 | seq_printf(m, "%-16s %lu\n", "rxoff", (unsigned long)rxoff); |
938 | "txoff", (unsigned long)txoff); | 939 | seq_printf(m, "%-16s %lu\n", "rxlen", (unsigned long)rxlen); |
939 | len += sprintf(page+len, "%-16s %lu\n", | 940 | |
940 | "txlen", (unsigned long)txlen); | 941 | return 0; |
941 | len += sprintf(page+len, "%-16s %lu\n", | 942 | } |
942 | "rxoff", (unsigned long)rxoff); | 943 | |
943 | len += sprintf(page+len, "%-16s %lu\n", | 944 | static int b1dmactl_proc_open(struct inode *inode, struct file *file) |
944 | "rxlen", (unsigned long)rxlen); | 945 | { |
945 | 946 | return single_open(file, b1dmactl_proc_show, PDE(inode)->data); | |
946 | if (off+count >= len) | ||
947 | *eof = 1; | ||
948 | if (len < off) | ||
949 | return 0; | ||
950 | *start = page + off; | ||
951 | return ((count < len-off) ? count : len-off); | ||
952 | } | 947 | } |
953 | 948 | ||
949 | const struct file_operations b1dmactl_proc_fops = { | ||
950 | .owner = THIS_MODULE, | ||
951 | .open = b1dmactl_proc_open, | ||
952 | .read = seq_read, | ||
953 | .llseek = seq_lseek, | ||
954 | .release = single_release, | ||
955 | }; | ||
956 | EXPORT_SYMBOL(b1dmactl_proc_fops); | ||
957 | |||
954 | /* ------------------------------------------------------------- */ | 958 | /* ------------------------------------------------------------- */ |
955 | 959 | ||
956 | EXPORT_SYMBOL(b1dma_reset); | 960 | EXPORT_SYMBOL(b1dma_reset); |
@@ -963,7 +967,6 @@ EXPORT_SYMBOL(b1dma_reset_ctr); | |||
963 | EXPORT_SYMBOL(b1dma_register_appl); | 967 | EXPORT_SYMBOL(b1dma_register_appl); |
964 | EXPORT_SYMBOL(b1dma_release_appl); | 968 | EXPORT_SYMBOL(b1dma_release_appl); |
965 | EXPORT_SYMBOL(b1dma_send_message); | 969 | EXPORT_SYMBOL(b1dma_send_message); |
966 | EXPORT_SYMBOL(b1dmactl_read_proc); | ||
967 | 970 | ||
968 | static int __init b1dma_init(void) | 971 | static int __init b1dma_init(void) |
969 | { | 972 | { |
diff --git a/drivers/isdn/hardware/avm/b1isa.c b/drivers/isdn/hardware/avm/b1isa.c index 6461a32bc838..ff5390546f92 100644 --- a/drivers/isdn/hardware/avm/b1isa.c +++ b/drivers/isdn/hardware/avm/b1isa.c | |||
@@ -121,7 +121,7 @@ static int b1isa_probe(struct pci_dev *pdev) | |||
121 | cinfo->capi_ctrl.load_firmware = b1_load_firmware; | 121 | cinfo->capi_ctrl.load_firmware = b1_load_firmware; |
122 | cinfo->capi_ctrl.reset_ctr = b1_reset_ctr; | 122 | cinfo->capi_ctrl.reset_ctr = b1_reset_ctr; |
123 | cinfo->capi_ctrl.procinfo = b1isa_procinfo; | 123 | cinfo->capi_ctrl.procinfo = b1isa_procinfo; |
124 | cinfo->capi_ctrl.ctr_read_proc = b1ctl_read_proc; | 124 | cinfo->capi_ctrl.proc_fops = &b1ctl_proc_fops; |
125 | strcpy(cinfo->capi_ctrl.name, card->name); | 125 | strcpy(cinfo->capi_ctrl.name, card->name); |
126 | 126 | ||
127 | retval = attach_capi_ctr(&cinfo->capi_ctrl); | 127 | retval = attach_capi_ctr(&cinfo->capi_ctrl); |
diff --git a/drivers/isdn/hardware/avm/b1pci.c b/drivers/isdn/hardware/avm/b1pci.c index 5b314a2c4049..c97e4315079d 100644 --- a/drivers/isdn/hardware/avm/b1pci.c +++ b/drivers/isdn/hardware/avm/b1pci.c | |||
@@ -112,7 +112,7 @@ static int b1pci_probe(struct capicardparams *p, struct pci_dev *pdev) | |||
112 | cinfo->capi_ctrl.load_firmware = b1_load_firmware; | 112 | cinfo->capi_ctrl.load_firmware = b1_load_firmware; |
113 | cinfo->capi_ctrl.reset_ctr = b1_reset_ctr; | 113 | cinfo->capi_ctrl.reset_ctr = b1_reset_ctr; |
114 | cinfo->capi_ctrl.procinfo = b1pci_procinfo; | 114 | cinfo->capi_ctrl.procinfo = b1pci_procinfo; |
115 | cinfo->capi_ctrl.ctr_read_proc = b1ctl_read_proc; | 115 | cinfo->capi_ctrl.proc_fops = &b1ctl_proc_fops; |
116 | strcpy(cinfo->capi_ctrl.name, card->name); | 116 | strcpy(cinfo->capi_ctrl.name, card->name); |
117 | cinfo->capi_ctrl.owner = THIS_MODULE; | 117 | cinfo->capi_ctrl.owner = THIS_MODULE; |
118 | 118 | ||
@@ -251,7 +251,7 @@ static int b1pciv4_probe(struct capicardparams *p, struct pci_dev *pdev) | |||
251 | cinfo->capi_ctrl.load_firmware = b1dma_load_firmware; | 251 | cinfo->capi_ctrl.load_firmware = b1dma_load_firmware; |
252 | cinfo->capi_ctrl.reset_ctr = b1dma_reset_ctr; | 252 | cinfo->capi_ctrl.reset_ctr = b1dma_reset_ctr; |
253 | cinfo->capi_ctrl.procinfo = b1pciv4_procinfo; | 253 | cinfo->capi_ctrl.procinfo = b1pciv4_procinfo; |
254 | cinfo->capi_ctrl.ctr_read_proc = b1dmactl_read_proc; | 254 | cinfo->capi_ctrl.proc_fops = &b1dmactl_proc_fops; |
255 | strcpy(cinfo->capi_ctrl.name, card->name); | 255 | strcpy(cinfo->capi_ctrl.name, card->name); |
256 | 256 | ||
257 | retval = attach_capi_ctr(&cinfo->capi_ctrl); | 257 | retval = attach_capi_ctr(&cinfo->capi_ctrl); |
diff --git a/drivers/isdn/hardware/avm/b1pcmcia.c b/drivers/isdn/hardware/avm/b1pcmcia.c index 7740403b40e1..d6391e0afeea 100644 --- a/drivers/isdn/hardware/avm/b1pcmcia.c +++ b/drivers/isdn/hardware/avm/b1pcmcia.c | |||
@@ -108,7 +108,7 @@ static int b1pcmcia_add_card(unsigned int port, unsigned irq, | |||
108 | cinfo->capi_ctrl.load_firmware = b1_load_firmware; | 108 | cinfo->capi_ctrl.load_firmware = b1_load_firmware; |
109 | cinfo->capi_ctrl.reset_ctr = b1_reset_ctr; | 109 | cinfo->capi_ctrl.reset_ctr = b1_reset_ctr; |
110 | cinfo->capi_ctrl.procinfo = b1pcmcia_procinfo; | 110 | cinfo->capi_ctrl.procinfo = b1pcmcia_procinfo; |
111 | cinfo->capi_ctrl.ctr_read_proc = b1ctl_read_proc; | 111 | cinfo->capi_ctrl.proc_fops = &b1ctl_proc_fops; |
112 | strcpy(cinfo->capi_ctrl.name, card->name); | 112 | strcpy(cinfo->capi_ctrl.name, card->name); |
113 | 113 | ||
114 | retval = attach_capi_ctr(&cinfo->capi_ctrl); | 114 | retval = attach_capi_ctr(&cinfo->capi_ctrl); |
diff --git a/drivers/isdn/hardware/avm/c4.c b/drivers/isdn/hardware/avm/c4.c index 6833301a45fc..de6e6b311819 100644 --- a/drivers/isdn/hardware/avm/c4.c +++ b/drivers/isdn/hardware/avm/c4.c | |||
@@ -11,6 +11,8 @@ | |||
11 | 11 | ||
12 | #include <linux/module.h> | 12 | #include <linux/module.h> |
13 | #include <linux/kernel.h> | 13 | #include <linux/kernel.h> |
14 | #include <linux/proc_fs.h> | ||
15 | #include <linux/seq_file.h> | ||
14 | #include <linux/skbuff.h> | 16 | #include <linux/skbuff.h> |
15 | #include <linux/delay.h> | 17 | #include <linux/delay.h> |
16 | #include <linux/mm.h> | 18 | #include <linux/mm.h> |
@@ -1062,19 +1064,18 @@ static char *c4_procinfo(struct capi_ctr *ctrl) | |||
1062 | return cinfo->infobuf; | 1064 | return cinfo->infobuf; |
1063 | } | 1065 | } |
1064 | 1066 | ||
1065 | static int c4_read_proc(char *page, char **start, off_t off, | 1067 | static int c4_proc_show(struct seq_file *m, void *v) |
1066 | int count, int *eof, struct capi_ctr *ctrl) | ||
1067 | { | 1068 | { |
1069 | struct capi_ctr *ctrl = m->private; | ||
1068 | avmctrl_info *cinfo = (avmctrl_info *)(ctrl->driverdata); | 1070 | avmctrl_info *cinfo = (avmctrl_info *)(ctrl->driverdata); |
1069 | avmcard *card = cinfo->card; | 1071 | avmcard *card = cinfo->card; |
1070 | u8 flag; | 1072 | u8 flag; |
1071 | int len = 0; | ||
1072 | char *s; | 1073 | char *s; |
1073 | 1074 | ||
1074 | len += sprintf(page+len, "%-16s %s\n", "name", card->name); | 1075 | seq_printf(m, "%-16s %s\n", "name", card->name); |
1075 | len += sprintf(page+len, "%-16s 0x%x\n", "io", card->port); | 1076 | seq_printf(m, "%-16s 0x%x\n", "io", card->port); |
1076 | len += sprintf(page+len, "%-16s %d\n", "irq", card->irq); | 1077 | seq_printf(m, "%-16s %d\n", "irq", card->irq); |
1077 | len += sprintf(page+len, "%-16s 0x%lx\n", "membase", card->membase); | 1078 | seq_printf(m, "%-16s 0x%lx\n", "membase", card->membase); |
1078 | switch (card->cardtype) { | 1079 | switch (card->cardtype) { |
1079 | case avm_b1isa: s = "B1 ISA"; break; | 1080 | case avm_b1isa: s = "B1 ISA"; break; |
1080 | case avm_b1pci: s = "B1 PCI"; break; | 1081 | case avm_b1pci: s = "B1 PCI"; break; |
@@ -1087,18 +1088,18 @@ static int c4_read_proc(char *page, char **start, off_t off, | |||
1087 | case avm_c2: s = "C2"; break; | 1088 | case avm_c2: s = "C2"; break; |
1088 | default: s = "???"; break; | 1089 | default: s = "???"; break; |
1089 | } | 1090 | } |
1090 | len += sprintf(page+len, "%-16s %s\n", "type", s); | 1091 | seq_printf(m, "%-16s %s\n", "type", s); |
1091 | if ((s = cinfo->version[VER_DRIVER]) != NULL) | 1092 | if ((s = cinfo->version[VER_DRIVER]) != NULL) |
1092 | len += sprintf(page+len, "%-16s %s\n", "ver_driver", s); | 1093 | seq_printf(m, "%-16s %s\n", "ver_driver", s); |
1093 | if ((s = cinfo->version[VER_CARDTYPE]) != NULL) | 1094 | if ((s = cinfo->version[VER_CARDTYPE]) != NULL) |
1094 | len += sprintf(page+len, "%-16s %s\n", "ver_cardtype", s); | 1095 | seq_printf(m, "%-16s %s\n", "ver_cardtype", s); |
1095 | if ((s = cinfo->version[VER_SERIAL]) != NULL) | 1096 | if ((s = cinfo->version[VER_SERIAL]) != NULL) |
1096 | len += sprintf(page+len, "%-16s %s\n", "ver_serial", s); | 1097 | seq_printf(m, "%-16s %s\n", "ver_serial", s); |
1097 | 1098 | ||
1098 | if (card->cardtype != avm_m1) { | 1099 | if (card->cardtype != avm_m1) { |
1099 | flag = ((u8 *)(ctrl->profile.manu))[3]; | 1100 | flag = ((u8 *)(ctrl->profile.manu))[3]; |
1100 | if (flag) | 1101 | if (flag) |
1101 | len += sprintf(page+len, "%-16s%s%s%s%s%s%s%s\n", | 1102 | seq_printf(m, "%-16s%s%s%s%s%s%s%s\n", |
1102 | "protocol", | 1103 | "protocol", |
1103 | (flag & 0x01) ? " DSS1" : "", | 1104 | (flag & 0x01) ? " DSS1" : "", |
1104 | (flag & 0x02) ? " CT1" : "", | 1105 | (flag & 0x02) ? " CT1" : "", |
@@ -1112,7 +1113,7 @@ static int c4_read_proc(char *page, char **start, off_t off, | |||
1112 | if (card->cardtype != avm_m1) { | 1113 | if (card->cardtype != avm_m1) { |
1113 | flag = ((u8 *)(ctrl->profile.manu))[5]; | 1114 | flag = ((u8 *)(ctrl->profile.manu))[5]; |
1114 | if (flag) | 1115 | if (flag) |
1115 | len += sprintf(page+len, "%-16s%s%s%s%s\n", | 1116 | seq_printf(m, "%-16s%s%s%s%s\n", |
1116 | "linetype", | 1117 | "linetype", |
1117 | (flag & 0x01) ? " point to point" : "", | 1118 | (flag & 0x01) ? " point to point" : "", |
1118 | (flag & 0x02) ? " point to multipoint" : "", | 1119 | (flag & 0x02) ? " point to multipoint" : "", |
@@ -1120,16 +1121,24 @@ static int c4_read_proc(char *page, char **start, off_t off, | |||
1120 | (flag & 0x04) ? " leased line with D-channel" : "" | 1121 | (flag & 0x04) ? " leased line with D-channel" : "" |
1121 | ); | 1122 | ); |
1122 | } | 1123 | } |
1123 | len += sprintf(page+len, "%-16s %s\n", "cardname", cinfo->cardname); | 1124 | seq_printf(m, "%-16s %s\n", "cardname", cinfo->cardname); |
1124 | 1125 | ||
1125 | if (off+count >= len) | 1126 | return 0; |
1126 | *eof = 1; | ||
1127 | if (len < off) | ||
1128 | return 0; | ||
1129 | *start = page + off; | ||
1130 | return ((count < len-off) ? count : len-off); | ||
1131 | } | 1127 | } |
1132 | 1128 | ||
1129 | static int c4_proc_open(struct inode *inode, struct file *file) | ||
1130 | { | ||
1131 | return single_open(file, c4_proc_show, PDE(inode)->data); | ||
1132 | } | ||
1133 | |||
1134 | static const struct file_operations c4_proc_fops = { | ||
1135 | .owner = THIS_MODULE, | ||
1136 | .open = c4_proc_open, | ||
1137 | .read = seq_read, | ||
1138 | .llseek = seq_lseek, | ||
1139 | .release = single_release, | ||
1140 | }; | ||
1141 | |||
1133 | /* ------------------------------------------------------------- */ | 1142 | /* ------------------------------------------------------------- */ |
1134 | 1143 | ||
1135 | static int c4_add_card(struct capicardparams *p, struct pci_dev *dev, | 1144 | static int c4_add_card(struct capicardparams *p, struct pci_dev *dev, |
@@ -1201,7 +1210,7 @@ static int c4_add_card(struct capicardparams *p, struct pci_dev *dev, | |||
1201 | cinfo->capi_ctrl.load_firmware = c4_load_firmware; | 1210 | cinfo->capi_ctrl.load_firmware = c4_load_firmware; |
1202 | cinfo->capi_ctrl.reset_ctr = c4_reset_ctr; | 1211 | cinfo->capi_ctrl.reset_ctr = c4_reset_ctr; |
1203 | cinfo->capi_ctrl.procinfo = c4_procinfo; | 1212 | cinfo->capi_ctrl.procinfo = c4_procinfo; |
1204 | cinfo->capi_ctrl.ctr_read_proc = c4_read_proc; | 1213 | cinfo->capi_ctrl.proc_fops = &c4_proc_fops; |
1205 | strcpy(cinfo->capi_ctrl.name, card->name); | 1214 | strcpy(cinfo->capi_ctrl.name, card->name); |
1206 | 1215 | ||
1207 | retval = attach_capi_ctr(&cinfo->capi_ctrl); | 1216 | retval = attach_capi_ctr(&cinfo->capi_ctrl); |
diff --git a/drivers/isdn/hardware/avm/t1isa.c b/drivers/isdn/hardware/avm/t1isa.c index 1c53fd49adb6..baeeb3c2a3ee 100644 --- a/drivers/isdn/hardware/avm/t1isa.c +++ b/drivers/isdn/hardware/avm/t1isa.c | |||
@@ -429,7 +429,7 @@ static int t1isa_probe(struct pci_dev *pdev, int cardnr) | |||
429 | cinfo->capi_ctrl.load_firmware = t1isa_load_firmware; | 429 | cinfo->capi_ctrl.load_firmware = t1isa_load_firmware; |
430 | cinfo->capi_ctrl.reset_ctr = t1isa_reset_ctr; | 430 | cinfo->capi_ctrl.reset_ctr = t1isa_reset_ctr; |
431 | cinfo->capi_ctrl.procinfo = t1isa_procinfo; | 431 | cinfo->capi_ctrl.procinfo = t1isa_procinfo; |
432 | cinfo->capi_ctrl.ctr_read_proc = b1ctl_read_proc; | 432 | cinfo->capi_ctrl.proc_fops = &b1ctl_proc_fops; |
433 | strcpy(cinfo->capi_ctrl.name, card->name); | 433 | strcpy(cinfo->capi_ctrl.name, card->name); |
434 | 434 | ||
435 | retval = attach_capi_ctr(&cinfo->capi_ctrl); | 435 | retval = attach_capi_ctr(&cinfo->capi_ctrl); |
diff --git a/drivers/isdn/hardware/avm/t1pci.c b/drivers/isdn/hardware/avm/t1pci.c index e6d298d75146..5a3f83098018 100644 --- a/drivers/isdn/hardware/avm/t1pci.c +++ b/drivers/isdn/hardware/avm/t1pci.c | |||
@@ -119,7 +119,7 @@ static int t1pci_add_card(struct capicardparams *p, struct pci_dev *pdev) | |||
119 | cinfo->capi_ctrl.load_firmware = b1dma_load_firmware; | 119 | cinfo->capi_ctrl.load_firmware = b1dma_load_firmware; |
120 | cinfo->capi_ctrl.reset_ctr = b1dma_reset_ctr; | 120 | cinfo->capi_ctrl.reset_ctr = b1dma_reset_ctr; |
121 | cinfo->capi_ctrl.procinfo = t1pci_procinfo; | 121 | cinfo->capi_ctrl.procinfo = t1pci_procinfo; |
122 | cinfo->capi_ctrl.ctr_read_proc = b1dmactl_read_proc; | 122 | cinfo->capi_ctrl.proc_fops = &b1dmactl_proc_fops; |
123 | strcpy(cinfo->capi_ctrl.name, card->name); | 123 | strcpy(cinfo->capi_ctrl.name, card->name); |
124 | 124 | ||
125 | retval = attach_capi_ctr(&cinfo->capi_ctrl); | 125 | retval = attach_capi_ctr(&cinfo->capi_ctrl); |
diff --git a/drivers/isdn/hardware/eicon/capimain.c b/drivers/isdn/hardware/eicon/capimain.c index 98fcdfc7ca55..0f073cd73763 100644 --- a/drivers/isdn/hardware/eicon/capimain.c +++ b/drivers/isdn/hardware/eicon/capimain.c | |||
@@ -13,6 +13,7 @@ | |||
13 | #include <linux/module.h> | 13 | #include <linux/module.h> |
14 | #include <linux/init.h> | 14 | #include <linux/init.h> |
15 | #include <asm/uaccess.h> | 15 | #include <asm/uaccess.h> |
16 | #include <linux/seq_file.h> | ||
16 | #include <linux/skbuff.h> | 17 | #include <linux/skbuff.h> |
17 | 18 | ||
18 | #include "os_capi.h" | 19 | #include "os_capi.h" |
@@ -75,25 +76,32 @@ void diva_os_free_message_buffer(diva_os_message_buffer_s * dmb) | |||
75 | /* | 76 | /* |
76 | * proc function for controller info | 77 | * proc function for controller info |
77 | */ | 78 | */ |
78 | static int diva_ctl_read_proc(char *page, char **start, off_t off, | 79 | static int diva_ctl_proc_show(struct seq_file *m, void *v) |
79 | int count, int *eof, struct capi_ctr *ctrl) | ||
80 | { | 80 | { |
81 | struct capi_ctr *ctrl = m->private; | ||
81 | diva_card *card = (diva_card *) ctrl->driverdata; | 82 | diva_card *card = (diva_card *) ctrl->driverdata; |
82 | int len = 0; | 83 | |
83 | 84 | seq_printf(m, "%s\n", ctrl->name); | |
84 | len += sprintf(page + len, "%s\n", ctrl->name); | 85 | seq_printf(m, "Serial No. : %s\n", ctrl->serial); |
85 | len += sprintf(page + len, "Serial No. : %s\n", ctrl->serial); | 86 | seq_printf(m, "Id : %d\n", card->Id); |
86 | len += sprintf(page + len, "Id : %d\n", card->Id); | 87 | seq_printf(m, "Channels : %d\n", card->d.channels); |
87 | len += sprintf(page + len, "Channels : %d\n", card->d.channels); | 88 | |
88 | 89 | return 0; | |
89 | if (off + count >= len) | 90 | } |
90 | *eof = 1; | 91 | |
91 | if (len < off) | 92 | static int diva_ctl_proc_open(struct inode *inode, struct file *file) |
92 | return 0; | 93 | { |
93 | *start = page + off; | 94 | return single_open(file, diva_ctl_proc_show, NULL); |
94 | return ((count < len - off) ? count : len - off); | ||
95 | } | 95 | } |
96 | 96 | ||
97 | static const struct file_operations diva_ctl_proc_fops = { | ||
98 | .owner = THIS_MODULE, | ||
99 | .open = diva_ctl_proc_open, | ||
100 | .read = seq_read, | ||
101 | .llseek = seq_lseek, | ||
102 | .release = single_release, | ||
103 | }; | ||
104 | |||
97 | /* | 105 | /* |
98 | * set additional os settings in capi_ctr struct | 106 | * set additional os settings in capi_ctr struct |
99 | */ | 107 | */ |
@@ -102,7 +110,7 @@ void diva_os_set_controller_struct(struct capi_ctr *ctrl) | |||
102 | ctrl->driver_name = DRIVERLNAME; | 110 | ctrl->driver_name = DRIVERLNAME; |
103 | ctrl->load_firmware = NULL; | 111 | ctrl->load_firmware = NULL; |
104 | ctrl->reset_ctr = NULL; | 112 | ctrl->reset_ctr = NULL; |
105 | ctrl->ctr_read_proc = diva_ctl_read_proc; | 113 | ctrl->proc_fops = &diva_ctl_proc_fops; |
106 | ctrl->owner = THIS_MODULE; | 114 | ctrl->owner = THIS_MODULE; |
107 | } | 115 | } |
108 | 116 | ||
diff --git a/drivers/isdn/hardware/eicon/diva_didd.c b/drivers/isdn/hardware/eicon/diva_didd.c index 993b14cf1778..5d06a7437824 100644 --- a/drivers/isdn/hardware/eicon/diva_didd.c +++ b/drivers/isdn/hardware/eicon/diva_didd.c | |||
@@ -15,6 +15,7 @@ | |||
15 | #include <linux/init.h> | 15 | #include <linux/init.h> |
16 | #include <linux/kernel.h> | 16 | #include <linux/kernel.h> |
17 | #include <linux/proc_fs.h> | 17 | #include <linux/proc_fs.h> |
18 | #include <linux/seq_file.h> | ||
18 | #include <net/net_namespace.h> | 19 | #include <net/net_namespace.h> |
19 | 20 | ||
20 | #include "platform.h" | 21 | #include "platform.h" |
@@ -62,39 +63,41 @@ static char *getrev(const char *revision) | |||
62 | return rev; | 63 | return rev; |
63 | } | 64 | } |
64 | 65 | ||
65 | static int | 66 | static int divadidd_proc_show(struct seq_file *m, void *v) |
66 | proc_read(char *page, char **start, off_t off, int count, int *eof, | ||
67 | void *data) | ||
68 | { | 67 | { |
69 | int len = 0; | ||
70 | char tmprev[32]; | 68 | char tmprev[32]; |
71 | 69 | ||
72 | strcpy(tmprev, main_revision); | 70 | strcpy(tmprev, main_revision); |
73 | len += sprintf(page + len, "%s\n", DRIVERNAME); | 71 | seq_printf(m, "%s\n", DRIVERNAME); |
74 | len += sprintf(page + len, "name : %s\n", DRIVERLNAME); | 72 | seq_printf(m, "name : %s\n", DRIVERLNAME); |
75 | len += sprintf(page + len, "release : %s\n", DRIVERRELEASE_DIDD); | 73 | seq_printf(m, "release : %s\n", DRIVERRELEASE_DIDD); |
76 | len += sprintf(page + len, "build : %s(%s)\n", | 74 | seq_printf(m, "build : %s(%s)\n", |
77 | diva_didd_common_code_build, DIVA_BUILD); | 75 | diva_didd_common_code_build, DIVA_BUILD); |
78 | len += sprintf(page + len, "revision : %s\n", getrev(tmprev)); | 76 | seq_printf(m, "revision : %s\n", getrev(tmprev)); |
79 | 77 | ||
80 | if (off + count >= len) | 78 | return 0; |
81 | *eof = 1; | ||
82 | if (len < off) | ||
83 | return 0; | ||
84 | *start = page + off; | ||
85 | return ((count < len - off) ? count : len - off); | ||
86 | } | 79 | } |
87 | 80 | ||
81 | static int divadidd_proc_open(struct inode *inode, struct file *file) | ||
82 | { | ||
83 | return single_open(file, divadidd_proc_show, NULL); | ||
84 | } | ||
85 | |||
86 | static const struct file_operations divadidd_proc_fops = { | ||
87 | .owner = THIS_MODULE, | ||
88 | .open = divadidd_proc_open, | ||
89 | .read = seq_read, | ||
90 | .llseek = seq_lseek, | ||
91 | .release = single_release, | ||
92 | }; | ||
93 | |||
88 | static int DIVA_INIT_FUNCTION create_proc(void) | 94 | static int DIVA_INIT_FUNCTION create_proc(void) |
89 | { | 95 | { |
90 | proc_net_eicon = proc_mkdir("eicon", init_net.proc_net); | 96 | proc_net_eicon = proc_mkdir("eicon", init_net.proc_net); |
91 | 97 | ||
92 | if (proc_net_eicon) { | 98 | if (proc_net_eicon) { |
93 | if ((proc_didd = | 99 | proc_didd = proc_create(DRIVERLNAME, S_IRUGO, proc_net_eicon, |
94 | create_proc_entry(DRIVERLNAME, S_IFREG | S_IRUGO, | 100 | &divadidd_proc_fops); |
95 | proc_net_eicon))) { | ||
96 | proc_didd->read_proc = proc_read; | ||
97 | } | ||
98 | return (1); | 101 | return (1); |
99 | } | 102 | } |
100 | return (0); | 103 | return (0); |
diff --git a/drivers/isdn/hardware/eicon/divasi.c b/drivers/isdn/hardware/eicon/divasi.c index 69e71ebe7841..f577719ab3fa 100644 --- a/drivers/isdn/hardware/eicon/divasi.c +++ b/drivers/isdn/hardware/eicon/divasi.c | |||
@@ -17,6 +17,7 @@ | |||
17 | #include <linux/poll.h> | 17 | #include <linux/poll.h> |
18 | #include <linux/proc_fs.h> | 18 | #include <linux/proc_fs.h> |
19 | #include <linux/skbuff.h> | 19 | #include <linux/skbuff.h> |
20 | #include <linux/seq_file.h> | ||
20 | #include <linux/smp_lock.h> | 21 | #include <linux/smp_lock.h> |
21 | #include <asm/uaccess.h> | 22 | #include <asm/uaccess.h> |
22 | 23 | ||
@@ -86,39 +87,40 @@ static void diva_um_timer_function(unsigned long data); | |||
86 | extern struct proc_dir_entry *proc_net_eicon; | 87 | extern struct proc_dir_entry *proc_net_eicon; |
87 | static struct proc_dir_entry *um_idi_proc_entry = NULL; | 88 | static struct proc_dir_entry *um_idi_proc_entry = NULL; |
88 | 89 | ||
89 | static int | 90 | static int um_idi_proc_show(struct seq_file *m, void *v) |
90 | um_idi_proc_read(char *page, char **start, off_t off, int count, int *eof, | ||
91 | void *data) | ||
92 | { | 91 | { |
93 | int len = 0; | ||
94 | char tmprev[32]; | 92 | char tmprev[32]; |
95 | 93 | ||
96 | len += sprintf(page + len, "%s\n", DRIVERNAME); | 94 | seq_printf(m, "%s\n", DRIVERNAME); |
97 | len += sprintf(page + len, "name : %s\n", DRIVERLNAME); | 95 | seq_printf(m, "name : %s\n", DRIVERLNAME); |
98 | len += sprintf(page + len, "release : %s\n", DRIVERRELEASE_IDI); | 96 | seq_printf(m, "release : %s\n", DRIVERRELEASE_IDI); |
99 | strcpy(tmprev, main_revision); | 97 | strcpy(tmprev, main_revision); |
100 | len += sprintf(page + len, "revision : %s\n", getrev(tmprev)); | 98 | seq_printf(m, "revision : %s\n", getrev(tmprev)); |
101 | len += sprintf(page + len, "build : %s\n", DIVA_BUILD); | 99 | seq_printf(m, "build : %s\n", DIVA_BUILD); |
102 | len += sprintf(page + len, "major : %d\n", major); | 100 | seq_printf(m, "major : %d\n", major); |
103 | 101 | ||
104 | if (off + count >= len) | 102 | return 0; |
105 | *eof = 1; | 103 | } |
106 | if (len < off) | 104 | |
107 | return 0; | 105 | static int um_idi_proc_open(struct inode *inode, struct file *file) |
108 | *start = page + off; | 106 | { |
109 | return ((count < len - off) ? count : len - off); | 107 | return single_open(file, um_idi_proc_show, NULL); |
110 | } | 108 | } |
111 | 109 | ||
110 | static const struct file_operations um_idi_proc_fops = { | ||
111 | .owner = THIS_MODULE, | ||
112 | .open = um_idi_proc_open, | ||
113 | .read = seq_read, | ||
114 | .llseek = seq_lseek, | ||
115 | .release = single_release, | ||
116 | }; | ||
117 | |||
112 | static int DIVA_INIT_FUNCTION create_um_idi_proc(void) | 118 | static int DIVA_INIT_FUNCTION create_um_idi_proc(void) |
113 | { | 119 | { |
114 | um_idi_proc_entry = create_proc_entry(DRIVERLNAME, | 120 | um_idi_proc_entry = proc_create(DRIVERLNAME, S_IRUGO, proc_net_eicon, |
115 | S_IFREG | S_IRUGO | S_IWUSR, | 121 | &um_idi_proc_fops); |
116 | proc_net_eicon); | ||
117 | if (!um_idi_proc_entry) | 122 | if (!um_idi_proc_entry) |
118 | return (0); | 123 | return (0); |
119 | |||
120 | um_idi_proc_entry->read_proc = um_idi_proc_read; | ||
121 | |||
122 | return (1); | 124 | return (1); |
123 | } | 125 | } |
124 | 126 | ||
diff --git a/drivers/isdn/hardware/eicon/divasproc.c b/drivers/isdn/hardware/eicon/divasproc.c index 040827288ec9..46d44a942624 100644 --- a/drivers/isdn/hardware/eicon/divasproc.c +++ b/drivers/isdn/hardware/eicon/divasproc.c | |||
@@ -14,6 +14,7 @@ | |||
14 | #include <linux/kernel.h> | 14 | #include <linux/kernel.h> |
15 | #include <linux/poll.h> | 15 | #include <linux/poll.h> |
16 | #include <linux/proc_fs.h> | 16 | #include <linux/proc_fs.h> |
17 | #include <linux/seq_file.h> | ||
17 | #include <linux/list.h> | 18 | #include <linux/list.h> |
18 | #include <asm/uaccess.h> | 19 | #include <asm/uaccess.h> |
19 | 20 | ||
@@ -141,14 +142,10 @@ void remove_divas_proc(void) | |||
141 | } | 142 | } |
142 | } | 143 | } |
143 | 144 | ||
144 | /* | 145 | static ssize_t grp_opt_proc_write(struct file *file, const char __user *buffer, |
145 | ** write group_optimization | 146 | size_t count, loff_t *pos) |
146 | */ | ||
147 | static int | ||
148 | write_grp_opt(struct file *file, const char __user *buffer, unsigned long count, | ||
149 | void *data) | ||
150 | { | 147 | { |
151 | diva_os_xdi_adapter_t *a = (diva_os_xdi_adapter_t *) data; | 148 | diva_os_xdi_adapter_t *a = PDE(file->f_path.dentry->d_inode)->data; |
152 | PISDN_ADAPTER IoAdapter = IoAdapters[a->controller - 1]; | 149 | PISDN_ADAPTER IoAdapter = IoAdapters[a->controller - 1]; |
153 | 150 | ||
154 | if ((count == 1) || (count == 2)) { | 151 | if ((count == 1) || (count == 2)) { |
@@ -172,14 +169,10 @@ write_grp_opt(struct file *file, const char __user *buffer, unsigned long count, | |||
172 | return (-EINVAL); | 169 | return (-EINVAL); |
173 | } | 170 | } |
174 | 171 | ||
175 | /* | 172 | static ssize_t d_l1_down_proc_write(struct file *file, const char __user *buffer, |
176 | ** write dynamic_l1_down | 173 | size_t count, loff_t *pos) |
177 | */ | ||
178 | static int | ||
179 | write_d_l1_down(struct file *file, const char __user *buffer, unsigned long count, | ||
180 | void *data) | ||
181 | { | 174 | { |
182 | diva_os_xdi_adapter_t *a = (diva_os_xdi_adapter_t *) data; | 175 | diva_os_xdi_adapter_t *a = PDE(file->f_path.dentry->d_inode)->data; |
183 | PISDN_ADAPTER IoAdapter = IoAdapters[a->controller - 1]; | 176 | PISDN_ADAPTER IoAdapter = IoAdapters[a->controller - 1]; |
184 | 177 | ||
185 | if ((count == 1) || (count == 2)) { | 178 | if ((count == 1) || (count == 2)) { |
@@ -203,63 +196,62 @@ write_d_l1_down(struct file *file, const char __user *buffer, unsigned long coun | |||
203 | return (-EINVAL); | 196 | return (-EINVAL); |
204 | } | 197 | } |
205 | 198 | ||
206 | 199 | static int d_l1_down_proc_show(struct seq_file *m, void *v) | |
207 | /* | ||
208 | ** read dynamic_l1_down | ||
209 | */ | ||
210 | static int | ||
211 | read_d_l1_down(char *page, char **start, off_t off, int count, int *eof, | ||
212 | void *data) | ||
213 | { | 200 | { |
214 | int len = 0; | 201 | diva_os_xdi_adapter_t *a = m->private; |
215 | diva_os_xdi_adapter_t *a = (diva_os_xdi_adapter_t *) data; | ||
216 | PISDN_ADAPTER IoAdapter = IoAdapters[a->controller - 1]; | 202 | PISDN_ADAPTER IoAdapter = IoAdapters[a->controller - 1]; |
217 | 203 | ||
218 | len += sprintf(page + len, "%s\n", | 204 | seq_printf(m, "%s\n", |
219 | (IoAdapter->capi_cfg. | 205 | (IoAdapter->capi_cfg. |
220 | cfg_1 & DIVA_XDI_CAPI_CFG_1_DYNAMIC_L1_ON) ? "1" : | 206 | cfg_1 & DIVA_XDI_CAPI_CFG_1_DYNAMIC_L1_ON) ? "1" : |
221 | "0"); | 207 | "0"); |
208 | return 0; | ||
209 | } | ||
222 | 210 | ||
223 | if (off + count >= len) | 211 | static int d_l1_down_proc_open(struct inode *inode, struct file *file) |
224 | *eof = 1; | 212 | { |
225 | if (len < off) | 213 | return single_open(file, d_l1_down_proc_show, PDE(inode)->data); |
226 | return 0; | ||
227 | *start = page + off; | ||
228 | return ((count < len - off) ? count : len - off); | ||
229 | } | 214 | } |
230 | 215 | ||
231 | /* | 216 | static const struct file_operations d_l1_down_proc_fops = { |
232 | ** read group_optimization | 217 | .owner = THIS_MODULE, |
233 | */ | 218 | .open = d_l1_down_proc_open, |
234 | static int | 219 | .read = seq_read, |
235 | read_grp_opt(char *page, char **start, off_t off, int count, int *eof, | 220 | .llseek = seq_lseek, |
236 | void *data) | 221 | .release = single_release, |
222 | .write = d_l1_down_proc_write, | ||
223 | }; | ||
224 | |||
225 | static int grp_opt_proc_show(struct seq_file *m, void *v) | ||
237 | { | 226 | { |
238 | int len = 0; | 227 | diva_os_xdi_adapter_t *a = m->private; |
239 | diva_os_xdi_adapter_t *a = (diva_os_xdi_adapter_t *) data; | ||
240 | PISDN_ADAPTER IoAdapter = IoAdapters[a->controller - 1]; | 228 | PISDN_ADAPTER IoAdapter = IoAdapters[a->controller - 1]; |
241 | 229 | ||
242 | len += sprintf(page + len, "%s\n", | 230 | seq_printf(m, "%s\n", |
243 | (IoAdapter->capi_cfg. | 231 | (IoAdapter->capi_cfg. |
244 | cfg_1 & DIVA_XDI_CAPI_CFG_1_GROUP_POPTIMIZATION_ON) | 232 | cfg_1 & DIVA_XDI_CAPI_CFG_1_GROUP_POPTIMIZATION_ON) |
245 | ? "1" : "0"); | 233 | ? "1" : "0"); |
234 | return 0; | ||
235 | } | ||
246 | 236 | ||
247 | if (off + count >= len) | 237 | static int grp_opt_proc_open(struct inode *inode, struct file *file) |
248 | *eof = 1; | 238 | { |
249 | if (len < off) | 239 | return single_open(file, grp_opt_proc_show, PDE(inode)->data); |
250 | return 0; | ||
251 | *start = page + off; | ||
252 | return ((count < len - off) ? count : len - off); | ||
253 | } | 240 | } |
254 | 241 | ||
255 | /* | 242 | static const struct file_operations grp_opt_proc_fops = { |
256 | ** info write | 243 | .owner = THIS_MODULE, |
257 | */ | 244 | .open = grp_opt_proc_open, |
258 | static int | 245 | .read = seq_read, |
259 | info_write(struct file *file, const char __user *buffer, unsigned long count, | 246 | .llseek = seq_lseek, |
260 | void *data) | 247 | .release = single_release, |
248 | .write = grp_opt_proc_write, | ||
249 | }; | ||
250 | |||
251 | static ssize_t info_proc_write(struct file *file, const char __user *buffer, | ||
252 | size_t count, loff_t *pos) | ||
261 | { | 253 | { |
262 | diva_os_xdi_adapter_t *a = (diva_os_xdi_adapter_t *) data; | 254 | diva_os_xdi_adapter_t *a = PDE(file->f_path.dentry->d_inode)->data; |
263 | PISDN_ADAPTER IoAdapter = IoAdapters[a->controller - 1]; | 255 | PISDN_ADAPTER IoAdapter = IoAdapters[a->controller - 1]; |
264 | char c[4]; | 256 | char c[4]; |
265 | 257 | ||
@@ -277,63 +269,46 @@ info_write(struct file *file, const char __user *buffer, unsigned long count, | |||
277 | return (-EINVAL); | 269 | return (-EINVAL); |
278 | } | 270 | } |
279 | 271 | ||
280 | /* | 272 | static int info_proc_show(struct seq_file *m, void *v) |
281 | ** info read | ||
282 | */ | ||
283 | static int | ||
284 | info_read(char *page, char **start, off_t off, int count, int *eof, | ||
285 | void *data) | ||
286 | { | 273 | { |
287 | int i = 0; | 274 | int i = 0; |
288 | int len = 0; | ||
289 | char *p; | 275 | char *p; |
290 | char tmpser[16]; | 276 | char tmpser[16]; |
291 | diva_os_xdi_adapter_t *a = (diva_os_xdi_adapter_t *) data; | 277 | diva_os_xdi_adapter_t *a = m->private; |
292 | PISDN_ADAPTER IoAdapter = IoAdapters[a->controller - 1]; | 278 | PISDN_ADAPTER IoAdapter = IoAdapters[a->controller - 1]; |
293 | 279 | ||
294 | len += | 280 | seq_printf(m, "Name : %s\n", IoAdapter->Properties.Name); |
295 | sprintf(page + len, "Name : %s\n", | 281 | seq_printf(m, "DSP state : %08x\n", a->dsp_mask); |
296 | IoAdapter->Properties.Name); | 282 | seq_printf(m, "Channels : %02d\n", IoAdapter->Properties.Channels); |
297 | len += sprintf(page + len, "DSP state : %08x\n", a->dsp_mask); | 283 | seq_printf(m, "E. max/used : %03d/%03d\n", |
298 | len += sprintf(page + len, "Channels : %02d\n", | ||
299 | IoAdapter->Properties.Channels); | ||
300 | len += sprintf(page + len, "E. max/used : %03d/%03d\n", | ||
301 | IoAdapter->e_max, IoAdapter->e_count); | 284 | IoAdapter->e_max, IoAdapter->e_count); |
302 | diva_get_vserial_number(IoAdapter, tmpser); | 285 | diva_get_vserial_number(IoAdapter, tmpser); |
303 | len += sprintf(page + len, "Serial : %s\n", tmpser); | 286 | seq_printf(m, "Serial : %s\n", tmpser); |
304 | len += | 287 | seq_printf(m, "IRQ : %d\n", IoAdapter->irq_info.irq_nr); |
305 | sprintf(page + len, "IRQ : %d\n", | 288 | seq_printf(m, "CardIndex : %d\n", a->CardIndex); |
306 | IoAdapter->irq_info.irq_nr); | 289 | seq_printf(m, "CardOrdinal : %d\n", a->CardOrdinal); |
307 | len += sprintf(page + len, "CardIndex : %d\n", a->CardIndex); | 290 | seq_printf(m, "Controller : %d\n", a->controller); |
308 | len += sprintf(page + len, "CardOrdinal : %d\n", a->CardOrdinal); | 291 | seq_printf(m, "Bus-Type : %s\n", |
309 | len += sprintf(page + len, "Controller : %d\n", a->controller); | ||
310 | len += sprintf(page + len, "Bus-Type : %s\n", | ||
311 | (a->Bus == | 292 | (a->Bus == |
312 | DIVAS_XDI_ADAPTER_BUS_ISA) ? "ISA" : "PCI"); | 293 | DIVAS_XDI_ADAPTER_BUS_ISA) ? "ISA" : "PCI"); |
313 | len += sprintf(page + len, "Port-Name : %s\n", a->port_name); | 294 | seq_printf(m, "Port-Name : %s\n", a->port_name); |
314 | if (a->Bus == DIVAS_XDI_ADAPTER_BUS_PCI) { | 295 | if (a->Bus == DIVAS_XDI_ADAPTER_BUS_PCI) { |
315 | len += | 296 | seq_printf(m, "PCI-bus : %d\n", a->resources.pci.bus); |
316 | sprintf(page + len, "PCI-bus : %d\n", | 297 | seq_printf(m, "PCI-func : %d\n", a->resources.pci.func); |
317 | a->resources.pci.bus); | ||
318 | len += | ||
319 | sprintf(page + len, "PCI-func : %d\n", | ||
320 | a->resources.pci.func); | ||
321 | for (i = 0; i < 8; i++) { | 298 | for (i = 0; i < 8; i++) { |
322 | if (a->resources.pci.bar[i]) { | 299 | if (a->resources.pci.bar[i]) { |
323 | len += | 300 | seq_printf(m, |
324 | sprintf(page + len, | ||
325 | "Mem / I/O %d : 0x%x / mapped : 0x%lx", | 301 | "Mem / I/O %d : 0x%x / mapped : 0x%lx", |
326 | i, a->resources.pci.bar[i], | 302 | i, a->resources.pci.bar[i], |
327 | (unsigned long) a->resources. | 303 | (unsigned long) a->resources. |
328 | pci.addr[i]); | 304 | pci.addr[i]); |
329 | if (a->resources.pci.length[i]) { | 305 | if (a->resources.pci.length[i]) { |
330 | len += | 306 | seq_printf(m, |
331 | sprintf(page + len, | ||
332 | " / length : %d", | 307 | " / length : %d", |
333 | a->resources.pci. | 308 | a->resources.pci. |
334 | length[i]); | 309 | length[i]); |
335 | } | 310 | } |
336 | len += sprintf(page + len, "\n"); | 311 | seq_putc(m, '\n'); |
337 | } | 312 | } |
338 | } | 313 | } |
339 | } | 314 | } |
@@ -353,16 +328,25 @@ info_read(char *page, char **start, off_t off, int count, int *eof, | |||
353 | } else { | 328 | } else { |
354 | p = "ready"; | 329 | p = "ready"; |
355 | } | 330 | } |
356 | len += sprintf(page + len, "State : %s\n", p); | 331 | seq_printf(m, "State : %s\n", p); |
357 | 332 | ||
358 | if (off + count >= len) | 333 | return 0; |
359 | *eof = 1; | 334 | } |
360 | if (len < off) | 335 | |
361 | return 0; | 336 | static int info_proc_open(struct inode *inode, struct file *file) |
362 | *start = page + off; | 337 | { |
363 | return ((count < len - off) ? count : len - off); | 338 | return single_open(file, info_proc_show, PDE(inode)->data); |
364 | } | 339 | } |
365 | 340 | ||
341 | static const struct file_operations info_proc_fops = { | ||
342 | .owner = THIS_MODULE, | ||
343 | .open = info_proc_open, | ||
344 | .read = seq_read, | ||
345 | .llseek = seq_lseek, | ||
346 | .release = single_release, | ||
347 | .write = info_proc_write, | ||
348 | }; | ||
349 | |||
366 | /* | 350 | /* |
367 | ** adapter proc init/de-init | 351 | ** adapter proc init/de-init |
368 | */ | 352 | */ |
@@ -380,28 +364,20 @@ int create_adapter_proc(diva_os_xdi_adapter_t * a) | |||
380 | return (0); | 364 | return (0); |
381 | a->proc_adapter_dir = (void *) de; | 365 | a->proc_adapter_dir = (void *) de; |
382 | 366 | ||
383 | if (!(pe = | 367 | pe = proc_create_data(info_proc_name, S_IRUGO | S_IWUSR, de, |
384 | create_proc_entry(info_proc_name, S_IFREG | S_IRUGO | S_IWUSR, de))) | 368 | &info_proc_fops, a); |
369 | if (!pe) | ||
385 | return (0); | 370 | return (0); |
386 | a->proc_info = (void *) pe; | 371 | a->proc_info = (void *) pe; |
387 | pe->write_proc = info_write; | ||
388 | pe->read_proc = info_read; | ||
389 | pe->data = a; | ||
390 | 372 | ||
391 | if ((pe = create_proc_entry(grp_opt_proc_name, | 373 | pe = proc_create_data(grp_opt_proc_name, S_IRUGO | S_IWUSR, de, |
392 | S_IFREG | S_IRUGO | S_IWUSR, de))) { | 374 | &grp_opt_proc_fops, a); |
375 | if (pe) | ||
393 | a->proc_grp_opt = (void *) pe; | 376 | a->proc_grp_opt = (void *) pe; |
394 | pe->write_proc = write_grp_opt; | 377 | pe = proc_create_data(d_l1_down_proc_name, S_IRUGO | S_IWUSR, de, |
395 | pe->read_proc = read_grp_opt; | 378 | &d_l1_down_proc_fops, a); |
396 | pe->data = a; | 379 | if (pe) |
397 | } | ||
398 | if ((pe = create_proc_entry(d_l1_down_proc_name, | ||
399 | S_IFREG | S_IRUGO | S_IWUSR, de))) { | ||
400 | a->proc_d_l1_down = (void *) pe; | 380 | a->proc_d_l1_down = (void *) pe; |
401 | pe->write_proc = write_d_l1_down; | ||
402 | pe->read_proc = read_d_l1_down; | ||
403 | pe->data = a; | ||
404 | } | ||
405 | 381 | ||
406 | DBG_TRC(("proc entry %s created", tmp)); | 382 | DBG_TRC(("proc entry %s created", tmp)); |
407 | 383 | ||
diff --git a/drivers/isdn/hysdn/hycapi.c b/drivers/isdn/hysdn/hycapi.c index 4ffaa14b9fc4..fe874afa4f81 100644 --- a/drivers/isdn/hysdn/hycapi.c +++ b/drivers/isdn/hysdn/hycapi.c | |||
@@ -11,6 +11,8 @@ | |||
11 | */ | 11 | */ |
12 | 12 | ||
13 | #include <linux/module.h> | 13 | #include <linux/module.h> |
14 | #include <linux/proc_fs.h> | ||
15 | #include <linux/seq_file.h> | ||
14 | #include <linux/signal.h> | 16 | #include <linux/signal.h> |
15 | #include <linux/kernel.h> | 17 | #include <linux/kernel.h> |
16 | #include <linux/skbuff.h> | 18 | #include <linux/skbuff.h> |
@@ -432,26 +434,16 @@ static u16 hycapi_send_message(struct capi_ctr *ctrl, struct sk_buff *skb) | |||
432 | return retval; | 434 | return retval; |
433 | } | 435 | } |
434 | 436 | ||
435 | /********************************************************************* | 437 | static int hycapi_proc_show(struct seq_file *m, void *v) |
436 | hycapi_read_proc | ||
437 | |||
438 | Informations provided in the /proc/capi-entries. | ||
439 | |||
440 | *********************************************************************/ | ||
441 | |||
442 | static int hycapi_read_proc(char *page, char **start, off_t off, | ||
443 | int count, int *eof, struct capi_ctr *ctrl) | ||
444 | { | 438 | { |
439 | struct capi_ctr *ctrl = m->private; | ||
445 | hycapictrl_info *cinfo = (hycapictrl_info *)(ctrl->driverdata); | 440 | hycapictrl_info *cinfo = (hycapictrl_info *)(ctrl->driverdata); |
446 | hysdn_card *card = cinfo->card; | 441 | hysdn_card *card = cinfo->card; |
447 | int len = 0; | ||
448 | char *s; | 442 | char *s; |
449 | #ifdef HYCAPI_PRINTFNAMES | 443 | |
450 | printk(KERN_NOTICE "hycapi_read_proc\n"); | 444 | seq_printf(m, "%-16s %s\n", "name", cinfo->cardname); |
451 | #endif | 445 | seq_printf(m, "%-16s 0x%x\n", "io", card->iobase); |
452 | len += sprintf(page+len, "%-16s %s\n", "name", cinfo->cardname); | 446 | seq_printf(m, "%-16s %d\n", "irq", card->irq); |
453 | len += sprintf(page+len, "%-16s 0x%x\n", "io", card->iobase); | ||
454 | len += sprintf(page+len, "%-16s %d\n", "irq", card->irq); | ||
455 | 447 | ||
456 | switch (card->brdtype) { | 448 | switch (card->brdtype) { |
457 | case BD_PCCARD: s = "HYSDN Hycard"; break; | 449 | case BD_PCCARD: s = "HYSDN Hycard"; break; |
@@ -461,24 +453,32 @@ static int hycapi_read_proc(char *page, char **start, off_t off, | |||
461 | case BD_PLEXUS: s = "HYSDN Plexus30"; break; | 453 | case BD_PLEXUS: s = "HYSDN Plexus30"; break; |
462 | default: s = "???"; break; | 454 | default: s = "???"; break; |
463 | } | 455 | } |
464 | len += sprintf(page+len, "%-16s %s\n", "type", s); | 456 | seq_printf(m, "%-16s %s\n", "type", s); |
465 | if ((s = cinfo->version[VER_DRIVER]) != NULL) | 457 | if ((s = cinfo->version[VER_DRIVER]) != NULL) |
466 | len += sprintf(page+len, "%-16s %s\n", "ver_driver", s); | 458 | seq_printf(m, "%-16s %s\n", "ver_driver", s); |
467 | if ((s = cinfo->version[VER_CARDTYPE]) != NULL) | 459 | if ((s = cinfo->version[VER_CARDTYPE]) != NULL) |
468 | len += sprintf(page+len, "%-16s %s\n", "ver_cardtype", s); | 460 | seq_printf(m, "%-16s %s\n", "ver_cardtype", s); |
469 | if ((s = cinfo->version[VER_SERIAL]) != NULL) | 461 | if ((s = cinfo->version[VER_SERIAL]) != NULL) |
470 | len += sprintf(page+len, "%-16s %s\n", "ver_serial", s); | 462 | seq_printf(m, "%-16s %s\n", "ver_serial", s); |
471 | 463 | ||
472 | len += sprintf(page+len, "%-16s %s\n", "cardname", cinfo->cardname); | 464 | seq_printf(m, "%-16s %s\n", "cardname", cinfo->cardname); |
473 | 465 | ||
474 | if (off+count >= len) | 466 | return 0; |
475 | *eof = 1; | 467 | } |
476 | if (len < off) | 468 | |
477 | return 0; | 469 | static int hycapi_proc_open(struct inode *inode, struct file *file) |
478 | *start = page + off; | 470 | { |
479 | return ((count < len-off) ? count : len-off); | 471 | return single_open(file, hycapi_proc_show, PDE(inode)->data); |
480 | } | 472 | } |
481 | 473 | ||
474 | static const struct file_operations hycapi_proc_fops = { | ||
475 | .owner = THIS_MODULE, | ||
476 | .open = hycapi_proc_open, | ||
477 | .read = seq_read, | ||
478 | .llseek = seq_lseek, | ||
479 | .release = single_release, | ||
480 | }; | ||
481 | |||
482 | /************************************************************** | 482 | /************************************************************** |
483 | hycapi_load_firmware | 483 | hycapi_load_firmware |
484 | 484 | ||
@@ -774,7 +774,7 @@ hycapi_capi_create(hysdn_card *card) | |||
774 | ctrl->load_firmware = hycapi_load_firmware; | 774 | ctrl->load_firmware = hycapi_load_firmware; |
775 | ctrl->reset_ctr = hycapi_reset_ctr; | 775 | ctrl->reset_ctr = hycapi_reset_ctr; |
776 | ctrl->procinfo = hycapi_procinfo; | 776 | ctrl->procinfo = hycapi_procinfo; |
777 | ctrl->ctr_read_proc = hycapi_read_proc; | 777 | ctrl->proc_fops = &hycapi_proc_fops; |
778 | strcpy(ctrl->name, cinfo->cardname); | 778 | strcpy(ctrl->name, cinfo->cardname); |
779 | ctrl->owner = THIS_MODULE; | 779 | ctrl->owner = THIS_MODULE; |
780 | 780 | ||