#include <linux/fs.h>
#include <linux/wrapper.h>
#include <linux/sched.h>
+#include <linux/poll.h>
#include <linux/version.h>
#include <linux/autoconf.h>
+#include <linux/interrupt.h>
-#if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,2,19))
+#if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,3,0))
#include <asm/spinlock.h>
#else
#include <linux/spinlock.h>
#if !defined (__GENKSYMS__)
#if (defined (MODVERSIONS) && !defined(NOVER))
#include <linux/modversions.h>
-#include "../include/main.ver"
+/*#include "../include/main.ver"*/
#endif
#endif
+#ifdef CONFIG_DEVFS_FS
+#include <linux/miscdevice.h>
+#endif
+
#include "../include/main.h"
#include "../include/modparms.h"
#include "../include/setup.h"
#include "../include/open.h"
#include "../include/close.h"
#include "../include/read.h"
+#include "../include/select.h"
#include "../include/irq.h"
#include "../include/ioctl.h"
#include "../include/write.h"
int major=CAN_MAJOR;
MODULE_PARM(major,"1i");
int minor[MAX_TOT_CHIPS]={-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};
-MODULE_PARM(minor, "1-" __MODULE_STRING(MAX_TOT_CHIPS)"i");
+/*MODULE_PARM(minor, "1-" __MODULE_STRING(MAX_TOT_CHIPS)"i");*/
+MODULE_PARM(minor, "1-" __MODULE_STRING(MAX_TOT_CHIPS_STR)"i");
int extended=0;
MODULE_PARM(extended,"1i");
int pelican=0;
int mo15mask=0;
MODULE_PARM(mo15mask, "1i");
+/* Other module attributes */
+#ifdef MODULE_SUPPORTED_DEVICE
+MODULE_SUPPORTED_DEVICE("can");
+#endif
+#ifdef MODULE_LICENSE
+MODULE_LICENSE("GPL");
+#endif
+#ifdef MODULE_DESCRIPTION
+MODULE_DESCRIPTION("Universal Linux CAN-bus device driver");
+#endif
+
/* Global structures, used to describe the installed hardware. */
struct canhardware_t canhardware;
struct canhardware_t *hardware_p=&canhardware;
struct candevice_t *candevices_p[MAX_HW_CARDS];
struct chip_t *chips_p[MAX_TOT_CHIPS];
struct msgobj_t *objects_p[MAX_TOT_MSGOBJS];
+#ifdef CONFIG_DEVFS_FS
+devfs_handle_t devfs_handles[MAX_TOT_MSGOBJS];
+#endif
/* Pointers to dynamically allocated memory are maintained in a linked list
* to ease memory deallocation.
*/
struct mem_addr *mem_head=NULL;
-#if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,2,19))
+#if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,3,0))
struct file_operations can_fops=
{
NULL, /* llseek */
read: can_read,
write: can_write,
NULL, /* readdir */
- NULL, /* poll */
+ poll: can_poll,
ioctl: can_ioctl,
NULL, /* mmap */
open: can_open,
owner: THIS_MODULE,
read: can_read,
write: can_write,
+ poll: can_poll,
ioctl: can_ioctl,
open: can_open,
release: can_close,
goto reset_error;
}
+ spin_lock_init(&hardware_p->rtr_lock);
+ hardware_p->rtr_queue=NULL;
+
i=0;
while ( (chips_p[i] != NULL) && (i < MAX_TOT_CHIPS) ) {
if (!strcmp(chips_p[i]->chip_type,"i82527")) {
goto interrupt_error;
}
- spin_lock_init(&hardware_p->rtr_lock);
- hardware_p->rtr_queue=NULL;
-
#ifdef CONFIG_PROC_FS
if (can_init_procdir())
goto proc_error;
#endif
+#ifdef CONFIG_DEVFS_FS
+ {
+ char dev_name[32];
+ int dev_minor;
+ for(i=0;i<MAX_TOT_MSGOBJS;i++) {
+ if(!objects_p[i]) continue;
+ dev_minor=objects_p[i]->minor;
+ sprintf (dev_name, "can%d", dev_minor);
+ devfs_handles[i]=devfs_register(NULL, dev_name,
+ DEVFS_FL_DEFAULT, major, dev_minor,
+ S_IFCHR | S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP,
+ &can_fops, (void*)objects_p[i]);
+ }
+ }
+#endif
return 0;
#ifdef CONFIG_PROC_FS
CANMSG("Error unregistering /proc/can entry.\n");
#endif
+#ifdef CONFIG_DEVFS_FS
+ for(i=0;i<MAX_TOT_MSGOBJS;i++) {
+ if(devfs_handles[i])
+ devfs_unregister(devfs_handles[i]);
+ }
+#endif
+ i=0;
while ( (chips_p[i] != NULL) & (i < MAX_TOT_CHIPS) ) {
free_irq(chips_p[i]->chip_irq, chips_p[i]);
i++;