@@ -49,10 +49,18 @@ static const struct fjes_stats fjes_gstrings_stats[] = {
49
49
FJES_STAT ("tx_dropped" , stats64 .tx_dropped ),
50
50
};
51
51
52
+ #define FJES_EP_STATS_LEN 14
53
+ #define FJES_STATS_LEN \
54
+ (ARRAY_SIZE(fjes_gstrings_stats) + \
55
+ ((&((struct fjes_adapter *)netdev_priv(netdev))->hw)->max_epid - 1) * \
56
+ FJES_EP_STATS_LEN)
57
+
52
58
static void fjes_get_ethtool_stats (struct net_device * netdev ,
53
59
struct ethtool_stats * stats , u64 * data )
54
60
{
55
61
struct fjes_adapter * adapter = netdev_priv (netdev );
62
+ struct fjes_hw * hw = & adapter -> hw ;
63
+ int epidx ;
56
64
char * p ;
57
65
int i ;
58
66
@@ -61,11 +69,39 @@ static void fjes_get_ethtool_stats(struct net_device *netdev,
61
69
data [i ] = (fjes_gstrings_stats [i ].sizeof_stat == sizeof (u64 ))
62
70
? * (u64 * )p : * (u32 * )p ;
63
71
}
72
+ for (epidx = 0 ; epidx < hw -> max_epid ; epidx ++ ) {
73
+ if (epidx == hw -> my_epid )
74
+ continue ;
75
+ data [i ++ ] = hw -> ep_shm_info [epidx ].ep_stats
76
+ .com_regist_buf_exec ;
77
+ data [i ++ ] = hw -> ep_shm_info [epidx ].ep_stats
78
+ .com_unregist_buf_exec ;
79
+ data [i ++ ] = hw -> ep_shm_info [epidx ].ep_stats .send_intr_rx ;
80
+ data [i ++ ] = hw -> ep_shm_info [epidx ].ep_stats .send_intr_unshare ;
81
+ data [i ++ ] = hw -> ep_shm_info [epidx ].ep_stats
82
+ .send_intr_zoneupdate ;
83
+ data [i ++ ] = hw -> ep_shm_info [epidx ].ep_stats .recv_intr_rx ;
84
+ data [i ++ ] = hw -> ep_shm_info [epidx ].ep_stats .recv_intr_unshare ;
85
+ data [i ++ ] = hw -> ep_shm_info [epidx ].ep_stats .recv_intr_stop ;
86
+ data [i ++ ] = hw -> ep_shm_info [epidx ].ep_stats
87
+ .recv_intr_zoneupdate ;
88
+ data [i ++ ] = hw -> ep_shm_info [epidx ].ep_stats .tx_buffer_full ;
89
+ data [i ++ ] = hw -> ep_shm_info [epidx ].ep_stats
90
+ .tx_dropped_not_shared ;
91
+ data [i ++ ] = hw -> ep_shm_info [epidx ].ep_stats
92
+ .tx_dropped_ver_mismatch ;
93
+ data [i ++ ] = hw -> ep_shm_info [epidx ].ep_stats
94
+ .tx_dropped_buf_size_mismatch ;
95
+ data [i ++ ] = hw -> ep_shm_info [epidx ].ep_stats
96
+ .tx_dropped_vlanid_mismatch ;
97
+ }
64
98
}
65
99
66
100
static void fjes_get_strings (struct net_device * netdev ,
67
101
u32 stringset , u8 * data )
68
102
{
103
+ struct fjes_adapter * adapter = netdev_priv (netdev );
104
+ struct fjes_hw * hw = & adapter -> hw ;
69
105
u8 * p = data ;
70
106
int i ;
71
107
@@ -76,6 +112,38 @@ static void fjes_get_strings(struct net_device *netdev,
76
112
ETH_GSTRING_LEN );
77
113
p += ETH_GSTRING_LEN ;
78
114
}
115
+ for (i = 0 ; i < hw -> max_epid ; i ++ ) {
116
+ if (i == hw -> my_epid )
117
+ continue ;
118
+ sprintf (p , "ep%u_com_regist_buf_exec" , i );
119
+ p += ETH_GSTRING_LEN ;
120
+ sprintf (p , "ep%u_com_unregist_buf_exec" , i );
121
+ p += ETH_GSTRING_LEN ;
122
+ sprintf (p , "ep%u_send_intr_rx" , i );
123
+ p += ETH_GSTRING_LEN ;
124
+ sprintf (p , "ep%u_send_intr_unshare" , i );
125
+ p += ETH_GSTRING_LEN ;
126
+ sprintf (p , "ep%u_send_intr_zoneupdate" , i );
127
+ p += ETH_GSTRING_LEN ;
128
+ sprintf (p , "ep%u_recv_intr_rx" , i );
129
+ p += ETH_GSTRING_LEN ;
130
+ sprintf (p , "ep%u_recv_intr_unshare" , i );
131
+ p += ETH_GSTRING_LEN ;
132
+ sprintf (p , "ep%u_recv_intr_stop" , i );
133
+ p += ETH_GSTRING_LEN ;
134
+ sprintf (p , "ep%u_recv_intr_zoneupdate" , i );
135
+ p += ETH_GSTRING_LEN ;
136
+ sprintf (p , "ep%u_tx_buffer_full" , i );
137
+ p += ETH_GSTRING_LEN ;
138
+ sprintf (p , "ep%u_tx_dropped_not_shared" , i );
139
+ p += ETH_GSTRING_LEN ;
140
+ sprintf (p , "ep%u_tx_dropped_ver_mismatch" , i );
141
+ p += ETH_GSTRING_LEN ;
142
+ sprintf (p , "ep%u_tx_dropped_buf_size_mismatch" , i );
143
+ p += ETH_GSTRING_LEN ;
144
+ sprintf (p , "ep%u_tx_dropped_vlanid_mismatch" , i );
145
+ p += ETH_GSTRING_LEN ;
146
+ }
79
147
break ;
80
148
}
81
149
}
@@ -84,7 +152,7 @@ static int fjes_get_sset_count(struct net_device *netdev, int sset)
84
152
{
85
153
switch (sset ) {
86
154
case ETH_SS_STATS :
87
- return ARRAY_SIZE ( fjes_gstrings_stats ) ;
155
+ return FJES_STATS_LEN ;
88
156
default :
89
157
return - EOPNOTSUPP ;
90
158
}
@@ -121,12 +189,123 @@ static int fjes_get_settings(struct net_device *netdev,
121
189
return 0 ;
122
190
}
123
191
192
+ static int fjes_get_regs_len (struct net_device * netdev )
193
+ {
194
+ #define FJES_REGS_LEN 37
195
+ return FJES_REGS_LEN * sizeof (u32 );
196
+ }
197
+
198
+ static void fjes_get_regs (struct net_device * netdev ,
199
+ struct ethtool_regs * regs , void * p )
200
+ {
201
+ struct fjes_adapter * adapter = netdev_priv (netdev );
202
+ struct fjes_hw * hw = & adapter -> hw ;
203
+ u32 * regs_buff = p ;
204
+
205
+ memset (p , 0 , FJES_REGS_LEN * sizeof (u32 ));
206
+
207
+ regs -> version = 1 ;
208
+
209
+ /* Information registers */
210
+ regs_buff [0 ] = rd32 (XSCT_OWNER_EPID );
211
+ regs_buff [1 ] = rd32 (XSCT_MAX_EP );
212
+
213
+ /* Device Control registers */
214
+ regs_buff [4 ] = rd32 (XSCT_DCTL );
215
+
216
+ /* Command Control registers */
217
+ regs_buff [8 ] = rd32 (XSCT_CR );
218
+ regs_buff [9 ] = rd32 (XSCT_CS );
219
+ regs_buff [10 ] = rd32 (XSCT_SHSTSAL );
220
+ regs_buff [11 ] = rd32 (XSCT_SHSTSAH );
221
+
222
+ regs_buff [13 ] = rd32 (XSCT_REQBL );
223
+ regs_buff [14 ] = rd32 (XSCT_REQBAL );
224
+ regs_buff [15 ] = rd32 (XSCT_REQBAH );
225
+
226
+ regs_buff [17 ] = rd32 (XSCT_RESPBL );
227
+ regs_buff [18 ] = rd32 (XSCT_RESPBAL );
228
+ regs_buff [19 ] = rd32 (XSCT_RESPBAH );
229
+
230
+ /* Interrupt Control registers */
231
+ regs_buff [32 ] = rd32 (XSCT_IS );
232
+ regs_buff [33 ] = rd32 (XSCT_IMS );
233
+ regs_buff [34 ] = rd32 (XSCT_IMC );
234
+ regs_buff [35 ] = rd32 (XSCT_IG );
235
+ regs_buff [36 ] = rd32 (XSCT_ICTL );
236
+ }
237
+
238
+ static int fjes_set_dump (struct net_device * netdev , struct ethtool_dump * dump )
239
+ {
240
+ struct fjes_adapter * adapter = netdev_priv (netdev );
241
+ struct fjes_hw * hw = & adapter -> hw ;
242
+ int ret = 0 ;
243
+
244
+ if (dump -> flag ) {
245
+ if (hw -> debug_mode )
246
+ return - EPERM ;
247
+
248
+ hw -> debug_mode = dump -> flag ;
249
+
250
+ /* enable debug mode */
251
+ mutex_lock (& hw -> hw_info .lock );
252
+ ret = fjes_hw_start_debug (hw );
253
+ mutex_unlock (& hw -> hw_info .lock );
254
+
255
+ if (ret )
256
+ hw -> debug_mode = 0 ;
257
+ } else {
258
+ if (!hw -> debug_mode )
259
+ return - EPERM ;
260
+
261
+ /* disable debug mode */
262
+ mutex_lock (& hw -> hw_info .lock );
263
+ ret = fjes_hw_stop_debug (hw );
264
+ mutex_unlock (& hw -> hw_info .lock );
265
+ }
266
+
267
+ return ret ;
268
+ }
269
+
270
+ static int fjes_get_dump_flag (struct net_device * netdev ,
271
+ struct ethtool_dump * dump )
272
+ {
273
+ struct fjes_adapter * adapter = netdev_priv (netdev );
274
+ struct fjes_hw * hw = & adapter -> hw ;
275
+
276
+ dump -> len = hw -> hw_info .trace_size ;
277
+ dump -> version = 1 ;
278
+ dump -> flag = hw -> debug_mode ;
279
+
280
+ return 0 ;
281
+ }
282
+
283
+ static int fjes_get_dump_data (struct net_device * netdev ,
284
+ struct ethtool_dump * dump , void * buf )
285
+ {
286
+ struct fjes_adapter * adapter = netdev_priv (netdev );
287
+ struct fjes_hw * hw = & adapter -> hw ;
288
+ int ret = 0 ;
289
+
290
+ if (hw -> hw_info .trace )
291
+ memcpy (buf , hw -> hw_info .trace , hw -> hw_info .trace_size );
292
+ else
293
+ ret = - EPERM ;
294
+
295
+ return ret ;
296
+ }
297
+
124
298
static const struct ethtool_ops fjes_ethtool_ops = {
125
299
.get_settings = fjes_get_settings ,
126
300
.get_drvinfo = fjes_get_drvinfo ,
127
301
.get_ethtool_stats = fjes_get_ethtool_stats ,
128
302
.get_strings = fjes_get_strings ,
129
303
.get_sset_count = fjes_get_sset_count ,
304
+ .get_regs = fjes_get_regs ,
305
+ .get_regs_len = fjes_get_regs_len ,
306
+ .set_dump = fjes_set_dump ,
307
+ .get_dump_flag = fjes_get_dump_flag ,
308
+ .get_dump_data = fjes_get_dump_data ,
130
309
};
131
310
132
311
void fjes_set_ethtool_ops (struct net_device * netdev )
0 commit comments