2022-06-07 17:11:24 +03:00
/* SPDX-License-Identifier: GPL-2.0-only */
/* Copyright 2012 Cisco Systems, Inc. All rights reserved. */
2013-02-13 05:01:02 +04:00
# ifndef __FNIC_TRACE_H__
# define __FNIC_TRACE_H__
# define FNIC_ENTRY_SIZE_BYTES 64
2014-04-18 23:28:19 +04:00
# define FC_TRC_SIZE_BYTES 256
# define FC_TRC_HEADER_SIZE sizeof(struct fc_trace_hdr)
/*
* Fisrt bit of FNIC_FC_RECV and FNIC_FC_SEND is used to represent the type
* of frame 1 = > Eth frame , 0 = > FC frame
*/
# define FNIC_FC_RECV 0x52 /* Character R */
# define FNIC_FC_SEND 0x54 /* Character T */
# define FNIC_FC_LE 0x4C /* Character L */
2013-02-13 05:01:02 +04:00
extern ssize_t simple_read_from_buffer ( void __user * to ,
size_t count ,
loff_t * ppos ,
const void * from ,
size_t available ) ;
extern unsigned int fnic_trace_max_pages ;
extern int fnic_tracing_enabled ;
extern unsigned int trace_max_pages ;
2014-04-18 23:28:19 +04:00
extern unsigned int fnic_fc_trace_max_pages ;
extern int fnic_fc_tracing_enabled ;
extern int fnic_fc_trace_cleared ;
2013-02-13 05:01:02 +04:00
typedef struct fnic_trace_dbg {
int wr_idx ;
int rd_idx ;
unsigned long * page_offset ;
} fnic_trace_dbg_t ;
typedef struct fnic_dbgfs {
int buffer_len ;
char * buffer ;
} fnic_dbgfs_t ;
struct fnic_trace_data {
union {
struct {
u32 low ;
u32 high ;
} ;
u64 val ;
} timestamp , fnaddr ;
u32 host_no ;
u32 tag ;
u64 data [ 5 ] ;
} __attribute__ ( ( __packed__ ) ) ;
typedef struct fnic_trace_data fnic_trace_data_t ;
2014-04-18 23:28:19 +04:00
struct fc_trace_hdr {
2016-10-02 02:48:14 +03:00
struct timespec64 time_stamp ;
2014-04-18 23:28:19 +04:00
u32 host_no ;
u8 frame_type ;
u8 frame_len ;
} __attribute__ ( ( __packed__ ) ) ;
# define FC_TRACE_ADDRESS(a) \
( ( unsigned long ) ( a ) + sizeof ( struct fc_trace_hdr ) )
2013-02-13 05:01:02 +04:00
# define FNIC_TRACE_ENTRY_SIZE \
( FNIC_ENTRY_SIZE_BYTES - sizeof ( fnic_trace_data_t ) )
# define FNIC_TRACE(_fn, _hn, _t, _a, _b, _c, _d, _e) \
if ( unlikely ( fnic_tracing_enabled ) ) { \
fnic_trace_data_t * trace_buf = fnic_trace_get_buf ( ) ; \
if ( trace_buf ) { \
if ( sizeof ( unsigned long ) < 8 ) { \
trace_buf - > timestamp . low = jiffies ; \
trace_buf - > fnaddr . low = ( u32 ) ( unsigned long ) _fn ; \
} else { \
trace_buf - > timestamp . val = jiffies ; \
trace_buf - > fnaddr . val = ( u64 ) ( unsigned long ) _fn ; \
} \
trace_buf - > host_no = _hn ; \
trace_buf - > tag = _t ; \
trace_buf - > data [ 0 ] = ( u64 ) ( unsigned long ) _a ; \
trace_buf - > data [ 1 ] = ( u64 ) ( unsigned long ) _b ; \
trace_buf - > data [ 2 ] = ( u64 ) ( unsigned long ) _c ; \
trace_buf - > data [ 3 ] = ( u64 ) ( unsigned long ) _d ; \
trace_buf - > data [ 4 ] = ( u64 ) ( unsigned long ) _e ; \
} \
}
fnic_trace_data_t * fnic_trace_get_buf ( void ) ;
int fnic_get_trace_data ( fnic_dbgfs_t * ) ;
int fnic_trace_buf_init ( void ) ;
void fnic_trace_free ( void ) ;
2013-09-13 04:45:42 +04:00
int fnic_debugfs_init ( void ) ;
void fnic_debugfs_terminate ( void ) ;
2019-01-22 18:09:02 +03:00
void fnic_trace_debugfs_init ( void ) ;
2013-02-13 05:01:02 +04:00
void fnic_trace_debugfs_terminate ( void ) ;
2014-04-18 23:28:19 +04:00
/* Fnic FC CTLR Trace releated function */
int fnic_fc_trace_init ( void ) ;
void fnic_fc_trace_free ( void ) ;
int fnic_fc_trace_set_data ( u32 host_no , u8 frame_type ,
char * frame , u32 fc_frame_len ) ;
int fnic_fc_trace_get_data ( fnic_dbgfs_t * fnic_dbgfs_prt , u8 rdata_flag ) ;
void copy_and_format_trace_data ( struct fc_trace_hdr * tdata ,
fnic_dbgfs_t * fnic_dbgfs_prt ,
int * len , u8 rdata_flag ) ;
2019-01-22 18:09:02 +03:00
void fnic_fc_trace_debugfs_init ( void ) ;
2014-04-18 23:28:19 +04:00
void fnic_fc_trace_debugfs_terminate ( void ) ;
2013-02-13 05:01:02 +04:00
# endif