2018-04-26 17:44:40 -04:00
/* Broadcom NetXtreme-C/E network driver.
*
* Copyright ( c ) 2017 - 2018 Broadcom Limited
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation .
*/
# include <linux/debugfs.h>
# include <linux/module.h>
# include <linux/pci.h>
# include "bnxt_hsi.h"
2019-01-10 17:33:17 +02:00
# include <linux/dim.h>
2018-04-26 17:44:40 -04:00
# include "bnxt.h"
# include "bnxt_debugfs.h"
static struct dentry * bnxt_debug_mnt ;
static ssize_t debugfs_dim_read ( struct file * filep ,
char __user * buffer ,
size_t count , loff_t * ppos )
{
2019-01-31 16:44:48 +02:00
struct dim * dim = filep - > private_data ;
2018-04-26 17:44:40 -04:00
int len ;
char * buf ;
if ( * ppos )
return 0 ;
if ( ! dim )
return - ENODEV ;
buf = kasprintf ( GFP_KERNEL ,
" state = %d \n " \
" profile_ix = %d \n " \
" mode = %d \n " \
" tune_state = %d \n " \
" steps_right = %d \n " \
" steps_left = %d \n " \
" tired = %d \n " ,
dim - > state ,
dim - > profile_ix ,
dim - > mode ,
dim - > tune_state ,
dim - > steps_right ,
dim - > steps_left ,
dim - > tired ) ;
if ( ! buf )
return - ENOMEM ;
if ( count < strlen ( buf ) ) {
kfree ( buf ) ;
return - ENOSPC ;
}
len = simple_read_from_buffer ( buffer , count , ppos , buf , strlen ( buf ) ) ;
kfree ( buf ) ;
return len ;
}
static const struct file_operations debugfs_dim_fops = {
. owner = THIS_MODULE ,
. open = simple_open ,
. read = debugfs_dim_read ,
} ;
2019-08-10 12:17:20 +02:00
static void debugfs_dim_ring_init ( struct dim * dim , int ring_idx ,
struct dentry * dd )
2018-04-26 17:44:40 -04:00
{
static char qname [ 16 ] ;
snprintf ( qname , 10 , " %d " , ring_idx ) ;
2019-08-10 12:17:20 +02:00
debugfs_create_file ( qname , 0600 , dd , dim , & debugfs_dim_fops ) ;
2018-04-26 17:44:40 -04:00
}
void bnxt_debug_dev_init ( struct bnxt * bp )
{
const char * pname = pci_name ( bp - > pdev ) ;
2019-08-10 12:17:20 +02:00
struct dentry * dir ;
2018-04-26 17:44:40 -04:00
int i ;
bp - > debugfs_pdev = debugfs_create_dir ( pname , bnxt_debug_mnt ) ;
2019-08-10 12:17:20 +02:00
dir = debugfs_create_dir ( " dim " , bp - > debugfs_pdev ) ;
2018-04-26 17:44:40 -04:00
2019-08-10 12:17:20 +02:00
/* create files for each rx ring */
for ( i = 0 ; i < bp - > cp_nr_rings ; i + + ) {
struct bnxt_cp_ring_info * cpr = & bp - > bnapi [ i ] - > cp_ring ;
if ( cpr & & bp - > bnapi [ i ] - > rx_ring )
debugfs_dim_ring_init ( & cpr - > dim , i , dir ) ;
2018-04-26 17:44:40 -04:00
}
}
void bnxt_debug_dev_exit ( struct bnxt * bp )
{
if ( bp ) {
debugfs_remove_recursive ( bp - > debugfs_pdev ) ;
bp - > debugfs_pdev = NULL ;
}
}
void bnxt_debug_init ( void )
{
bnxt_debug_mnt = debugfs_create_dir ( " bnxt_en " , NULL ) ;
}
void bnxt_debug_exit ( void )
{
debugfs_remove_recursive ( bnxt_debug_mnt ) ;
}