2012-08-10 01:59:10 +00:00
/*******************************************************************************
Intel 10 Gigabit PCI Express Linux driver
2013-01-08 05:02:28 +00:00
Copyright ( c ) 1999 - 2013 Intel Corporation .
2012-08-10 01:59:10 +00:00
This program is free software ; you can redistribute it and / or modify it
under the terms and conditions of the GNU General Public License ,
version 2 , as published by the Free Software Foundation .
This program is distributed in the hope it will be useful , but WITHOUT
ANY WARRANTY ; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE . See the GNU General Public License for
more details .
You should have received a copy of the GNU General Public License along with
this program ; if not , write to the Free Software Foundation , Inc . ,
51 Franklin St - Fifth Floor , Boston , MA 02110 - 1301 USA .
The full GNU General Public License is included in this distribution in
the file called " COPYING " .
Contact Information :
2014-02-22 01:23:50 +00:00
Linux NICS < linux . nics @ intel . com >
2012-08-10 01:59:10 +00:00
e1000 - devel Mailing List < e1000 - devel @ lists . sourceforge . net >
Intel Corporation , 5200 N . E . Elam Young Parkway , Hillsboro , OR 97124 - 6497
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
# include <linux/debugfs.h>
# include <linux/module.h>
# include "ixgbe.h"
static struct dentry * ixgbe_dbg_root ;
2012-08-10 01:59:21 +00:00
static char ixgbe_dbg_reg_ops_buf [ 256 ] = " " ;
/**
* ixgbe_dbg_reg_ops_read - read for reg_ops datum
* @ filp : the opened file
* @ buffer : where to write the data for the user to read
* @ count : the size of the user ' s buffer
* @ ppos : file position offset
* */
static ssize_t ixgbe_dbg_reg_ops_read ( struct file * filp , char __user * buffer ,
size_t count , loff_t * ppos )
{
struct ixgbe_adapter * adapter = filp - > private_data ;
2012-11-28 05:49:20 +00:00
char * buf ;
2012-08-10 01:59:21 +00:00
int len ;
/* don't allow partial reads */
if ( * ppos ! = 0 )
return 0 ;
2012-11-28 05:49:20 +00:00
buf = kasprintf ( GFP_KERNEL , " %s: %s \n " ,
adapter - > netdev - > name ,
ixgbe_dbg_reg_ops_buf ) ;
if ( ! buf )
return - ENOMEM ;
if ( count < strlen ( buf ) ) {
kfree ( buf ) ;
2012-08-10 01:59:21 +00:00
return - ENOSPC ;
2012-11-28 05:49:20 +00:00
}
len = simple_read_from_buffer ( buffer , count , ppos , buf , strlen ( buf ) ) ;
2012-08-10 01:59:21 +00:00
2012-11-28 05:49:20 +00:00
kfree ( buf ) ;
2012-08-10 01:59:21 +00:00
return len ;
}
/**
* ixgbe_dbg_reg_ops_write - write into reg_ops datum
* @ filp : the opened file
* @ buffer : where to find the user ' s data
* @ count : the length of the user ' s data
* @ ppos : file position offset
* */
static ssize_t ixgbe_dbg_reg_ops_write ( struct file * filp ,
const char __user * buffer ,
size_t count , loff_t * ppos )
{
struct ixgbe_adapter * adapter = filp - > private_data ;
2012-11-28 05:49:20 +00:00
int len ;
2012-08-10 01:59:21 +00:00
/* don't allow partial writes */
if ( * ppos ! = 0 )
return 0 ;
if ( count > = sizeof ( ixgbe_dbg_reg_ops_buf ) )
return - ENOSPC ;
2012-11-28 05:49:20 +00:00
len = simple_write_to_buffer ( ixgbe_dbg_reg_ops_buf ,
sizeof ( ixgbe_dbg_reg_ops_buf ) - 1 ,
ppos ,
buffer ,
count ) ;
if ( len < 0 )
return len ;
ixgbe_dbg_reg_ops_buf [ len ] = ' \0 ' ;
2012-08-10 01:59:21 +00:00
if ( strncmp ( ixgbe_dbg_reg_ops_buf , " write " , 5 ) = = 0 ) {
u32 reg , value ;
int cnt ;
cnt = sscanf ( & ixgbe_dbg_reg_ops_buf [ 5 ] , " %x %x " , & reg , & value ) ;
if ( cnt = = 2 ) {
IXGBE_WRITE_REG ( & adapter - > hw , reg , value ) ;
value = IXGBE_READ_REG ( & adapter - > hw , reg ) ;
e_dev_info ( " write: 0x%08x = 0x%08x \n " , reg , value ) ;
} else {
e_dev_info ( " write <reg> <value> \n " ) ;
}
} else if ( strncmp ( ixgbe_dbg_reg_ops_buf , " read " , 4 ) = = 0 ) {
u32 reg , value ;
int cnt ;
cnt = sscanf ( & ixgbe_dbg_reg_ops_buf [ 4 ] , " %x " , & reg ) ;
if ( cnt = = 1 ) {
value = IXGBE_READ_REG ( & adapter - > hw , reg ) ;
e_dev_info ( " read 0x%08x = 0x%08x \n " , reg , value ) ;
} else {
e_dev_info ( " read <reg> \n " ) ;
}
} else {
e_dev_info ( " Unknown command %s \n " , ixgbe_dbg_reg_ops_buf ) ;
e_dev_info ( " Available commands: \n " ) ;
e_dev_info ( " read <reg> \n " ) ;
e_dev_info ( " write <reg> <value> \n " ) ;
}
return count ;
}
static const struct file_operations ixgbe_dbg_reg_ops_fops = {
. owner = THIS_MODULE ,
2012-10-18 06:34:08 +00:00
. open = simple_open ,
2012-08-10 01:59:21 +00:00
. read = ixgbe_dbg_reg_ops_read ,
. write = ixgbe_dbg_reg_ops_write ,
} ;
2012-08-10 01:59:15 +00:00
static char ixgbe_dbg_netdev_ops_buf [ 256 ] = " " ;
/**
* ixgbe_dbg_netdev_ops_read - read for netdev_ops datum
* @ filp : the opened file
* @ buffer : where to write the data for the user to read
* @ count : the size of the user ' s buffer
* @ ppos : file position offset
* */
static ssize_t ixgbe_dbg_netdev_ops_read ( struct file * filp ,
char __user * buffer ,
size_t count , loff_t * ppos )
{
struct ixgbe_adapter * adapter = filp - > private_data ;
2012-11-28 05:49:20 +00:00
char * buf ;
2012-08-10 01:59:15 +00:00
int len ;
/* don't allow partial reads */
if ( * ppos ! = 0 )
return 0 ;
2012-11-28 05:49:20 +00:00
buf = kasprintf ( GFP_KERNEL , " %s: %s \n " ,
adapter - > netdev - > name ,
ixgbe_dbg_netdev_ops_buf ) ;
if ( ! buf )
return - ENOMEM ;
if ( count < strlen ( buf ) ) {
kfree ( buf ) ;
2012-08-10 01:59:15 +00:00
return - ENOSPC ;
2012-11-28 05:49:20 +00:00
}
len = simple_read_from_buffer ( buffer , count , ppos , buf , strlen ( buf ) ) ;
2012-08-10 01:59:15 +00:00
2012-11-28 05:49:20 +00:00
kfree ( buf ) ;
2012-08-10 01:59:15 +00:00
return len ;
}
/**
* ixgbe_dbg_netdev_ops_write - write into netdev_ops datum
* @ filp : the opened file
* @ buffer : where to find the user ' s data
* @ count : the length of the user ' s data
* @ ppos : file position offset
* */
static ssize_t ixgbe_dbg_netdev_ops_write ( struct file * filp ,
const char __user * buffer ,
size_t count , loff_t * ppos )
{
struct ixgbe_adapter * adapter = filp - > private_data ;
2012-11-28 05:49:20 +00:00
int len ;
2012-08-10 01:59:15 +00:00
/* don't allow partial writes */
if ( * ppos ! = 0 )
return 0 ;
if ( count > = sizeof ( ixgbe_dbg_netdev_ops_buf ) )
return - ENOSPC ;
2012-11-28 05:49:20 +00:00
len = simple_write_to_buffer ( ixgbe_dbg_netdev_ops_buf ,
sizeof ( ixgbe_dbg_netdev_ops_buf ) - 1 ,
ppos ,
buffer ,
count ) ;
if ( len < 0 )
return len ;
ixgbe_dbg_netdev_ops_buf [ len ] = ' \0 ' ;
2012-08-10 01:59:15 +00:00
if ( strncmp ( ixgbe_dbg_netdev_ops_buf , " tx_timeout " , 10 ) = = 0 ) {
adapter - > netdev - > netdev_ops - > ndo_tx_timeout ( adapter - > netdev ) ;
e_dev_info ( " tx_timeout called \n " ) ;
} else {
e_dev_info ( " Unknown command: %s \n " , ixgbe_dbg_netdev_ops_buf ) ;
e_dev_info ( " Available commands: \n " ) ;
e_dev_info ( " tx_timeout \n " ) ;
}
return count ;
}
static const struct file_operations ixgbe_dbg_netdev_ops_fops = {
. owner = THIS_MODULE ,
2012-10-18 06:34:08 +00:00
. open = simple_open ,
2012-08-10 01:59:15 +00:00
. read = ixgbe_dbg_netdev_ops_read ,
. write = ixgbe_dbg_netdev_ops_write ,
} ;
2012-08-10 01:59:10 +00:00
/**
* ixgbe_dbg_adapter_init - setup the debugfs directory for the adapter
* @ adapter : the adapter that is starting up
* */
void ixgbe_dbg_adapter_init ( struct ixgbe_adapter * adapter )
{
const char * name = pci_name ( adapter - > pdev ) ;
2012-08-10 01:59:15 +00:00
struct dentry * pfile ;
2012-08-10 01:59:10 +00:00
adapter - > ixgbe_dbg_adapter = debugfs_create_dir ( name , ixgbe_dbg_root ) ;
2012-08-10 01:59:15 +00:00
if ( adapter - > ixgbe_dbg_adapter ) {
2012-08-10 01:59:21 +00:00
pfile = debugfs_create_file ( " reg_ops " , 0600 ,
adapter - > ixgbe_dbg_adapter , adapter ,
& ixgbe_dbg_reg_ops_fops ) ;
if ( ! pfile )
e_dev_err ( " debugfs reg_ops for %s failed \n " , name ) ;
2012-08-10 01:59:15 +00:00
pfile = debugfs_create_file ( " netdev_ops " , 0600 ,
adapter - > ixgbe_dbg_adapter , adapter ,
& ixgbe_dbg_netdev_ops_fops ) ;
if ( ! pfile )
e_dev_err ( " debugfs netdev_ops for %s failed \n " , name ) ;
} else {
2012-08-10 01:59:10 +00:00
e_dev_err ( " debugfs entry for %s failed \n " , name ) ;
2012-08-10 01:59:15 +00:00
}
2012-08-10 01:59:10 +00:00
}
/**
* ixgbe_dbg_adapter_exit - clear out the adapter ' s debugfs entries
* @ pf : the pf that is stopping
* */
void ixgbe_dbg_adapter_exit ( struct ixgbe_adapter * adapter )
{
2014-04-09 06:03:15 +00:00
debugfs_remove_recursive ( adapter - > ixgbe_dbg_adapter ) ;
2012-08-10 01:59:10 +00:00
adapter - > ixgbe_dbg_adapter = NULL ;
}
/**
* ixgbe_dbg_init - start up debugfs for the driver
* */
void ixgbe_dbg_init ( void )
{
ixgbe_dbg_root = debugfs_create_dir ( ixgbe_driver_name , NULL ) ;
if ( ixgbe_dbg_root = = NULL )
pr_err ( " init of debugfs failed \n " ) ;
}
/**
* ixgbe_dbg_exit - clean out the driver ' s debugfs entries
* */
void ixgbe_dbg_exit ( void )
{
debugfs_remove_recursive ( ixgbe_dbg_root ) ;
}