From e7c802761fa5a633fa44ba01f6767e218fad5516 Mon Sep 17 00:00:00 2001
From: Pavel Cheblakov
Date: Thu, 23 Sep 2010 19:55:15 +0700
Subject: [PATCH] added udev support
- Added udev rule (placed in udev/). It allows to set group
and permissions of all lsi6-devices in /dev
- Added handling error of get_device_no function
- Removed unnecessary scripts
- Modifed documentation
---
README | 4 ++++
doc/readme_pci.koi8 | 56 +++++++++++++++++++++++++++++----------------
lsi6_main.c | 52 ++++++++++++++++++++++++++---------------
makedevices | 25 --------------------
reload | 6 -----
udev/91-lsi6.rules | 2 +-
6 files changed, 75 insertions(+), 70 deletions(-)
create mode 100644 README
delete mode 100755 makedevices
delete mode 100755 reload
diff --git a/README b/README
new file mode 100644
index 0000000..de5dae9
--- /dev/null
+++ b/README
@@ -0,0 +1,4 @@
+lsi6 - line serial interface for CAMAC
+--------------------------------------
+
+See documentation in doc/readme_pci.koi8
\ No newline at end of file
diff --git a/doc/readme_pci.koi8 b/doc/readme_pci.koi8
index 9610465..1955cf9 100644
--- a/doc/readme_pci.koi8
+++ b/doc/readme_pci.koi8
@@ -5,35 +5,43 @@
��������� ���������� ���������� ������ 1.4 �� 24.12.2001
������������ � �������� ������� camt ������ ��.
-2. ��������� ������.
+2. ��������� ��������.
-2.1. ����� ���������� ������ ���������� ����������� ��������� ����
-Linux � ���������, ��� ���� ������������� �� ������ ������.
-��� ���������� ������ ����� �������������� ������������ ����� ����
-� ������� modpost (��� ���� 2.6.x)
-
-2.2. ��� Linux 2.6.x � Makefile ���������� ���� ��
-��������� ����, ��������,
-LINUX_KERNEL_PATH = /usr/src/linux-2.6.9
+2.1. ��� ������ �������� ���������� ����� ������������ �����
+��� ������� ������ ����. �� ���������, ������ ����� ������������
+��� �������� ����. � ��������� ������ ���� ���������� ����������
+KERNELDIR.
2.2.
-�������������� ������ � �������� �������:
-make
-make camt
+�������������� ������� � �������� �������:
+# make modules
+# make camt
+
+2.3.
+���������������� udev:
+� �������� udev/ ��������� ������� 91-lsi6.rules
+��� ���������� ����������� � ������� � ��������� udev
+(��� �������, /etc/udev/rules.d) � ����������� ��������������
+GROUP � MODE � ����������� �� ����, ����� ������ ����� ������������
+���������� lsi6 � ����� ����� ������� ����� �����
+
+��� ����, ��� �� ������ ������� "���������" ����� ��������������
+��������:
+# udevtrigger
-����������������:
-make install
+2.4.
-������� ����� ���������:
-make devices
+���������������� �������:
+# make modules_install
��������� ������:
-insmod lsi6.o
+modprobe lsi6
��� ���������� - ����� ���������� � �������� �����-������
����������� ������������� bios-��.
���� � ������� ��������� ����, ��� �������������
����� �������.
-(���������� - � ���� 2.6.x ������ ����� ���������� .ko)
+
+��� �������� ������� ������� ����������� udev-�� �������������.
3. �������������.
���� ���������� /dev/lsi6cardNchannelM
@@ -47,7 +55,7 @@ insmod lsi6.o
X � Q � ��������������� ����, �.�. ���� � ������� ���
X=1, ��� �������� ���������� ������� X.
-5. ������������ � ������ Linux
+5. ������������ � ������ Linux (�� 1.06)
2.2.0,
2.2.25
2.4.0
@@ -56,5 +64,13 @@ insmod lsi6.o
2.6.0
2.6.9
-�.�.������, ���. 39-42-84
+��� ������ 1.06.x
+2.6.18
+2.6.33 (����������� ������ ������)
+
+�.�.������, ���. 329-42-84
V.R.Mamkin@inp.nsk.su
+
+�.�.�������� (��������� ����� ������ 1.05),
+���. 329-42-25
+P.B.Cheblakov@inp.nsk.su
diff --git a/lsi6_main.c b/lsi6_main.c
index e0e5f23..f4abd3e 100644
--- a/lsi6_main.c
+++ b/lsi6_main.c
@@ -21,11 +21,6 @@
#include "lsi6camac.h"
#include "lsi6_lib.h"
-/*
-extern void *kmalloc(size_t, int);
-extern void kfree(const void *);
-*/
-
#undef DEBUG
#ifdef DEBUG
@@ -35,8 +30,8 @@ extern void kfree(const void *);
#endif
#define DRV_NAME "lsi6"
-#define DRV_VERSION "1.06"
-#define DRV_RELDATE "16 Sep. 2010"
+#define DRV_VERSION "1.06.1"
+#define DRV_RELDATE "23 Sep. 2010"
#define DRV_AUTHOR "V.Mamkin, P.Cheblakov"
MODULE_AUTHOR(DRV_AUTHOR);
@@ -70,7 +65,7 @@ static int get_device_no(int major)
if (lsi6_dev[i].major == major)
return i;
- return -1; //TODO fix it. it's very dangerous
+ return -1;
}
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19)
@@ -109,12 +104,18 @@ static irqreturn_t lsi6_interrupt(int irq, void *dev_id, struct pt_regs *unused)
}
static int lsi6_open(struct inode * inode, struct file * file)
{
- unsigned int chnum = MINOR(inode->i_rdev);
- unsigned int card = get_device_no(MAJOR(inode->i_rdev));
- lsi6_dev_t *lsi = &lsi6_dev[card];
- lsi6_regs_t *regs = (lsi6_regs_t *)lsi->base;
unsigned long flags;
int csr;
+ unsigned int chnum = MINOR(inode->i_rdev);
+ unsigned int card = get_device_no(MAJOR(inode->i_rdev));
+ lsi6_dev_t *lsi;
+ lsi6_regs_t *regs;
+
+ if (card < 0)
+ return -ENXIO;
+
+ lsi = &lsi6_dev[card];
+ regs = (lsi6_regs_t *)lsi->base;
DP(printk(DRV_NAME ": open channel %d\n", chnum));
@@ -137,14 +138,19 @@ static int lsi6_ioctl(struct inode *inode, struct file *file,
unsigned int cmd, unsigned long arg)
{
int chnum = MINOR(inode->i_rdev);
- unsigned int card = get_device_no(MAJOR(inode->i_rdev));
- lsi6_dev_t *lsi = &lsi6_dev[card];
unsigned long * ptr = (unsigned long * ) arg;
unsigned long x;
int n,a,f, rc;
unsigned long flags;
unsigned long volatile jiffies_start, jiffies_end;
int jiffies_left;
+ unsigned int card = get_device_no(MAJOR(inode->i_rdev));
+ lsi6_dev_t *lsi;
+
+ if (card < 0)
+ return -ENXIO;
+
+ lsi = &lsi6_dev[card];
n = N_NAF(cmd);
a = A_NAF(cmd);
@@ -287,12 +293,17 @@ static ssize_t lsi6_read(struct file * file, char * buf,
size_t count, loff_t *ppos)
{
unsigned int chnum=MINOR(file->f_dentry->d_inode->i_rdev);
- unsigned int card = get_device_no(MAJOR(file->f_dentry->d_inode->i_rdev));
- lsi6_dev_t *lsi = &lsi6_dev[card];
int naf = *ppos;
int n,a,f, rc;
unsigned long x;
unsigned long flags;
+ unsigned int card = get_device_no(MAJOR(file->f_dentry->d_inode->i_rdev));
+ lsi6_dev_t *lsi;
+
+ if (card < 0)
+ return -ENXIO;
+
+ lsi = &lsi6_dev[card];
n = N_NAF(naf);
a = A_NAF(naf);
@@ -347,12 +358,17 @@ static ssize_t lsi6_write(struct file * file, const char * buf,
size_t count, loff_t *ppos)
{
unsigned int chnum=MINOR(file->f_dentry->d_inode->i_rdev);
- unsigned int card = get_device_no(MAJOR(file->f_dentry->d_inode->i_rdev));
- lsi6_dev_t *lsi = &lsi6_dev[card];
int naf = *ppos;
int n,a,f, rc;
unsigned long x;
unsigned long flags;
+ unsigned int card = get_device_no(MAJOR(file->f_dentry->d_inode->i_rdev));
+ lsi6_dev_t *lsi;
+
+ if (card < 0)
+ return -ENXIO;
+
+ lsi = &lsi6_dev[card];
n = N_NAF(naf);
a = A_NAF(naf);
diff --git a/makedevices b/makedevices
deleted file mode 100755
index 76e42f6..0000000
--- a/makedevices
+++ /dev/null
@@ -1,25 +0,0 @@
-#!/bin/sh
-
-number_cards=1
-number_channels=6
-
-# ----------------------------------------------------------
-
-cardnum=0
-
-while true; do
- chnum=0
- while true; do
-
- mknod -m 0666 /dev/lsi6card$(($cardnum+1))channel$(($chnum+1)) c $((122+$cardnum)) $chnum
-
- chnum=$(($chnum+1))
- if test "$chnum" == "$number_channels"; then
- break;
- fi
- done
- cardnum=$(($cardnum+1))
- if test "$cardnum" == "$number_cards"; then
- break;
- fi
-done
diff --git a/reload b/reload
deleted file mode 100755
index 175044b..0000000
--- a/reload
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-make clean
-make
-rmmod lsi6
-insmod lsi6.o
diff --git a/udev/91-lsi6.rules b/udev/91-lsi6.rules
index c6febc3..8a945bd 100644
--- a/udev/91-lsi6.rules
+++ b/udev/91-lsi6.rules
@@ -1 +1 @@
-SUBSYSTEM=="pci", SYSFS{device}=="0x3333", SYSFS{vendor}=="0x1172", PROGRAM="/root/ttt.pl %M %m"
\ No newline at end of file
+KERNEL=="lsi6*", GROUP="root", MODE="0660"
\ No newline at end of file