1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * Copyright 2012 Cisco Systems, Inc. All rights reserved. 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * This program is free software; you may redistribute it and/or modify 5*4882a593Smuzhiyun * it under the terms of the GNU General Public License as published by 6*4882a593Smuzhiyun * the Free Software Foundation; version 2 of the License. 7*4882a593Smuzhiyun * 8*4882a593Smuzhiyun * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 9*4882a593Smuzhiyun * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 10*4882a593Smuzhiyun * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 11*4882a593Smuzhiyun * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 12*4882a593Smuzhiyun * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 13*4882a593Smuzhiyun * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 14*4882a593Smuzhiyun * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 15*4882a593Smuzhiyun * SOFTWARE. 16*4882a593Smuzhiyun */ 17*4882a593Smuzhiyun 18*4882a593Smuzhiyun #ifndef __FNIC_TRACE_H__ 19*4882a593Smuzhiyun #define __FNIC_TRACE_H__ 20*4882a593Smuzhiyun 21*4882a593Smuzhiyun #define FNIC_ENTRY_SIZE_BYTES 64 22*4882a593Smuzhiyun #define FC_TRC_SIZE_BYTES 256 23*4882a593Smuzhiyun #define FC_TRC_HEADER_SIZE sizeof(struct fc_trace_hdr) 24*4882a593Smuzhiyun 25*4882a593Smuzhiyun /* 26*4882a593Smuzhiyun * Fisrt bit of FNIC_FC_RECV and FNIC_FC_SEND is used to represent the type 27*4882a593Smuzhiyun * of frame 1 => Eth frame, 0=> FC frame 28*4882a593Smuzhiyun */ 29*4882a593Smuzhiyun 30*4882a593Smuzhiyun #define FNIC_FC_RECV 0x52 /* Character R */ 31*4882a593Smuzhiyun #define FNIC_FC_SEND 0x54 /* Character T */ 32*4882a593Smuzhiyun #define FNIC_FC_LE 0x4C /* Character L */ 33*4882a593Smuzhiyun 34*4882a593Smuzhiyun extern ssize_t simple_read_from_buffer(void __user *to, 35*4882a593Smuzhiyun size_t count, 36*4882a593Smuzhiyun loff_t *ppos, 37*4882a593Smuzhiyun const void *from, 38*4882a593Smuzhiyun size_t available); 39*4882a593Smuzhiyun 40*4882a593Smuzhiyun extern unsigned int fnic_trace_max_pages; 41*4882a593Smuzhiyun extern int fnic_tracing_enabled; 42*4882a593Smuzhiyun extern unsigned int trace_max_pages; 43*4882a593Smuzhiyun 44*4882a593Smuzhiyun extern unsigned int fnic_fc_trace_max_pages; 45*4882a593Smuzhiyun extern int fnic_fc_tracing_enabled; 46*4882a593Smuzhiyun extern int fnic_fc_trace_cleared; 47*4882a593Smuzhiyun 48*4882a593Smuzhiyun typedef struct fnic_trace_dbg { 49*4882a593Smuzhiyun int wr_idx; 50*4882a593Smuzhiyun int rd_idx; 51*4882a593Smuzhiyun unsigned long *page_offset; 52*4882a593Smuzhiyun } fnic_trace_dbg_t; 53*4882a593Smuzhiyun 54*4882a593Smuzhiyun typedef struct fnic_dbgfs { 55*4882a593Smuzhiyun int buffer_len; 56*4882a593Smuzhiyun char *buffer; 57*4882a593Smuzhiyun } fnic_dbgfs_t; 58*4882a593Smuzhiyun 59*4882a593Smuzhiyun struct fnic_trace_data { 60*4882a593Smuzhiyun union { 61*4882a593Smuzhiyun struct { 62*4882a593Smuzhiyun u32 low; 63*4882a593Smuzhiyun u32 high; 64*4882a593Smuzhiyun }; 65*4882a593Smuzhiyun u64 val; 66*4882a593Smuzhiyun } timestamp, fnaddr; 67*4882a593Smuzhiyun u32 host_no; 68*4882a593Smuzhiyun u32 tag; 69*4882a593Smuzhiyun u64 data[5]; 70*4882a593Smuzhiyun } __attribute__((__packed__)); 71*4882a593Smuzhiyun 72*4882a593Smuzhiyun typedef struct fnic_trace_data fnic_trace_data_t; 73*4882a593Smuzhiyun 74*4882a593Smuzhiyun struct fc_trace_hdr { 75*4882a593Smuzhiyun struct timespec64 time_stamp; 76*4882a593Smuzhiyun u32 host_no; 77*4882a593Smuzhiyun u8 frame_type; 78*4882a593Smuzhiyun u8 frame_len; 79*4882a593Smuzhiyun } __attribute__((__packed__)); 80*4882a593Smuzhiyun 81*4882a593Smuzhiyun #define FC_TRACE_ADDRESS(a) \ 82*4882a593Smuzhiyun ((unsigned long)(a) + sizeof(struct fc_trace_hdr)) 83*4882a593Smuzhiyun 84*4882a593Smuzhiyun #define FNIC_TRACE_ENTRY_SIZE \ 85*4882a593Smuzhiyun (FNIC_ENTRY_SIZE_BYTES - sizeof(fnic_trace_data_t)) 86*4882a593Smuzhiyun 87*4882a593Smuzhiyun #define FNIC_TRACE(_fn, _hn, _t, _a, _b, _c, _d, _e) \ 88*4882a593Smuzhiyun if (unlikely(fnic_tracing_enabled)) { \ 89*4882a593Smuzhiyun fnic_trace_data_t *trace_buf = fnic_trace_get_buf(); \ 90*4882a593Smuzhiyun if (trace_buf) { \ 91*4882a593Smuzhiyun if (sizeof(unsigned long) < 8) { \ 92*4882a593Smuzhiyun trace_buf->timestamp.low = jiffies; \ 93*4882a593Smuzhiyun trace_buf->fnaddr.low = (u32)(unsigned long)_fn; \ 94*4882a593Smuzhiyun } else { \ 95*4882a593Smuzhiyun trace_buf->timestamp.val = jiffies; \ 96*4882a593Smuzhiyun trace_buf->fnaddr.val = (u64)(unsigned long)_fn; \ 97*4882a593Smuzhiyun } \ 98*4882a593Smuzhiyun trace_buf->host_no = _hn; \ 99*4882a593Smuzhiyun trace_buf->tag = _t; \ 100*4882a593Smuzhiyun trace_buf->data[0] = (u64)(unsigned long)_a; \ 101*4882a593Smuzhiyun trace_buf->data[1] = (u64)(unsigned long)_b; \ 102*4882a593Smuzhiyun trace_buf->data[2] = (u64)(unsigned long)_c; \ 103*4882a593Smuzhiyun trace_buf->data[3] = (u64)(unsigned long)_d; \ 104*4882a593Smuzhiyun trace_buf->data[4] = (u64)(unsigned long)_e; \ 105*4882a593Smuzhiyun } \ 106*4882a593Smuzhiyun } 107*4882a593Smuzhiyun 108*4882a593Smuzhiyun fnic_trace_data_t *fnic_trace_get_buf(void); 109*4882a593Smuzhiyun int fnic_get_trace_data(fnic_dbgfs_t *); 110*4882a593Smuzhiyun int fnic_trace_buf_init(void); 111*4882a593Smuzhiyun void fnic_trace_free(void); 112*4882a593Smuzhiyun int fnic_debugfs_init(void); 113*4882a593Smuzhiyun void fnic_debugfs_terminate(void); 114*4882a593Smuzhiyun void fnic_trace_debugfs_init(void); 115*4882a593Smuzhiyun void fnic_trace_debugfs_terminate(void); 116*4882a593Smuzhiyun 117*4882a593Smuzhiyun /* Fnic FC CTLR Trace releated function */ 118*4882a593Smuzhiyun int fnic_fc_trace_init(void); 119*4882a593Smuzhiyun void fnic_fc_trace_free(void); 120*4882a593Smuzhiyun int fnic_fc_trace_set_data(u32 host_no, u8 frame_type, 121*4882a593Smuzhiyun char *frame, u32 fc_frame_len); 122*4882a593Smuzhiyun int fnic_fc_trace_get_data(fnic_dbgfs_t *fnic_dbgfs_prt, u8 rdata_flag); 123*4882a593Smuzhiyun void copy_and_format_trace_data(struct fc_trace_hdr *tdata, 124*4882a593Smuzhiyun fnic_dbgfs_t *fnic_dbgfs_prt, 125*4882a593Smuzhiyun int *len, u8 rdata_flag); 126*4882a593Smuzhiyun void fnic_fc_trace_debugfs_init(void); 127*4882a593Smuzhiyun void fnic_fc_trace_debugfs_terminate(void); 128*4882a593Smuzhiyun 129*4882a593Smuzhiyun #endif 130