+static int can_proc_remove(struct proc_dir_entry *del)
+{
+ if(!del) return -ENODEV;
+ remove_proc_entry(del->name, del->parent);
+ return 0;
+}
+
+static inline struct proc_dir_entry *can_proc_symlink(const char *name,
+ struct proc_dir_entry *parent, const char *dest)
+{
+ return proc_symlink(name, parent, dest);
+}
+
+#else /* Linux kernel 3.10+ */
+
+#include <linux/seq_file.h>
+
+static int can_status_proc_show(struct seq_file *m, void *v)
+{
+ seq_printf(m, "dummy CAN can_create_proc_read_entry implementation\n");
+ return 0;
+}
+
+static int can_status_proc_open(struct inode *inode, struct file *file)
+{
+ return single_open(file, can_status_proc_show, PDE_DATA(inode));
+}
+
+static const struct file_operations can_status_proc_fops = {
+ .owner = THIS_MODULE,
+ .open = can_status_proc_open,
+ .read = seq_read,
+ .llseek = seq_lseek,
+ .release = single_release,
+};
+
+struct proc_dir_entry *can_create_proc_read_entry(const char *name,
+ mode_t mode, struct proc_dir_entry *parent,
+ void *read_proc, void * data)
+{
+ /*return proc_read_entry(name, mode, parent, read_proc, data);*/
+ return proc_create_data(name, mode, parent, &can_status_proc_fops, data);
+}
+
+struct proc_dir_entry *can_proc_mkdir_mode(const char *name, umode_t mode,
+ struct proc_dir_entry *parent)
+{
+ return proc_mkdir_mode(name, mode, parent);
+}
+
+static int can_proc_remove(struct proc_dir_entry *del)