123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507 |
- /*
- *
- * linux/drivers/s390/net/qeth_fs.c ($Revision: 1.13 $)
- *
- * Linux on zSeries OSA Express and HiperSockets support
- * This file contains code related to procfs.
- *
- * Copyright 2000,2003 IBM Corporation
- *
- * Author(s): Thomas Spatzier <tspat@de.ibm.com>
- *
- */
- #include <linux/module.h>
- #include <linux/init.h>
- #include <linux/proc_fs.h>
- #include <linux/seq_file.h>
- #include <linux/list.h>
- #include <linux/rwsem.h>
- #include "qeth.h"
- #include "qeth_mpc.h"
- #include "qeth_fs.h"
- const char *VERSION_QETH_PROC_C = "$Revision: 1.13 $";
- /***** /proc/qeth *****/
- #define QETH_PROCFILE_NAME "qeth"
- static struct proc_dir_entry *qeth_procfile;
- static int
- qeth_procfile_seq_match(struct device *dev, void *data)
- {
- return 1;
- }
- static void *
- qeth_procfile_seq_start(struct seq_file *s, loff_t *offset)
- {
- struct device *dev;
- loff_t nr;
- down_read(&qeth_ccwgroup_driver.driver.bus->subsys.rwsem);
- nr = *offset;
- if (nr == 0)
- return SEQ_START_TOKEN;
- dev = driver_find_device(&qeth_ccwgroup_driver.driver, NULL,
- NULL, qeth_procfile_seq_match);
- /* get card at pos *offset */
- nr = *offset;
- while (nr-- > 1 && dev)
- dev = driver_find_device(&qeth_ccwgroup_driver.driver, dev,
- NULL, qeth_procfile_seq_match);
- return (void *) dev;
- }
- static void
- qeth_procfile_seq_stop(struct seq_file *s, void* it)
- {
- up_read(&qeth_ccwgroup_driver.driver.bus->subsys.rwsem);
- }
- static void *
- qeth_procfile_seq_next(struct seq_file *s, void *it, loff_t *offset)
- {
- struct device *prev, *next;
- if (it == SEQ_START_TOKEN) {
- next = driver_find_device(&qeth_ccwgroup_driver.driver,
- NULL, NULL, qeth_procfile_seq_match);
- if (next)
- (*offset)++;
- return (void *) next;
- }
- prev = (struct device *) it;
- next = driver_find_device(&qeth_ccwgroup_driver.driver,
- prev, NULL, qeth_procfile_seq_match);
- if (next)
- (*offset)++;
- return (void *) next;
- }
- static inline const char *
- qeth_get_router_str(struct qeth_card *card, int ipv)
- {
- int routing_type = 0;
- if (ipv == 4){
- routing_type = card->options.route4.type;
- } else {
- #ifdef CONFIG_QETH_IPV6
- routing_type = card->options.route6.type;
- #else
- return "n/a";
- #endif /* CONFIG_QETH_IPV6 */
- }
- if (routing_type == PRIMARY_ROUTER)
- return "pri";
- else if (routing_type == SECONDARY_ROUTER)
- return "sec";
- else if (routing_type == MULTICAST_ROUTER) {
- if (card->info.broadcast_capable == QETH_BROADCAST_WITHOUT_ECHO)
- return "mc+";
- return "mc";
- } else if (routing_type == PRIMARY_CONNECTOR) {
- if (card->info.broadcast_capable == QETH_BROADCAST_WITHOUT_ECHO)
- return "p+c";
- return "p.c";
- } else if (routing_type == SECONDARY_CONNECTOR) {
- if (card->info.broadcast_capable == QETH_BROADCAST_WITHOUT_ECHO)
- return "s+c";
- return "s.c";
- } else if (routing_type == NO_ROUTER)
- return "no";
- else
- return "unk";
- }
- static int
- qeth_procfile_seq_show(struct seq_file *s, void *it)
- {
- struct device *device;
- struct qeth_card *card;
- char tmp[12]; /* for qeth_get_prioq_str */
- if (it == SEQ_START_TOKEN){
- seq_printf(s, "devices CHPID interface "
- "cardtype port chksum prio-q'ing rtr4 "
- "rtr6 fsz cnt\n");
- seq_printf(s, "-------------------------- ----- ---------- "
- "-------------- ---- ------ ---------- ---- "
- "---- ----- -----\n");
- } else {
- device = (struct device *) it;
- card = device->driver_data;
- seq_printf(s, "%s/%s/%s x%02X %-10s %-14s %-4i ",
- CARD_RDEV_ID(card),
- CARD_WDEV_ID(card),
- CARD_DDEV_ID(card),
- card->info.chpid,
- QETH_CARD_IFNAME(card),
- qeth_get_cardname_short(card),
- card->info.portno);
- if (card->lan_online)
- seq_printf(s, "%-6s %-10s %-4s %-4s %-5s %-5i\n",
- qeth_get_checksum_str(card),
- qeth_get_prioq_str(card, tmp),
- qeth_get_router_str(card, 4),
- qeth_get_router_str(card, 6),
- qeth_get_bufsize_str(card),
- card->qdio.in_buf_pool.buf_count);
- else
- seq_printf(s, " +++ LAN OFFLINE +++\n");
- }
- return 0;
- }
- static struct seq_operations qeth_procfile_seq_ops = {
- .start = qeth_procfile_seq_start,
- .stop = qeth_procfile_seq_stop,
- .next = qeth_procfile_seq_next,
- .show = qeth_procfile_seq_show,
- };
- static int
- qeth_procfile_open(struct inode *inode, struct file *file)
- {
- return seq_open(file, &qeth_procfile_seq_ops);
- }
- static struct file_operations qeth_procfile_fops = {
- .owner = THIS_MODULE,
- .open = qeth_procfile_open,
- .read = seq_read,
- .llseek = seq_lseek,
- .release = seq_release,
- };
- /***** /proc/qeth_perf *****/
- #define QETH_PERF_PROCFILE_NAME "qeth_perf"
- static struct proc_dir_entry *qeth_perf_procfile;
- #ifdef CONFIG_QETH_PERF_STATS
- static void *
- qeth_perf_procfile_seq_start(struct seq_file *s, loff_t *offset)
- {
- struct device *dev = NULL;
- int nr;
- down_read(&qeth_ccwgroup_driver.driver.bus->subsys.rwsem);
- /* get card at pos *offset */
- dev = driver_find_device(&qeth_ccwgroup_driver.driver, NULL, NULL,
- qeth_procfile_seq_match);
- /* get card at pos *offset */
- nr = *offset;
- while (nr-- > 1 && dev)
- dev = driver_find_device(&qeth_ccwgroup_driver.driver, dev,
- NULL, qeth_procfile_seq_match);
- return (void *) dev;
- }
- static void
- qeth_perf_procfile_seq_stop(struct seq_file *s, void* it)
- {
- up_read(&qeth_ccwgroup_driver.driver.bus->subsys.rwsem);
- }
- static void *
- qeth_perf_procfile_seq_next(struct seq_file *s, void *it, loff_t *offset)
- {
- struct device *prev, *next;
- prev = (struct device *) it;
- next = driver_find_device(&qeth_ccwgroup_driver.driver, prev,
- NULL, qeth_procfile_seq_match);
- if (next)
- (*offset)++;
- return (void *) next;
- }
- static int
- qeth_perf_procfile_seq_show(struct seq_file *s, void *it)
- {
- struct device *device;
- struct qeth_card *card;
- device = (struct device *) it;
- card = device->driver_data;
- seq_printf(s, "For card with devnos %s/%s/%s (%s):\n",
- CARD_RDEV_ID(card),
- CARD_WDEV_ID(card),
- CARD_DDEV_ID(card),
- QETH_CARD_IFNAME(card)
- );
- seq_printf(s, " Skb's/buffers received : %li/%i\n"
- " Skb's/buffers sent : %li/%i\n\n",
- card->stats.rx_packets, card->perf_stats.bufs_rec,
- card->stats.tx_packets, card->perf_stats.bufs_sent
- );
- seq_printf(s, " Skb's/buffers sent without packing : %li/%i\n"
- " Skb's/buffers sent with packing : %i/%i\n\n",
- card->stats.tx_packets - card->perf_stats.skbs_sent_pack,
- card->perf_stats.bufs_sent - card->perf_stats.bufs_sent_pack,
- card->perf_stats.skbs_sent_pack,
- card->perf_stats.bufs_sent_pack
- );
- seq_printf(s, " Skbs sent in SG mode : %i\n"
- " Skb fragments sent in SG mode : %i\n\n",
- card->perf_stats.sg_skbs_sent,
- card->perf_stats.sg_frags_sent);
- seq_printf(s, " large_send tx (in Kbytes) : %i\n"
- " large_send count : %i\n\n",
- card->perf_stats.large_send_bytes >> 10,
- card->perf_stats.large_send_cnt);
- seq_printf(s, " Packing state changes no pkg.->packing : %i/%i\n"
- " Watermarks L/H : %i/%i\n"
- " Current buffer usage (outbound q's) : "
- "%i/%i/%i/%i\n\n",
- card->perf_stats.sc_dp_p, card->perf_stats.sc_p_dp,
- QETH_LOW_WATERMARK_PACK, QETH_HIGH_WATERMARK_PACK,
- atomic_read(&card->qdio.out_qs[0]->used_buffers),
- (card->qdio.no_out_queues > 1)?
- atomic_read(&card->qdio.out_qs[1]->used_buffers)
- : 0,
- (card->qdio.no_out_queues > 2)?
- atomic_read(&card->qdio.out_qs[2]->used_buffers)
- : 0,
- (card->qdio.no_out_queues > 3)?
- atomic_read(&card->qdio.out_qs[3]->used_buffers)
- : 0
- );
- seq_printf(s, " Inbound handler time (in us) : %i\n"
- " Inbound handler count : %i\n"
- " Inbound do_QDIO time (in us) : %i\n"
- " Inbound do_QDIO count : %i\n\n"
- " Outbound handler time (in us) : %i\n"
- " Outbound handler count : %i\n\n"
- " Outbound time (in us, incl QDIO) : %i\n"
- " Outbound count : %i\n"
- " Outbound do_QDIO time (in us) : %i\n"
- " Outbound do_QDIO count : %i\n\n",
- card->perf_stats.inbound_time,
- card->perf_stats.inbound_cnt,
- card->perf_stats.inbound_do_qdio_time,
- card->perf_stats.inbound_do_qdio_cnt,
- card->perf_stats.outbound_handler_time,
- card->perf_stats.outbound_handler_cnt,
- card->perf_stats.outbound_time,
- card->perf_stats.outbound_cnt,
- card->perf_stats.outbound_do_qdio_time,
- card->perf_stats.outbound_do_qdio_cnt
- );
- return 0;
- }
- static struct seq_operations qeth_perf_procfile_seq_ops = {
- .start = qeth_perf_procfile_seq_start,
- .stop = qeth_perf_procfile_seq_stop,
- .next = qeth_perf_procfile_seq_next,
- .show = qeth_perf_procfile_seq_show,
- };
- static int
- qeth_perf_procfile_open(struct inode *inode, struct file *file)
- {
- return seq_open(file, &qeth_perf_procfile_seq_ops);
- }
- static struct file_operations qeth_perf_procfile_fops = {
- .owner = THIS_MODULE,
- .open = qeth_perf_procfile_open,
- .read = seq_read,
- .llseek = seq_lseek,
- .release = seq_release,
- };
- #define qeth_perf_procfile_created qeth_perf_procfile
- #else
- #define qeth_perf_procfile_created 1
- #endif /* CONFIG_QETH_PERF_STATS */
- /***** /proc/qeth_ipa_takeover *****/
- #define QETH_IPATO_PROCFILE_NAME "qeth_ipa_takeover"
- static struct proc_dir_entry *qeth_ipato_procfile;
- static void *
- qeth_ipato_procfile_seq_start(struct seq_file *s, loff_t *offset)
- {
- struct device *dev;
- loff_t nr;
- down_read(&qeth_ccwgroup_driver.driver.bus->subsys.rwsem);
- /* TODO: finish this */
- /*
- * maybe SEQ_SATRT_TOKEN can be returned for offset 0
- * output driver settings then;
- * else output setting for respective card
- */
- dev = driver_find_device(&qeth_ccwgroup_driver.driver, NULL, NULL,
- qeth_procfile_seq_match);
- /* get card at pos *offset */
- nr = *offset;
- while (nr-- > 1 && dev)
- dev = driver_find_device(&qeth_ccwgroup_driver.driver, dev,
- NULL, qeth_procfile_seq_match);
- return (void *) dev;
- }
- static void
- qeth_ipato_procfile_seq_stop(struct seq_file *s, void* it)
- {
- up_read(&qeth_ccwgroup_driver.driver.bus->subsys.rwsem);
- }
- static void *
- qeth_ipato_procfile_seq_next(struct seq_file *s, void *it, loff_t *offset)
- {
- struct device *prev, *next;
- prev = (struct device *) it;
- next = driver_find_device(&qeth_ccwgroup_driver.driver, prev,
- NULL, qeth_procfile_seq_match);
- if (next)
- (*offset)++;
- return (void *) next;
- }
- static int
- qeth_ipato_procfile_seq_show(struct seq_file *s, void *it)
- {
- struct device *device;
- struct qeth_card *card;
- /* TODO: finish this */
- /*
- * maybe SEQ_SATRT_TOKEN can be returned for offset 0
- * output driver settings then;
- * else output setting for respective card
- */
- device = (struct device *) it;
- card = device->driver_data;
- return 0;
- }
- static struct seq_operations qeth_ipato_procfile_seq_ops = {
- .start = qeth_ipato_procfile_seq_start,
- .stop = qeth_ipato_procfile_seq_stop,
- .next = qeth_ipato_procfile_seq_next,
- .show = qeth_ipato_procfile_seq_show,
- };
- static int
- qeth_ipato_procfile_open(struct inode *inode, struct file *file)
- {
- return seq_open(file, &qeth_ipato_procfile_seq_ops);
- }
- static struct file_operations qeth_ipato_procfile_fops = {
- .owner = THIS_MODULE,
- .open = qeth_ipato_procfile_open,
- .read = seq_read,
- .llseek = seq_lseek,
- .release = seq_release,
- };
- int __init
- qeth_create_procfs_entries(void)
- {
- qeth_procfile = create_proc_entry(QETH_PROCFILE_NAME,
- S_IFREG | 0444, NULL);
- if (qeth_procfile)
- qeth_procfile->proc_fops = &qeth_procfile_fops;
- #ifdef CONFIG_QETH_PERF_STATS
- qeth_perf_procfile = create_proc_entry(QETH_PERF_PROCFILE_NAME,
- S_IFREG | 0444, NULL);
- if (qeth_perf_procfile)
- qeth_perf_procfile->proc_fops = &qeth_perf_procfile_fops;
- #endif /* CONFIG_QETH_PERF_STATS */
- qeth_ipato_procfile = create_proc_entry(QETH_IPATO_PROCFILE_NAME,
- S_IFREG | 0444, NULL);
- if (qeth_ipato_procfile)
- qeth_ipato_procfile->proc_fops = &qeth_ipato_procfile_fops;
- if (qeth_procfile &&
- qeth_ipato_procfile &&
- qeth_perf_procfile_created)
- return 0;
- else
- return -ENOMEM;
- }
- void __exit
- qeth_remove_procfs_entries(void)
- {
- if (qeth_procfile)
- remove_proc_entry(QETH_PROCFILE_NAME, NULL);
- if (qeth_perf_procfile)
- remove_proc_entry(QETH_PERF_PROCFILE_NAME, NULL);
- if (qeth_ipato_procfile)
- remove_proc_entry(QETH_IPATO_PROCFILE_NAME, NULL);
- }
- /* ONLY FOR DEVELOPMENT! -> make it as module */
- /*
- static void
- qeth_create_sysfs_entries(void)
- {
- struct device *dev;
- down_read(&qeth_ccwgroup_driver.driver.bus->subsys.rwsem);
- list_for_each_entry(dev, &qeth_ccwgroup_driver.driver.devices,
- driver_list)
- qeth_create_device_attributes(dev);
- up_read(&qeth_ccwgroup_driver.driver.bus->subsys.rwsem);
- }
- static void
- qeth_remove_sysfs_entries(void)
- {
- struct device *dev;
- down_read(&qeth_ccwgroup_driver.driver.bus->subsys.rwsem);
- list_for_each_entry(dev, &qeth_ccwgroup_driver.driver.devices,
- driver_list)
- qeth_remove_device_attributes(dev);
- up_read(&qeth_ccwgroup_driver.driver.bus->subsys.rwsem);
- }
- static int __init
- qeth_fs_init(void)
- {
- printk(KERN_INFO "qeth_fs_init\n");
- qeth_create_procfs_entries();
- qeth_create_sysfs_entries();
- return 0;
- }
- static void __exit
- qeth_fs_exit(void)
- {
- printk(KERN_INFO "qeth_fs_exit\n");
- qeth_remove_procfs_entries();
- qeth_remove_sysfs_entries();
- }
- module_init(qeth_fs_init);
- module_exit(qeth_fs_exit);
- MODULE_LICENSE("GPL");
- */
|