2005-04-16 15:20:36 -07:00
/*
* Kernel CAPI 2.0 Module - / proc / capi handling
2012-02-19 19:52:38 -08:00
*
2005-04-16 15:20:36 -07:00
* Copyright 1999 by Carsten Paeth < calle @ calle . de >
* Copyright 2002 by Kai Germaschewski < kai @ germaschewski . name >
2012-02-19 19:52:38 -08:00
*
2005-04-16 15:20:36 -07:00
* This software may be used and distributed according to the terms
* of the GNU General Public License , incorporated herein by reference .
*
*/
# include "kcapi.h"
# include <linux/proc_fs.h>
# include <linux/seq_file.h>
# include <linux/init.h>
2011-07-10 12:23:16 -04:00
# include <linux/export.h>
2005-04-16 15:20:36 -07:00
2010-02-08 10:12:10 +00:00
static char * state2str ( unsigned short state )
2005-04-16 15:20:36 -07:00
{
2010-02-08 10:12:10 +00:00
switch ( state ) {
case CAPI_CTR_DETECTED : return " detected " ;
case CAPI_CTR_LOADING : return " loading " ;
case CAPI_CTR_RUNNING : return " running " ;
2005-04-16 15:20:36 -07:00
default : return " ??? " ;
}
}
// /proc/capi
// ===========================================================================
2012-02-19 19:52:38 -08:00
// /proc/capi/controller:
2005-04-16 15:20:36 -07:00
// cnr driver cardstate name driverinfo
// /proc/capi/contrstats:
// cnr nrecvctlpkt nrecvdatapkt nsentctlpkt nsentdatapkt
// ---------------------------------------------------------------------------
static void * controller_start ( struct seq_file * seq , loff_t * pos )
2010-02-08 10:12:14 +00:00
__acquires ( capi_controller_lock )
2005-04-16 15:20:36 -07:00
{
2010-02-08 10:12:14 +00:00
mutex_lock ( & capi_controller_lock ) ;
2005-04-16 15:20:36 -07:00
if ( * pos < CAPI_MAXCONTR )
2010-02-08 10:12:10 +00:00
return & capi_controller [ * pos ] ;
2005-04-16 15:20:36 -07:00
return NULL ;
}
static void * controller_next ( struct seq_file * seq , void * v , loff_t * pos )
{
+ + * pos ;
if ( * pos < CAPI_MAXCONTR )
2010-02-08 10:12:10 +00:00
return & capi_controller [ * pos ] ;
2005-04-16 15:20:36 -07:00
return NULL ;
}
static void controller_stop ( struct seq_file * seq , void * v )
2010-02-08 10:12:14 +00:00
__releases ( capi_controller_lock )
2005-04-16 15:20:36 -07:00
{
2010-02-08 10:12:14 +00:00
mutex_unlock ( & capi_controller_lock ) ;
2005-04-16 15:20:36 -07:00
}
static int controller_show ( struct seq_file * seq , void * v )
{
struct capi_ctr * ctr = * ( struct capi_ctr * * ) v ;
if ( ! ctr )
return 0 ;
seq_printf ( seq , " %d %-10s %-8s %-16s %s \n " ,
ctr - > cnr , ctr - > driver_name ,
2010-02-08 10:12:10 +00:00
state2str ( ctr - > state ) ,
2005-04-16 15:20:36 -07:00
ctr - > name ,
ctr - > procinfo ? ctr - > procinfo ( ctr ) : " " ) ;
return 0 ;
}
static int contrstats_show ( struct seq_file * seq , void * v )
{
struct capi_ctr * ctr = * ( struct capi_ctr * * ) v ;
if ( ! ctr )
return 0 ;
seq_printf ( seq , " %d %lu %lu %lu %lu \n " ,
2012-02-19 19:52:38 -08:00
ctr - > cnr ,
2005-04-16 15:20:36 -07:00
ctr - > nrecvctlpkt ,
ctr - > nrecvdatapkt ,
ctr - > nsentctlpkt ,
ctr - > nsentdatapkt ) ;
return 0 ;
}
2009-09-22 16:43:43 -07:00
static const struct seq_operations seq_controller_ops = {
2005-04-16 15:20:36 -07:00
. start = controller_start ,
. next = controller_next ,
. stop = controller_stop ,
. show = controller_show ,
} ;
2009-09-22 16:43:43 -07:00
static const struct seq_operations seq_contrstats_ops = {
2005-04-16 15:20:36 -07:00
. start = controller_start ,
. next = controller_next ,
. stop = controller_stop ,
. show = contrstats_show ,
} ;
2012-02-19 19:52:38 -08:00
// /proc/capi/applications:
2005-04-16 15:20:36 -07:00
// applid l3cnt dblkcnt dblklen #ncci recvqueuelen
2012-02-19 19:52:38 -08:00
// /proc/capi/applstats:
2005-04-16 15:20:36 -07:00
// applid nrecvctlpkt nrecvdatapkt nsentctlpkt nsentdatapkt
// ---------------------------------------------------------------------------
2010-02-08 10:12:15 +00:00
static void * applications_start ( struct seq_file * seq , loff_t * pos )
__acquires ( capi_controller_lock )
2005-04-16 15:20:36 -07:00
{
2010-02-08 10:12:15 +00:00
mutex_lock ( & capi_controller_lock ) ;
2005-04-16 15:20:36 -07:00
if ( * pos < CAPI_MAXAPPL )
return & capi_applications [ * pos ] ;
return NULL ;
}
static void *
applications_next ( struct seq_file * seq , void * v , loff_t * pos )
{
+ + * pos ;
if ( * pos < CAPI_MAXAPPL )
return & capi_applications [ * pos ] ;
return NULL ;
}
2010-02-08 10:12:15 +00:00
static void applications_stop ( struct seq_file * seq , void * v )
__releases ( capi_controller_lock )
2005-04-16 15:20:36 -07:00
{
2010-02-08 10:12:15 +00:00
mutex_unlock ( & capi_controller_lock ) ;
2005-04-16 15:20:36 -07:00
}
static int
applications_show ( struct seq_file * seq , void * v )
{
struct capi20_appl * ap = * ( struct capi20_appl * * ) v ;
if ( ! ap )
return 0 ;
seq_printf ( seq , " %u %d %d %d \n " ,
ap - > applid ,
ap - > rparam . level3cnt ,
ap - > rparam . datablkcnt ,
ap - > rparam . datablklen ) ;
return 0 ;
}
static int
applstats_show ( struct seq_file * seq , void * v )
{
struct capi20_appl * ap = * ( struct capi20_appl * * ) v ;
if ( ! ap )
return 0 ;
seq_printf ( seq , " %u %lu %lu %lu %lu \n " ,
ap - > applid ,
ap - > nrecvctlpkt ,
ap - > nrecvdatapkt ,
ap - > nsentctlpkt ,
ap - > nsentdatapkt ) ;
return 0 ;
}
2009-09-22 16:43:43 -07:00
static const struct seq_operations seq_applications_ops = {
2005-04-16 15:20:36 -07:00
. start = applications_start ,
. next = applications_next ,
. stop = applications_stop ,
. show = applications_show ,
} ;
2009-09-22 16:43:43 -07:00
static const struct seq_operations seq_applstats_ops = {
2005-04-16 15:20:36 -07:00
. start = applications_start ,
. next = applications_next ,
. stop = applications_stop ,
. show = applstats_show ,
} ;
// ---------------------------------------------------------------------------
2019-12-10 21:59:16 +01:00
/* /proc/capi/drivers is always empty */
static ssize_t empty_read ( struct file * file , char __user * buf ,
size_t size , loff_t * off )
2005-04-16 15:20:36 -07:00
{
return 0 ;
}
2020-02-03 17:37:17 -08:00
static const struct proc_ops empty_proc_ops = {
. proc_read = empty_read ,
2005-04-16 15:20:36 -07:00
} ;
// ---------------------------------------------------------------------------
2012-02-19 19:52:38 -08:00
void __init
2005-04-16 15:20:36 -07:00
kcapi_proc_init ( void )
{
proc_mkdir ( " capi " , NULL ) ;
proc_mkdir ( " capi/controllers " , NULL ) ;
2018-04-13 19:44:18 +02:00
proc_create_seq ( " capi/controller " , 0 , NULL , & seq_controller_ops ) ;
proc_create_seq ( " capi/contrstats " , 0 , NULL , & seq_contrstats_ops ) ;
proc_create_seq ( " capi/applications " , 0 , NULL , & seq_applications_ops ) ;
proc_create_seq ( " capi/applstats " , 0 , NULL , & seq_applstats_ops ) ;
2020-02-03 17:37:17 -08:00
proc_create ( " capi/driver " , 0 , NULL , & empty_proc_ops ) ;
2005-04-16 15:20:36 -07:00
}
2019-12-16 20:48:56 +01:00
void
2005-04-16 15:20:36 -07:00
kcapi_proc_exit ( void )
{
remove_proc_entry ( " capi/driver " , NULL ) ;
remove_proc_entry ( " capi/controller " , NULL ) ;
remove_proc_entry ( " capi/contrstats " , NULL ) ;
remove_proc_entry ( " capi/applications " , NULL ) ;
remove_proc_entry ( " capi/applstats " , NULL ) ;
remove_proc_entry ( " capi/controllers " , NULL ) ;
remove_proc_entry ( " capi " , NULL ) ;
}