.. | .. |
---|
| 1 | +// SPDX-License-Identifier: (GPL-2.0 OR BSD-3-Clause) |
---|
1 | 2 | /* |
---|
2 | 3 | * proc.c - procfs support for Protocol family CAN core module |
---|
3 | 4 | * |
---|
.. | .. |
---|
44 | 45 | #include <linux/list.h> |
---|
45 | 46 | #include <linux/rcupdate.h> |
---|
46 | 47 | #include <linux/if_arp.h> |
---|
| 48 | +#include <linux/can/can-ml.h> |
---|
47 | 49 | #include <linux/can/core.h> |
---|
48 | 50 | |
---|
49 | 51 | #include "af_can.h" |
---|
.. | .. |
---|
52 | 54 | * proc filenames for the PF_CAN core |
---|
53 | 55 | */ |
---|
54 | 56 | |
---|
55 | | -#define CAN_PROC_VERSION "version" |
---|
56 | 57 | #define CAN_PROC_STATS "stats" |
---|
57 | 58 | #define CAN_PROC_RESET_STATS "reset_stats" |
---|
58 | 59 | #define CAN_PROC_RCVLIST_ALL "rcvlist_all" |
---|
.. | .. |
---|
77 | 78 | |
---|
78 | 79 | static void can_init_stats(struct net *net) |
---|
79 | 80 | { |
---|
80 | | - struct s_stats *can_stats = net->can.can_stats; |
---|
81 | | - struct s_pstats *can_pstats = net->can.can_pstats; |
---|
| 81 | + struct can_pkg_stats *pkg_stats = net->can.pkg_stats; |
---|
| 82 | + struct can_rcv_lists_stats *rcv_lists_stats = net->can.rcv_lists_stats; |
---|
82 | 83 | /* |
---|
83 | 84 | * This memset function is called from a timer context (when |
---|
84 | 85 | * can_stattimer is active which is the default) OR in a process |
---|
85 | 86 | * context (reading the proc_fs when can_stattimer is disabled). |
---|
86 | 87 | */ |
---|
87 | | - memset(can_stats, 0, sizeof(struct s_stats)); |
---|
88 | | - can_stats->jiffies_init = jiffies; |
---|
| 88 | + memset(pkg_stats, 0, sizeof(struct can_pkg_stats)); |
---|
| 89 | + pkg_stats->jiffies_init = jiffies; |
---|
89 | 90 | |
---|
90 | | - can_pstats->stats_reset++; |
---|
| 91 | + rcv_lists_stats->stats_reset++; |
---|
91 | 92 | |
---|
92 | 93 | if (user_reset) { |
---|
93 | 94 | user_reset = 0; |
---|
94 | | - can_pstats->user_reset++; |
---|
| 95 | + rcv_lists_stats->user_reset++; |
---|
95 | 96 | } |
---|
96 | 97 | } |
---|
97 | 98 | |
---|
.. | .. |
---|
117 | 118 | |
---|
118 | 119 | void can_stat_update(struct timer_list *t) |
---|
119 | 120 | { |
---|
120 | | - struct net *net = from_timer(net, t, can.can_stattimer); |
---|
121 | | - struct s_stats *can_stats = net->can.can_stats; |
---|
| 121 | + struct net *net = from_timer(net, t, can.stattimer); |
---|
| 122 | + struct can_pkg_stats *pkg_stats = net->can.pkg_stats; |
---|
122 | 123 | unsigned long j = jiffies; /* snapshot */ |
---|
123 | 124 | |
---|
124 | 125 | /* restart counting in timer context on user request */ |
---|
.. | .. |
---|
126 | 127 | can_init_stats(net); |
---|
127 | 128 | |
---|
128 | 129 | /* restart counting on jiffies overflow */ |
---|
129 | | - if (j < can_stats->jiffies_init) |
---|
| 130 | + if (j < pkg_stats->jiffies_init) |
---|
130 | 131 | can_init_stats(net); |
---|
131 | 132 | |
---|
132 | 133 | /* prevent overflow in calc_rate() */ |
---|
133 | | - if (can_stats->rx_frames > (ULONG_MAX / HZ)) |
---|
| 134 | + if (pkg_stats->rx_frames > (ULONG_MAX / HZ)) |
---|
134 | 135 | can_init_stats(net); |
---|
135 | 136 | |
---|
136 | 137 | /* prevent overflow in calc_rate() */ |
---|
137 | | - if (can_stats->tx_frames > (ULONG_MAX / HZ)) |
---|
| 138 | + if (pkg_stats->tx_frames > (ULONG_MAX / HZ)) |
---|
138 | 139 | can_init_stats(net); |
---|
139 | 140 | |
---|
140 | 141 | /* matches overflow - very improbable */ |
---|
141 | | - if (can_stats->matches > (ULONG_MAX / 100)) |
---|
| 142 | + if (pkg_stats->matches > (ULONG_MAX / 100)) |
---|
142 | 143 | can_init_stats(net); |
---|
143 | 144 | |
---|
144 | 145 | /* calc total values */ |
---|
145 | | - if (can_stats->rx_frames) |
---|
146 | | - can_stats->total_rx_match_ratio = (can_stats->matches * 100) / |
---|
147 | | - can_stats->rx_frames; |
---|
| 146 | + if (pkg_stats->rx_frames) |
---|
| 147 | + pkg_stats->total_rx_match_ratio = (pkg_stats->matches * 100) / |
---|
| 148 | + pkg_stats->rx_frames; |
---|
148 | 149 | |
---|
149 | | - can_stats->total_tx_rate = calc_rate(can_stats->jiffies_init, j, |
---|
150 | | - can_stats->tx_frames); |
---|
151 | | - can_stats->total_rx_rate = calc_rate(can_stats->jiffies_init, j, |
---|
152 | | - can_stats->rx_frames); |
---|
| 150 | + pkg_stats->total_tx_rate = calc_rate(pkg_stats->jiffies_init, j, |
---|
| 151 | + pkg_stats->tx_frames); |
---|
| 152 | + pkg_stats->total_rx_rate = calc_rate(pkg_stats->jiffies_init, j, |
---|
| 153 | + pkg_stats->rx_frames); |
---|
153 | 154 | |
---|
154 | 155 | /* calc current values */ |
---|
155 | | - if (can_stats->rx_frames_delta) |
---|
156 | | - can_stats->current_rx_match_ratio = |
---|
157 | | - (can_stats->matches_delta * 100) / |
---|
158 | | - can_stats->rx_frames_delta; |
---|
| 156 | + if (pkg_stats->rx_frames_delta) |
---|
| 157 | + pkg_stats->current_rx_match_ratio = |
---|
| 158 | + (pkg_stats->matches_delta * 100) / |
---|
| 159 | + pkg_stats->rx_frames_delta; |
---|
159 | 160 | |
---|
160 | | - can_stats->current_tx_rate = calc_rate(0, HZ, can_stats->tx_frames_delta); |
---|
161 | | - can_stats->current_rx_rate = calc_rate(0, HZ, can_stats->rx_frames_delta); |
---|
| 161 | + pkg_stats->current_tx_rate = calc_rate(0, HZ, pkg_stats->tx_frames_delta); |
---|
| 162 | + pkg_stats->current_rx_rate = calc_rate(0, HZ, pkg_stats->rx_frames_delta); |
---|
162 | 163 | |
---|
163 | 164 | /* check / update maximum values */ |
---|
164 | | - if (can_stats->max_tx_rate < can_stats->current_tx_rate) |
---|
165 | | - can_stats->max_tx_rate = can_stats->current_tx_rate; |
---|
| 165 | + if (pkg_stats->max_tx_rate < pkg_stats->current_tx_rate) |
---|
| 166 | + pkg_stats->max_tx_rate = pkg_stats->current_tx_rate; |
---|
166 | 167 | |
---|
167 | | - if (can_stats->max_rx_rate < can_stats->current_rx_rate) |
---|
168 | | - can_stats->max_rx_rate = can_stats->current_rx_rate; |
---|
| 168 | + if (pkg_stats->max_rx_rate < pkg_stats->current_rx_rate) |
---|
| 169 | + pkg_stats->max_rx_rate = pkg_stats->current_rx_rate; |
---|
169 | 170 | |
---|
170 | | - if (can_stats->max_rx_match_ratio < can_stats->current_rx_match_ratio) |
---|
171 | | - can_stats->max_rx_match_ratio = can_stats->current_rx_match_ratio; |
---|
| 171 | + if (pkg_stats->max_rx_match_ratio < pkg_stats->current_rx_match_ratio) |
---|
| 172 | + pkg_stats->max_rx_match_ratio = pkg_stats->current_rx_match_ratio; |
---|
172 | 173 | |
---|
173 | 174 | /* clear values for 'current rate' calculation */ |
---|
174 | | - can_stats->tx_frames_delta = 0; |
---|
175 | | - can_stats->rx_frames_delta = 0; |
---|
176 | | - can_stats->matches_delta = 0; |
---|
| 175 | + pkg_stats->tx_frames_delta = 0; |
---|
| 176 | + pkg_stats->rx_frames_delta = 0; |
---|
| 177 | + pkg_stats->matches_delta = 0; |
---|
177 | 178 | |
---|
178 | 179 | /* restart timer (one second) */ |
---|
179 | | - mod_timer(&net->can.can_stattimer, round_jiffies(jiffies + HZ)); |
---|
| 180 | + mod_timer(&net->can.stattimer, round_jiffies(jiffies + HZ)); |
---|
180 | 181 | } |
---|
181 | 182 | |
---|
182 | 183 | /* |
---|
.. | .. |
---|
211 | 212 | static int can_stats_proc_show(struct seq_file *m, void *v) |
---|
212 | 213 | { |
---|
213 | 214 | struct net *net = m->private; |
---|
214 | | - struct s_stats *can_stats = net->can.can_stats; |
---|
215 | | - struct s_pstats *can_pstats = net->can.can_pstats; |
---|
| 215 | + struct can_pkg_stats *pkg_stats = net->can.pkg_stats; |
---|
| 216 | + struct can_rcv_lists_stats *rcv_lists_stats = net->can.rcv_lists_stats; |
---|
216 | 217 | |
---|
217 | 218 | seq_putc(m, '\n'); |
---|
218 | | - seq_printf(m, " %8ld transmitted frames (TXF)\n", can_stats->tx_frames); |
---|
219 | | - seq_printf(m, " %8ld received frames (RXF)\n", can_stats->rx_frames); |
---|
220 | | - seq_printf(m, " %8ld matched frames (RXMF)\n", can_stats->matches); |
---|
| 219 | + seq_printf(m, " %8ld transmitted frames (TXF)\n", pkg_stats->tx_frames); |
---|
| 220 | + seq_printf(m, " %8ld received frames (RXF)\n", pkg_stats->rx_frames); |
---|
| 221 | + seq_printf(m, " %8ld matched frames (RXMF)\n", pkg_stats->matches); |
---|
221 | 222 | |
---|
222 | 223 | seq_putc(m, '\n'); |
---|
223 | 224 | |
---|
224 | | - if (net->can.can_stattimer.function == can_stat_update) { |
---|
| 225 | + if (net->can.stattimer.function == can_stat_update) { |
---|
225 | 226 | seq_printf(m, " %8ld %% total match ratio (RXMR)\n", |
---|
226 | | - can_stats->total_rx_match_ratio); |
---|
| 227 | + pkg_stats->total_rx_match_ratio); |
---|
227 | 228 | |
---|
228 | 229 | seq_printf(m, " %8ld frames/s total tx rate (TXR)\n", |
---|
229 | | - can_stats->total_tx_rate); |
---|
| 230 | + pkg_stats->total_tx_rate); |
---|
230 | 231 | seq_printf(m, " %8ld frames/s total rx rate (RXR)\n", |
---|
231 | | - can_stats->total_rx_rate); |
---|
| 232 | + pkg_stats->total_rx_rate); |
---|
232 | 233 | |
---|
233 | 234 | seq_putc(m, '\n'); |
---|
234 | 235 | |
---|
235 | 236 | seq_printf(m, " %8ld %% current match ratio (CRXMR)\n", |
---|
236 | | - can_stats->current_rx_match_ratio); |
---|
| 237 | + pkg_stats->current_rx_match_ratio); |
---|
237 | 238 | |
---|
238 | 239 | seq_printf(m, " %8ld frames/s current tx rate (CTXR)\n", |
---|
239 | | - can_stats->current_tx_rate); |
---|
| 240 | + pkg_stats->current_tx_rate); |
---|
240 | 241 | seq_printf(m, " %8ld frames/s current rx rate (CRXR)\n", |
---|
241 | | - can_stats->current_rx_rate); |
---|
| 242 | + pkg_stats->current_rx_rate); |
---|
242 | 243 | |
---|
243 | 244 | seq_putc(m, '\n'); |
---|
244 | 245 | |
---|
245 | 246 | seq_printf(m, " %8ld %% max match ratio (MRXMR)\n", |
---|
246 | | - can_stats->max_rx_match_ratio); |
---|
| 247 | + pkg_stats->max_rx_match_ratio); |
---|
247 | 248 | |
---|
248 | 249 | seq_printf(m, " %8ld frames/s max tx rate (MTXR)\n", |
---|
249 | | - can_stats->max_tx_rate); |
---|
| 250 | + pkg_stats->max_tx_rate); |
---|
250 | 251 | seq_printf(m, " %8ld frames/s max rx rate (MRXR)\n", |
---|
251 | | - can_stats->max_rx_rate); |
---|
| 252 | + pkg_stats->max_rx_rate); |
---|
252 | 253 | |
---|
253 | 254 | seq_putc(m, '\n'); |
---|
254 | 255 | } |
---|
255 | 256 | |
---|
256 | 257 | seq_printf(m, " %8ld current receive list entries (CRCV)\n", |
---|
257 | | - can_pstats->rcv_entries); |
---|
| 258 | + rcv_lists_stats->rcv_entries); |
---|
258 | 259 | seq_printf(m, " %8ld maximum receive list entries (MRCV)\n", |
---|
259 | | - can_pstats->rcv_entries_max); |
---|
| 260 | + rcv_lists_stats->rcv_entries_max); |
---|
260 | 261 | |
---|
261 | | - if (can_pstats->stats_reset) |
---|
| 262 | + if (rcv_lists_stats->stats_reset) |
---|
262 | 263 | seq_printf(m, "\n %8ld statistic resets (STR)\n", |
---|
263 | | - can_pstats->stats_reset); |
---|
| 264 | + rcv_lists_stats->stats_reset); |
---|
264 | 265 | |
---|
265 | | - if (can_pstats->user_reset) |
---|
| 266 | + if (rcv_lists_stats->user_reset) |
---|
266 | 267 | seq_printf(m, " %8ld user statistic resets (USTR)\n", |
---|
267 | | - can_pstats->user_reset); |
---|
| 268 | + rcv_lists_stats->user_reset); |
---|
268 | 269 | |
---|
269 | 270 | seq_putc(m, '\n'); |
---|
270 | 271 | return 0; |
---|
.. | .. |
---|
273 | 274 | static int can_reset_stats_proc_show(struct seq_file *m, void *v) |
---|
274 | 275 | { |
---|
275 | 276 | struct net *net = m->private; |
---|
276 | | - struct s_pstats *can_pstats = net->can.can_pstats; |
---|
277 | | - struct s_stats *can_stats = net->can.can_stats; |
---|
| 277 | + struct can_rcv_lists_stats *rcv_lists_stats = net->can.rcv_lists_stats; |
---|
| 278 | + struct can_pkg_stats *pkg_stats = net->can.pkg_stats; |
---|
278 | 279 | |
---|
279 | 280 | user_reset = 1; |
---|
280 | 281 | |
---|
281 | | - if (net->can.can_stattimer.function == can_stat_update) { |
---|
| 282 | + if (net->can.stattimer.function == can_stat_update) { |
---|
282 | 283 | seq_printf(m, "Scheduled statistic reset #%ld.\n", |
---|
283 | | - can_pstats->stats_reset + 1); |
---|
| 284 | + rcv_lists_stats->stats_reset + 1); |
---|
284 | 285 | } else { |
---|
285 | | - if (can_stats->jiffies_init != jiffies) |
---|
| 286 | + if (pkg_stats->jiffies_init != jiffies) |
---|
286 | 287 | can_init_stats(net); |
---|
287 | 288 | |
---|
288 | 289 | seq_printf(m, "Performed statistic reset #%ld.\n", |
---|
289 | | - can_pstats->stats_reset); |
---|
| 290 | + rcv_lists_stats->stats_reset); |
---|
290 | 291 | } |
---|
291 | | - return 0; |
---|
292 | | -} |
---|
293 | | - |
---|
294 | | -static int can_version_proc_show(struct seq_file *m, void *v) |
---|
295 | | -{ |
---|
296 | | - seq_printf(m, "%s\n", CAN_VERSION_STRING); |
---|
297 | 292 | return 0; |
---|
298 | 293 | } |
---|
299 | 294 | |
---|
300 | 295 | static inline void can_rcvlist_proc_show_one(struct seq_file *m, int idx, |
---|
301 | 296 | struct net_device *dev, |
---|
302 | | - struct can_dev_rcv_lists *d) |
---|
| 297 | + struct can_dev_rcv_lists *dev_rcv_lists) |
---|
303 | 298 | { |
---|
304 | | - if (!hlist_empty(&d->rx[idx])) { |
---|
| 299 | + if (!hlist_empty(&dev_rcv_lists->rx[idx])) { |
---|
305 | 300 | can_print_recv_banner(m); |
---|
306 | | - can_print_rcvlist(m, &d->rx[idx], dev); |
---|
| 301 | + can_print_rcvlist(m, &dev_rcv_lists->rx[idx], dev); |
---|
307 | 302 | } else |
---|
308 | 303 | seq_printf(m, " (%s: no entry)\n", DNAME(dev)); |
---|
309 | 304 | |
---|
.. | .. |
---|
314 | 309 | /* double cast to prevent GCC warning */ |
---|
315 | 310 | int idx = (int)(long)PDE_DATA(m->file->f_inode); |
---|
316 | 311 | struct net_device *dev; |
---|
317 | | - struct can_dev_rcv_lists *d; |
---|
| 312 | + struct can_dev_rcv_lists *dev_rcv_lists; |
---|
318 | 313 | struct net *net = m->private; |
---|
319 | 314 | |
---|
320 | 315 | seq_printf(m, "\nreceive list '%s':\n", rx_list_name[idx]); |
---|
.. | .. |
---|
322 | 317 | rcu_read_lock(); |
---|
323 | 318 | |
---|
324 | 319 | /* receive list for 'all' CAN devices (dev == NULL) */ |
---|
325 | | - d = net->can.can_rx_alldev_list; |
---|
326 | | - can_rcvlist_proc_show_one(m, idx, NULL, d); |
---|
| 320 | + dev_rcv_lists = net->can.rx_alldev_list; |
---|
| 321 | + can_rcvlist_proc_show_one(m, idx, NULL, dev_rcv_lists); |
---|
327 | 322 | |
---|
328 | 323 | /* receive list for registered CAN devices */ |
---|
329 | 324 | for_each_netdev_rcu(net, dev) { |
---|
330 | | - if (dev->type == ARPHRD_CAN && dev->ml_priv) |
---|
331 | | - can_rcvlist_proc_show_one(m, idx, dev, dev->ml_priv); |
---|
| 325 | + struct can_ml_priv *can_ml = can_get_ml_priv(dev); |
---|
| 326 | + |
---|
| 327 | + if (can_ml) |
---|
| 328 | + can_rcvlist_proc_show_one(m, idx, dev, |
---|
| 329 | + &can_ml->dev_rcv_lists); |
---|
332 | 330 | } |
---|
333 | 331 | |
---|
334 | 332 | rcu_read_unlock(); |
---|
.. | .. |
---|
365 | 363 | static int can_rcvlist_sff_proc_show(struct seq_file *m, void *v) |
---|
366 | 364 | { |
---|
367 | 365 | struct net_device *dev; |
---|
368 | | - struct can_dev_rcv_lists *d; |
---|
| 366 | + struct can_dev_rcv_lists *dev_rcv_lists; |
---|
369 | 367 | struct net *net = m->private; |
---|
370 | 368 | |
---|
371 | 369 | /* RX_SFF */ |
---|
.. | .. |
---|
374 | 372 | rcu_read_lock(); |
---|
375 | 373 | |
---|
376 | 374 | /* sff receive list for 'all' CAN devices (dev == NULL) */ |
---|
377 | | - d = net->can.can_rx_alldev_list; |
---|
378 | | - can_rcvlist_proc_show_array(m, NULL, d->rx_sff, ARRAY_SIZE(d->rx_sff)); |
---|
| 375 | + dev_rcv_lists = net->can.rx_alldev_list; |
---|
| 376 | + can_rcvlist_proc_show_array(m, NULL, dev_rcv_lists->rx_sff, |
---|
| 377 | + ARRAY_SIZE(dev_rcv_lists->rx_sff)); |
---|
379 | 378 | |
---|
380 | 379 | /* sff receive list for registered CAN devices */ |
---|
381 | 380 | for_each_netdev_rcu(net, dev) { |
---|
382 | | - if (dev->type == ARPHRD_CAN && dev->ml_priv) { |
---|
383 | | - d = dev->ml_priv; |
---|
384 | | - can_rcvlist_proc_show_array(m, dev, d->rx_sff, |
---|
385 | | - ARRAY_SIZE(d->rx_sff)); |
---|
| 381 | + struct can_ml_priv *can_ml = can_get_ml_priv(dev); |
---|
| 382 | + |
---|
| 383 | + if (can_ml) { |
---|
| 384 | + dev_rcv_lists = &can_ml->dev_rcv_lists; |
---|
| 385 | + can_rcvlist_proc_show_array(m, dev, dev_rcv_lists->rx_sff, |
---|
| 386 | + ARRAY_SIZE(dev_rcv_lists->rx_sff)); |
---|
386 | 387 | } |
---|
387 | 388 | } |
---|
388 | 389 | |
---|
.. | .. |
---|
395 | 396 | static int can_rcvlist_eff_proc_show(struct seq_file *m, void *v) |
---|
396 | 397 | { |
---|
397 | 398 | struct net_device *dev; |
---|
398 | | - struct can_dev_rcv_lists *d; |
---|
| 399 | + struct can_dev_rcv_lists *dev_rcv_lists; |
---|
399 | 400 | struct net *net = m->private; |
---|
400 | 401 | |
---|
401 | 402 | /* RX_EFF */ |
---|
.. | .. |
---|
404 | 405 | rcu_read_lock(); |
---|
405 | 406 | |
---|
406 | 407 | /* eff receive list for 'all' CAN devices (dev == NULL) */ |
---|
407 | | - d = net->can.can_rx_alldev_list; |
---|
408 | | - can_rcvlist_proc_show_array(m, NULL, d->rx_eff, ARRAY_SIZE(d->rx_eff)); |
---|
| 408 | + dev_rcv_lists = net->can.rx_alldev_list; |
---|
| 409 | + can_rcvlist_proc_show_array(m, NULL, dev_rcv_lists->rx_eff, |
---|
| 410 | + ARRAY_SIZE(dev_rcv_lists->rx_eff)); |
---|
409 | 411 | |
---|
410 | 412 | /* eff receive list for registered CAN devices */ |
---|
411 | 413 | for_each_netdev_rcu(net, dev) { |
---|
412 | | - if (dev->type == ARPHRD_CAN && dev->ml_priv) { |
---|
413 | | - d = dev->ml_priv; |
---|
414 | | - can_rcvlist_proc_show_array(m, dev, d->rx_eff, |
---|
415 | | - ARRAY_SIZE(d->rx_eff)); |
---|
| 414 | + struct can_ml_priv *can_ml = can_get_ml_priv(dev); |
---|
| 415 | + |
---|
| 416 | + if (can_ml) { |
---|
| 417 | + dev_rcv_lists = &can_ml->dev_rcv_lists; |
---|
| 418 | + can_rcvlist_proc_show_array(m, dev, dev_rcv_lists->rx_eff, |
---|
| 419 | + ARRAY_SIZE(dev_rcv_lists->rx_eff)); |
---|
416 | 420 | } |
---|
417 | 421 | } |
---|
418 | 422 | |
---|
.. | .. |
---|
437 | 441 | } |
---|
438 | 442 | |
---|
439 | 443 | /* own procfs entries from the AF_CAN core */ |
---|
440 | | - net->can.pde_version = proc_create_net_single(CAN_PROC_VERSION, 0644, |
---|
441 | | - net->can.proc_dir, can_version_proc_show, NULL); |
---|
442 | 444 | net->can.pde_stats = proc_create_net_single(CAN_PROC_STATS, 0644, |
---|
443 | 445 | net->can.proc_dir, can_stats_proc_show, NULL); |
---|
444 | 446 | net->can.pde_reset_stats = proc_create_net_single(CAN_PROC_RESET_STATS, |
---|
.. | .. |
---|
469 | 471 | { |
---|
470 | 472 | if (!net->can.proc_dir) |
---|
471 | 473 | return; |
---|
472 | | - |
---|
473 | | - if (net->can.pde_version) |
---|
474 | | - remove_proc_entry(CAN_PROC_VERSION, net->can.proc_dir); |
---|
475 | 474 | |
---|
476 | 475 | if (net->can.pde_stats) |
---|
477 | 476 | remove_proc_entry(CAN_PROC_STATS, net->can.proc_dir); |
---|