Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
linux
Commits
3e12a6dc
Commit
3e12a6dc
authored
May 18, 2002
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Plain Diff
Merge
http://linux-isdn.bkbits.net/linux-2.5.isdn
into home.transmeta.com:/home/torvalds/v2.5/linux
parents
a06ae2d9
dd7728a8
Changes
10
Hide whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
221 additions
and
427 deletions
+221
-427
drivers/isdn/capi/capi.c
drivers/isdn/capi/capi.c
+47
-90
drivers/isdn/capi/capidrv.c
drivers/isdn/capi/capidrv.c
+57
-88
drivers/isdn/capi/kcapi.c
drivers/isdn/capi/kcapi.c
+81
-198
drivers/isdn/hardware/avm/b1isa.c
drivers/isdn/hardware/avm/b1isa.c
+0
-3
drivers/isdn/hardware/avm/b1pci.c
drivers/isdn/hardware/avm/b1pci.c
+0
-3
drivers/isdn/hardware/avm/b1pcmcia.c
drivers/isdn/hardware/avm/b1pcmcia.c
+0
-3
drivers/isdn/hardware/avm/c4.c
drivers/isdn/hardware/avm/c4.c
+0
-3
drivers/isdn/hardware/avm/t1isa.c
drivers/isdn/hardware/avm/t1isa.c
+6
-7
drivers/isdn/hardware/avm/t1pci.c
drivers/isdn/hardware/avm/t1pci.c
+0
-3
include/linux/kernelcapi.h
include/linux/kernelcapi.h
+30
-29
No files found.
drivers/isdn/capi/capi.c
View file @
3e12a6dc
...
...
@@ -84,7 +84,7 @@ struct capiminor {
struct
capincci
*
nccip
;
unsigned
int
minor
;
u16
applid
;
struct
capi20_appl
*
ap
;
u32
ncci
;
u16
datahandle
;
u16
msgid
;
...
...
@@ -121,26 +121,18 @@ struct capincci {
struct
capidev
{
struct
list_head
list
;
u16
applid
;
struct
capi20_appl
ap
;
u16
errcode
;
unsigned
userflags
;
struct
sk_buff_head
recvqueue
;
wait_queue_head_t
recvwait
;
/* Statistic */
unsigned
long
nrecvctlpkt
;
unsigned
long
nrecvdatapkt
;
unsigned
long
nsentctlpkt
;
unsigned
long
nsentdatapkt
;
struct
capincci
*
nccis
;
};
/* -------- global variables ---------------------------------------- */
static
struct
capi_interface
*
capifuncs
;
static
rwlock_t
capidev_list_lock
=
RW_LOCK_UNLOCKED
;
static
LIST_HEAD
(
capidev_list
);
...
...
@@ -209,7 +201,7 @@ static void capiminor_del_all_ack(struct capiminor *mp)
/* -------- struct capiminor ---------------------------------------- */
static
struct
capiminor
*
capiminor_alloc
(
u16
applid
,
u32
ncci
)
static
struct
capiminor
*
capiminor_alloc
(
struct
capi20_appl
*
ap
,
u32
ncci
)
{
struct
capiminor
*
mp
,
*
p
;
struct
list_head
*
l
;
...
...
@@ -227,7 +219,7 @@ static struct capiminor *capiminor_alloc(u16 applid, u32 ncci)
printk
(
KERN_DEBUG
"capiminor_alloc %d
\n
"
,
GET_USE_COUNT
(
THIS_MODULE
));
#endif
memset
(
mp
,
0
,
sizeof
(
struct
capiminor
));
mp
->
ap
plid
=
applid
;
mp
->
ap
=
ap
;
mp
->
ncci
=
ncci
;
mp
->
msgid
=
0
;
atomic_set
(
&
mp
->
ttyopencount
,
0
);
...
...
@@ -311,7 +303,7 @@ static struct capincci *capincci_alloc(struct capidev *cdev, u32 ncci)
#ifdef CONFIG_ISDN_CAPI_MIDDLEWARE
mp
=
0
;
if
(
cdev
->
userflags
&
CAPIFLAG_HIGHJACKING
)
mp
=
np
->
minorp
=
capiminor_alloc
(
cdev
->
applid
,
ncci
);
mp
=
np
->
minorp
=
capiminor_alloc
(
&
cdev
->
ap
,
ncci
);
if
(
mp
)
{
mp
->
nccip
=
np
;
#ifdef _DEBUG_REFCOUNT
...
...
@@ -401,10 +393,10 @@ static void capidev_free(struct capidev *cdev)
{
unsigned
long
flags
;
if
(
cdev
->
ap
plid
)
(
*
capifuncs
->
capi_release
)
(
cdev
->
applid
);
cdev
->
applid
=
0
;
if
(
cdev
->
ap
.
applid
)
{
capi20_release
(
&
cdev
->
ap
);
cdev
->
ap
.
applid
=
0
;
}
skb_queue_purge
(
&
cdev
->
recvqueue
);
write_lock_irqsave
(
&
capidev_list_lock
,
flags
);
...
...
@@ -425,7 +417,7 @@ gen_data_b3_resp_for(struct capiminor *mp, struct sk_buff *skb)
u16
datahandle
=
CAPIMSG_U16
(
skb
->
data
,
CAPIMSG_BASELEN
+
4
+
4
+
2
);
unsigned
char
*
s
=
skb_put
(
nskb
,
CAPI_DATA_B3_RESP_LEN
);
capimsg_setu16
(
s
,
0
,
CAPI_DATA_B3_RESP_LEN
);
capimsg_setu16
(
s
,
2
,
mp
->
applid
);
capimsg_setu16
(
s
,
2
,
mp
->
ap
->
ap
plid
);
capimsg_setu8
(
s
,
4
,
CAPI_DATA_B3
);
capimsg_setu8
(
s
,
5
,
CAPI_RESP
);
capimsg_setu16
(
s
,
6
,
mp
->
msgid
++
);
...
...
@@ -465,7 +457,7 @@ static int handle_recv_skb(struct capiminor *mp, struct sk_buff *skb)
return
-
1
;
}
datahandle
=
CAPIMSG_U16
(
skb
->
data
,
CAPIMSG_BASELEN
+
4
);
errcode
=
(
*
capifuncs
->
capi_put_message
)(
mp
->
applid
,
nskb
);
errcode
=
capi20_put_message
(
mp
->
ap
,
nskb
);
if
(
errcode
!=
CAPI_NOERROR
)
{
printk
(
KERN_ERR
"capi: send DATA_B3_RESP failed=%x
\n
"
,
errcode
);
...
...
@@ -523,7 +515,7 @@ static int handle_minor_send(struct capiminor *mp)
skb_push
(
skb
,
CAPI_DATA_B3_REQ_LEN
);
memset
(
skb
->
data
,
0
,
CAPI_DATA_B3_REQ_LEN
);
capimsg_setu16
(
skb
->
data
,
0
,
CAPI_DATA_B3_REQ_LEN
);
capimsg_setu16
(
skb
->
data
,
2
,
mp
->
applid
);
capimsg_setu16
(
skb
->
data
,
2
,
mp
->
ap
->
ap
plid
);
capimsg_setu8
(
skb
->
data
,
4
,
CAPI_DATA_B3
);
capimsg_setu8
(
skb
->
data
,
5
,
CAPI_REQ
);
capimsg_setu16
(
skb
->
data
,
6
,
mp
->
msgid
++
);
...
...
@@ -538,7 +530,7 @@ static int handle_minor_send(struct capiminor *mp)
skb_queue_head
(
&
mp
->
outqueue
,
skb
);
return
count
;
}
errcode
=
(
*
capifuncs
->
capi_put_message
)
(
mp
->
applid
,
skb
);
errcode
=
capi20_put_message
(
mp
->
ap
,
skb
);
if
(
errcode
==
CAPI_NOERROR
)
{
mp
->
datahandle
++
;
count
++
;
...
...
@@ -568,25 +560,16 @@ static int handle_minor_send(struct capiminor *mp)
#endif
/* CONFIG_ISDN_CAPI_MIDDLEWARE */
/* -------- function called by lower level -------------------------- */
static
void
capi_
signal
(
u16
applid
,
void
*
param
)
static
void
capi_
recv_message
(
struct
capi20_appl
*
ap
,
struct
sk_buff
*
skb
)
{
struct
capidev
*
cdev
=
(
struct
capidev
*
)
param
;
struct
capidev
*
cdev
=
ap
->
private
;
#ifdef CONFIG_ISDN_CAPI_MIDDLEWARE
struct
capiminor
*
mp
;
u16
datahandle
;
#endif
/* CONFIG_ISDN_CAPI_MIDDLEWARE */
struct
capincci
*
np
;
struct
sk_buff
*
skb
=
0
;
u32
ncci
;
(
void
)
(
*
capifuncs
->
capi_get_message
)
(
applid
,
&
skb
);
if
(
!
skb
)
{
printk
(
KERN_ERR
"BUG: capi_signal: no skb
\n
"
);
return
;
}
BUG_ON
(
cdev
->
applid
!=
applid
);
if
(
CAPIMSG_COMMAND
(
skb
->
data
)
==
CAPI_CONNECT_B3_CONF
)
{
u16
info
=
CAPIMSG_U16
(
skb
->
data
,
12
);
// Info field
if
(
info
==
0
)
...
...
@@ -668,7 +651,7 @@ capi_read(struct file *file, char *buf, size_t count, loff_t *ppos)
if
(
ppos
!=
&
file
->
f_pos
)
return
-
ESPIPE
;
if
(
!
cdev
->
applid
)
if
(
!
cdev
->
ap
.
ap
plid
)
return
-
ENODEV
;
if
((
skb
=
skb_dequeue
(
&
cdev
->
recvqueue
))
==
0
)
{
...
...
@@ -697,12 +680,6 @@ capi_read(struct file *file, char *buf, size_t count, loff_t *ppos)
}
copied
=
skb
->
len
;
if
(
CAPIMSG_CMD
(
skb
->
data
)
==
CAPI_DATA_B3_IND
)
{
cdev
->
nrecvdatapkt
++
;
}
else
{
cdev
->
nrecvctlpkt
++
;
}
kfree_skb
(
skb
);
return
copied
;
...
...
@@ -719,7 +696,7 @@ capi_write(struct file *file, const char *buf, size_t count, loff_t *ppos)
if
(
ppos
!=
&
file
->
f_pos
)
return
-
ESPIPE
;
if
(
!
cdev
->
applid
)
if
(
!
cdev
->
ap
.
ap
plid
)
return
-
ENODEV
;
skb
=
alloc_skb
(
count
,
GFP_USER
);
...
...
@@ -742,24 +719,19 @@ capi_write(struct file *file, const char *buf, size_t count, loff_t *ppos)
return
-
EINVAL
;
}
}
CAPIMSG_SETAPPID
(
skb
->
data
,
cdev
->
applid
);
CAPIMSG_SETAPPID
(
skb
->
data
,
cdev
->
ap
.
ap
plid
);
if
(
CAPIMSG_COMMAND
(
skb
->
data
)
==
CAPI_DISCONNECT_B3_RESP
)
{
capincci_free
(
cdev
,
CAPIMSG_NCCI
(
skb
->
data
));
}
cdev
->
errcode
=
(
*
capifuncs
->
capi_put_message
)
(
cdev
->
applid
,
skb
);
cdev
->
errcode
=
capi20_put_message
(
&
cdev
->
ap
,
skb
);
if
(
cdev
->
errcode
)
{
kfree_skb
(
skb
);
return
-
EIO
;
}
if
(
CAPIMSG_CMD
(
skb
->
data
)
==
CAPI_DATA_B3_REQ
)
{
cdev
->
nsentdatapkt
++
;
}
else
{
cdev
->
nsentctlpkt
++
;
}
return
count
;
}
...
...
@@ -769,7 +741,7 @@ capi_poll(struct file *file, poll_table * wait)
struct
capidev
*
cdev
=
(
struct
capidev
*
)
file
->
private_data
;
unsigned
int
mask
=
0
;
if
(
!
cdev
->
applid
)
if
(
!
cdev
->
ap
.
ap
plid
)
return
POLLERR
;
poll_wait
(
file
,
&
(
cdev
->
recvwait
),
wait
);
...
...
@@ -781,30 +753,32 @@ capi_poll(struct file *file, poll_table * wait)
static
int
capi_ioctl
(
struct
inode
*
inode
,
struct
file
*
file
,
unsigned
int
cmd
,
unsigned
long
arg
)
unsigned
int
cmd
,
unsigned
long
arg
)
{
struct
capidev
*
cdev
=
(
struct
capidev
*
)
file
->
private_data
;
struct
capidev
*
cdev
=
file
->
private_data
;
struct
capi20_appl
*
ap
=
&
cdev
->
ap
;
capi_ioctl_struct
data
;
int
retval
=
-
EINVAL
;
switch
(
cmd
)
{
case
CAPI_REGISTER
:
{
retval
=
copy_from_user
((
void
*
)
&
data
.
rparams
,
(
void
*
)
arg
,
sizeof
(
struct
capi_register_params
));
if
(
retval
)
return
-
EFAULT
;
if
(
cdev
->
applid
)
if
(
ap
->
applid
)
return
-
EEXIST
;
cdev
->
errcode
=
(
*
capifuncs
->
capi_register
)
(
&
data
.
rparams
,
&
cdev
->
applid
);
if
(
copy_from_user
(
&
cdev
->
ap
.
rparam
,
(
void
*
)
arg
,
sizeof
(
struct
capi_register_params
)))
return
-
EFAULT
;
cdev
->
ap
.
private
=
cdev
;
cdev
->
ap
.
recv_message
=
capi_recv_message
;
cdev
->
errcode
=
capi20_register
(
ap
);
if
(
cdev
->
errcode
)
{
cdev
->
applid
=
0
;
ap
->
applid
=
0
;
return
-
EIO
;
}
(
void
)
(
*
capifuncs
->
capi_set_signal
)
(
cdev
->
applid
,
capi_signal
,
cdev
);
}
return
(
int
)
cdev
->
applid
;
return
(
int
)
ap
->
applid
;
case
CAPI_GET_VERSION
:
{
...
...
@@ -813,7 +787,7 @@ capi_ioctl(struct inode *inode, struct file *file,
sizeof
(
data
.
contr
));
if
(
retval
)
return
-
EFAULT
;
cdev
->
errcode
=
(
*
capifuncs
->
capi_get_version
)
(
data
.
contr
,
&
data
.
version
);
cdev
->
errcode
=
capi20_get_version
(
data
.
contr
,
&
data
.
version
);
if
(
cdev
->
errcode
)
return
-
EIO
;
retval
=
copy_to_user
((
void
*
)
arg
,
...
...
@@ -831,7 +805,7 @@ capi_ioctl(struct inode *inode, struct file *file,
sizeof
(
data
.
contr
));
if
(
retval
)
return
-
EFAULT
;
cdev
->
errcode
=
(
*
capifuncs
->
capi_get_serial
)
(
data
.
contr
,
data
.
serial
);
cdev
->
errcode
=
capi20_get_serial
(
data
.
contr
,
data
.
serial
);
if
(
cdev
->
errcode
)
return
-
EIO
;
retval
=
copy_to_user
((
void
*
)
arg
,
...
...
@@ -850,7 +824,7 @@ capi_ioctl(struct inode *inode, struct file *file,
return
-
EFAULT
;
if
(
data
.
contr
==
0
)
{
cdev
->
errcode
=
(
*
capifuncs
->
capi_get_profile
)
(
data
.
contr
,
&
data
.
profile
);
cdev
->
errcode
=
capi20_get_profile
(
data
.
contr
,
&
data
.
profile
);
if
(
cdev
->
errcode
)
return
-
EIO
;
...
...
@@ -859,7 +833,7 @@ capi_ioctl(struct inode *inode, struct file *file,
sizeof
(
data
.
profile
.
ncontroller
));
}
else
{
cdev
->
errcode
=
(
*
capifuncs
->
capi_get_profile
)
(
data
.
contr
,
&
data
.
profile
);
cdev
->
errcode
=
capi20_get_profile
(
data
.
contr
,
&
data
.
profile
);
if
(
cdev
->
errcode
)
return
-
EIO
;
...
...
@@ -879,7 +853,7 @@ capi_ioctl(struct inode *inode, struct file *file,
sizeof
(
data
.
contr
));
if
(
retval
)
return
-
EFAULT
;
cdev
->
errcode
=
(
*
capifuncs
->
capi_get_manufacturer
)
(
data
.
contr
,
data
.
manufacturer
);
cdev
->
errcode
=
capi20_get_manufacturer
(
data
.
contr
,
data
.
manufacturer
);
if
(
cdev
->
errcode
)
return
-
EIO
;
...
...
@@ -903,7 +877,7 @@ capi_ioctl(struct inode *inode, struct file *file,
return
data
.
errcode
;
case
CAPI_INSTALLED
:
if
(
(
*
capifuncs
->
capi_isinstalled
)
()
==
CAPI_NOERROR
)
if
(
capi20_isinstalled
()
==
CAPI_NOERROR
)
return
0
;
return
-
ENXIO
;
...
...
@@ -916,7 +890,7 @@ capi_ioctl(struct inode *inode, struct file *file,
sizeof
(
mcmd
));
if
(
retval
)
return
-
EFAULT
;
return
(
*
capifuncs
->
capi_manufacturer
)
(
mcmd
.
cmd
,
mcmd
.
data
);
return
capi20_manufacturer
(
mcmd
.
cmd
,
mcmd
.
data
);
}
return
0
;
...
...
@@ -1428,11 +1402,11 @@ static int proc_capidev_read_proc(char *page, char **start, off_t off,
list_for_each
(
l
,
&
capidev_list
)
{
cdev
=
list_entry
(
l
,
struct
capidev
,
list
);
len
+=
sprintf
(
page
+
len
,
"0 %d %lu %lu %lu %lu
\n
"
,
cdev
->
applid
,
cdev
->
nrecvctlpkt
,
cdev
->
nrecvdatapkt
,
cdev
->
nsentctlpkt
,
cdev
->
nsentdatapkt
);
cdev
->
ap
.
ap
plid
,
cdev
->
ap
.
nrecvctlpkt
,
cdev
->
ap
.
nrecvdatapkt
,
cdev
->
ap
.
nsentctlpkt
,
cdev
->
ap
.
nsentdatapkt
);
if
(
len
<=
off
)
{
off
-=
len
;
len
=
0
;
...
...
@@ -1468,7 +1442,7 @@ static int proc_capincci_read_proc(char *page, char **start, off_t off,
cdev
=
list_entry
(
l
,
struct
capidev
,
list
);
for
(
np
=
cdev
->
nccis
;
np
;
np
=
np
->
next
)
{
len
+=
sprintf
(
page
+
len
,
"%d 0x%x
\n
"
,
cdev
->
applid
,
cdev
->
ap
.
ap
plid
,
np
->
ncci
);
if
(
len
<=
off
)
{
off
-=
len
;
...
...
@@ -1596,10 +1570,6 @@ static int __init alloc_init(void)
return
0
;
}
static
struct
capi_interface_user
cuser
=
{
name:
"capi20"
,
};
static
char
rev
[
32
];
static
int
__init
capi_init
(
void
)
...
...
@@ -1628,19 +1598,8 @@ static int __init capi_init(void)
&
capi_fops
,
NULL
);
printk
(
KERN_NOTICE
"capi20: started up with major %d
\n
"
,
capi_major
);
if
((
capifuncs
=
attach_capi_interface
(
&
cuser
))
==
0
)
{
MOD_DEC_USE_COUNT
;
devfs_unregister_chrdev
(
capi_major
,
"capi20"
);
devfs_unregister
(
devfs_find_handle
(
NULL
,
"capi20"
,
capi_major
,
0
,
DEVFS_SPECIAL_CHR
,
0
));
return
-
EIO
;
}
#ifdef CONFIG_ISDN_CAPI_MIDDLEWARE
if
(
capinc_tty_init
()
<
0
)
{
(
void
)
detach_capi_interface
(
&
cuser
);
devfs_unregister_chrdev
(
capi_major
,
"capi20"
);
MOD_DEC_USE_COUNT
;
return
-
ENOMEM
;
...
...
@@ -1651,7 +1610,6 @@ static int __init capi_init(void)
#ifdef CONFIG_ISDN_CAPI_MIDDLEWARE
capinc_tty_exit
();
#endif
/* CONFIG_ISDN_CAPI_MIDDLEWARE */
(
void
)
detach_capi_interface
(
&
cuser
);
devfs_unregister_chrdev
(
capi_major
,
"capi20"
);
devfs_unregister
(
devfs_find_handle
(
NULL
,
"capi20"
,
capi_major
,
0
,
...
...
@@ -1689,7 +1647,6 @@ static void __exit capi_exit(void)
#ifdef CONFIG_ISDN_CAPI_MIDDLEWARE
capinc_tty_exit
();
#endif
(
void
)
detach_capi_interface
(
&
cuser
);
printk
(
KERN_NOTICE
"capi: Rev %s: unloaded
\n
"
,
rev
);
}
...
...
drivers/isdn/capi/capidrv.c
View file @
3e12a6dc
...
...
@@ -125,15 +125,9 @@ struct capidrv_contr {
struct
capidrv_data
{
u16
appid
;
struct
capi20_appl
ap
;
int
ncontr
;
struct
capidrv_contr
*
contr_list
;
/* statistic */
unsigned
long
nrecvctlpkt
;
unsigned
long
nrecvdatapkt
;
unsigned
long
nsentctlpkt
;
unsigned
long
nsentdatapkt
;
};
typedef
struct
capidrv_plci
capidrv_plci
;
...
...
@@ -146,7 +140,6 @@ typedef struct capidrv_bchan capidrv_bchan;
static
capidrv_data
global
;
static
spinlock_t
global_lock
=
SPIN_LOCK_UNLOCKED
;
static
struct
capi_interface
*
capifuncs
;
static
void
handle_dtrace_data
(
capidrv_contr
*
card
,
int
send
,
int
level2
,
u8
*
data
,
u16
len
);
...
...
@@ -519,8 +512,7 @@ static void send_message(capidrv_contr * card, _cmsg * cmsg)
len
=
CAPIMSG_LEN
(
cmsg
->
buf
);
skb
=
alloc_skb
(
len
,
GFP_ATOMIC
);
memcpy
(
skb_put
(
skb
,
len
),
cmsg
->
buf
,
len
);
(
*
capifuncs
->
capi_put_message
)
(
global
.
appid
,
skb
);
global
.
nsentctlpkt
++
;
capi20_put_message
(
&
global
.
ap
,
skb
);
}
/* -------- state machine -------------------------------------------- */
...
...
@@ -667,7 +659,7 @@ static void n0(capidrv_contr * card, capidrv_ncci * ncci)
isdn_ctrl
cmd
;
capi_fill_DISCONNECT_REQ
(
&
cmsg
,
global
.
ap
p
id
,
global
.
ap
.
appl
id
,
card
->
msgid
++
,
ncci
->
plcip
->
plci
,
0
,
/* BChannelinformation */
...
...
@@ -955,7 +947,7 @@ static void handle_incoming_call(capidrv_contr * card, _cmsg * cmsg)
cmd
.
parm
.
setup
.
si2
,
cmd
.
parm
.
setup
.
eazmsn
);
capi_fill_ALERT_REQ
(
cmsg
,
global
.
ap
p
id
,
global
.
ap
.
appl
id
,
card
->
msgid
++
,
plcip
->
plci
,
/* adr */
0
,
/* BChannelinformation */
...
...
@@ -1095,7 +1087,7 @@ static void handle_plci(_cmsg * cmsg)
break
;
/* $$$$ */
}
capi_fill_CONNECT_B3_REQ
(
cmsg
,
global
.
ap
p
id
,
global
.
ap
.
appl
id
,
card
->
msgid
++
,
plcip
->
plci
,
/* adr */
0
/* NCPI */
...
...
@@ -1212,7 +1204,7 @@ static void handle_ncci(_cmsg * cmsg)
if
(
nccip
)
{
ncci_change_state
(
card
,
nccip
,
EV_NCCI_CONNECT_B3_IND
);
capi_fill_CONNECT_B3_RESP
(
cmsg
,
global
.
ap
p
id
,
global
.
ap
.
appl
id
,
card
->
msgid
++
,
nccip
->
ncci
,
/* adr */
0
,
/* Reject */
...
...
@@ -1230,7 +1222,7 @@ static void handle_ncci(_cmsg * cmsg)
cmsg
->
adr
.
adrNCCI
);
}
capi_fill_CONNECT_B3_RESP
(
cmsg
,
global
.
ap
p
id
,
global
.
ap
.
appl
id
,
card
->
msgid
++
,
cmsg
->
adr
.
adrNCCI
,
2
,
/* Reject */
...
...
@@ -1373,36 +1365,30 @@ static void handle_data(_cmsg * cmsg, struct sk_buff *skb)
static
_cmsg
s_cmsg
;
static
void
capidrv_
signal
(
u16
applid
,
void
*
dummy
)
static
void
capidrv_
recv_message
(
struct
capi20_appl
*
ap
,
struct
sk_buff
*
skb
)
{
struct
sk_buff
*
skb
=
0
;
while
((
*
capifuncs
->
capi_get_message
)
(
global
.
appid
,
&
skb
)
==
CAPI_NOERROR
)
{
capi_message2cmsg
(
&
s_cmsg
,
skb
->
data
);
if
(
debugmode
>
2
)
printk
(
KERN_DEBUG
"capidrv_signal: applid=%d %s
\n
"
,
applid
,
capi_cmsg2str
(
&
s_cmsg
));
if
(
s_cmsg
.
Command
==
CAPI_DATA_B3
&&
s_cmsg
.
Subcommand
==
CAPI_IND
)
{
handle_data
(
&
s_cmsg
,
skb
);
global
.
nrecvdatapkt
++
;
continue
;
}
if
((
s_cmsg
.
adr
.
adrController
&
0xffffff00
)
==
0
)
handle_controller
(
&
s_cmsg
);
else
if
((
s_cmsg
.
adr
.
adrPLCI
&
0xffff0000
)
==
0
)
handle_plci
(
&
s_cmsg
);
else
handle_ncci
(
&
s_cmsg
);
/*
* data of skb used in s_cmsg,
* free data when s_cmsg is not used again
* thanks to Lars Heete <hel@admin.de>
*/
kfree_skb
(
skb
);
global
.
nrecvctlpkt
++
;
capi_message2cmsg
(
&
s_cmsg
,
skb
->
data
);
if
(
debugmode
>
2
)
printk
(
KERN_DEBUG
"capidrv_signal: applid=%d %s
\n
"
,
ap
->
applid
,
capi_cmsg2str
(
&
s_cmsg
));
if
(
s_cmsg
.
Command
==
CAPI_DATA_B3
&&
s_cmsg
.
Subcommand
==
CAPI_IND
)
{
handle_data
(
&
s_cmsg
,
skb
);
return
;
}
if
((
s_cmsg
.
adr
.
adrController
&
0xffffff00
)
==
0
)
handle_controller
(
&
s_cmsg
);
else
if
((
s_cmsg
.
adr
.
adrPLCI
&
0xffff0000
)
==
0
)
handle_plci
(
&
s_cmsg
);
else
handle_ncci
(
&
s_cmsg
);
/*
* data of skb used in s_cmsg,
* free data when s_cmsg is not used again
* thanks to Lars Heete <hel@admin.de>
*/
kfree_skb
(
skb
);
}
/* ------------------------------------------------------------------- */
...
...
@@ -1628,7 +1614,7 @@ static int capidrv_command(isdn_ctrl * c, capidrv_contr * card)
}
capi_fill_CONNECT_REQ
(
&
cmdcmsg
,
global
.
ap
p
id
,
global
.
ap
.
appl
id
,
card
->
msgid
++
,
card
->
contrnr
,
/* adr */
si2cip
(
bchan
->
si1
,
bchan
->
si2
),
/* cipvalue */
...
...
@@ -1674,7 +1660,7 @@ static int capidrv_command(isdn_ctrl * c, capidrv_contr * card)
c
->
arg
,
bchan
->
l2
,
bchan
->
l3
);
capi_fill_CONNECT_RESP
(
&
cmdcmsg
,
global
.
ap
p
id
,
global
.
ap
.
appl
id
,
card
->
msgid
++
,
bchan
->
plcip
->
plci
,
/* adr */
0
,
/* Reject */
...
...
@@ -1721,7 +1707,7 @@ static int capidrv_command(isdn_ctrl * c, capidrv_contr * card)
if
(
bchan
->
nccip
)
{
bchan
->
disconnecting
=
1
;
capi_fill_DISCONNECT_B3_REQ
(
&
cmdcmsg
,
global
.
ap
p
id
,
global
.
ap
.
appl
id
,
card
->
msgid
++
,
bchan
->
nccip
->
ncci
,
0
/* NCPI */
...
...
@@ -1742,7 +1728,7 @@ static int capidrv_command(isdn_ctrl * c, capidrv_contr * card)
}
else
if
(
bchan
->
plcip
->
plci
)
{
bchan
->
disconnecting
=
1
;
capi_fill_DISCONNECT_REQ
(
&
cmdcmsg
,
global
.
ap
p
id
,
global
.
ap
.
appl
id
,
card
->
msgid
++
,
bchan
->
plcip
->
plci
,
0
,
/* BChannelinformation */
...
...
@@ -1889,7 +1875,7 @@ static int if_sendbuf(int id, int channel, int doack, struct sk_buff *skb)
return
0
;
}
datahandle
=
nccip
->
datahandle
;
capi_fill_DATA_B3_REQ
(
&
sendcmsg
,
global
.
ap
p
id
,
card
->
msgid
++
,
capi_fill_DATA_B3_REQ
(
&
sendcmsg
,
global
.
ap
.
appl
id
,
card
->
msgid
++
,
nccip
->
ncci
,
/* adr */
(
u32
)
skb
->
data
,
/* Data */
skb
->
len
,
/* DataLength */
...
...
@@ -1913,11 +1899,10 @@ static int if_sendbuf(int id, int channel, int doack, struct sk_buff *skb)
printk
(
KERN_DEBUG
"capidrv-%d: only %d bytes headroom, need %d
\n
"
,
card
->
contrnr
,
skb_headroom
(
skb
),
msglen
);
memcpy
(
skb_push
(
nskb
,
msglen
),
sendcmsg
.
buf
,
msglen
);
errcode
=
(
*
capifuncs
->
capi_put_message
)
(
global
.
appid
,
nskb
);
errcode
=
capi20_put_message
(
&
global
.
ap
,
nskb
);
if
(
errcode
==
CAPI_NOERROR
)
{
dev_kfree_skb
(
skb
);
nccip
->
datahandle
++
;
global
.
nsentdatapkt
++
;
return
len
;
}
(
void
)
capidrv_del_ack
(
nccip
,
datahandle
);
...
...
@@ -1925,10 +1910,9 @@ static int if_sendbuf(int id, int channel, int doack, struct sk_buff *skb)
return
errcode
==
CAPI_SENDQUEUEFULL
?
0
:
-
1
;
}
else
{
memcpy
(
skb_push
(
skb
,
msglen
),
sendcmsg
.
buf
,
msglen
);
errcode
=
(
*
capifuncs
->
capi_put_message
)
(
global
.
appid
,
skb
);
errcode
=
capi20_put_message
(
&
global
.
ap
,
skb
);
if
(
errcode
==
CAPI_NOERROR
)
{
nccip
->
datahandle
++
;
global
.
nsentdatapkt
++
;
return
len
;
}
skb_pull
(
skb
,
msglen
);
...
...
@@ -1969,7 +1953,7 @@ static void enable_dchannel_trace(capidrv_contr *card)
u16
errcode
;
u16
avmversion
[
3
];
errcode
=
(
*
capifuncs
->
capi_get_manufacturer
)
(
contr
,
manufacturer
);
errcode
=
capi20_get_manufacturer
(
contr
,
manufacturer
);
if
(
errcode
!=
CAPI_NOERROR
)
{
printk
(
KERN_ERR
"%s: can't get manufacturer (0x%x)
\n
"
,
card
->
name
,
errcode
);
...
...
@@ -1980,7 +1964,7 @@ static void enable_dchannel_trace(capidrv_contr *card)
card
->
name
,
manufacturer
);
return
;
}
errcode
=
(
*
capifuncs
->
capi_get_version
)
(
contr
,
&
version
);
errcode
=
capi20_get_version
(
contr
,
&
version
);
if
(
errcode
!=
CAPI_NOERROR
)
{
printk
(
KERN_ERR
"%s: can't get version (0x%x)
\n
"
,
card
->
name
,
errcode
);
...
...
@@ -1993,7 +1977,7 @@ static void enable_dchannel_trace(capidrv_contr *card)
if
(
avmversion
[
0
]
>
3
||
(
avmversion
[
0
]
==
3
&&
avmversion
[
1
]
>
5
))
{
printk
(
KERN_INFO
"%s: D2 trace enabled
\n
"
,
card
->
name
);
capi_fill_MANUFACTURER_REQ
(
&
cmdcmsg
,
global
.
ap
p
id
,
capi_fill_MANUFACTURER_REQ
(
&
cmdcmsg
,
global
.
ap
.
appl
id
,
card
->
msgid
++
,
contr
,
0x214D5641
,
/* ManuID */
...
...
@@ -2002,7 +1986,7 @@ static void enable_dchannel_trace(capidrv_contr *card)
(
_cstruct
)
"
\004\200\014\000\000
"
);
}
else
{
printk
(
KERN_INFO
"%s: D3 trace enabled
\n
"
,
card
->
name
);
capi_fill_MANUFACTURER_REQ
(
&
cmdcmsg
,
global
.
ap
p
id
,
capi_fill_MANUFACTURER_REQ
(
&
cmdcmsg
,
global
.
ap
.
appl
id
,
card
->
msgid
++
,
contr
,
0x214D5641
,
/* ManuID */
...
...
@@ -2016,7 +2000,7 @@ static void enable_dchannel_trace(capidrv_contr *card)
static
void
send_listen
(
capidrv_contr
*
card
)
{
capi_fill_LISTEN_REQ
(
&
cmdcmsg
,
global
.
ap
p
id
,
capi_fill_LISTEN_REQ
(
&
cmdcmsg
,
global
.
ap
.
appl
id
,
card
->
msgid
++
,
card
->
contrnr
,
/* controller */
1
<<
6
,
/* Infomask */
...
...
@@ -2243,10 +2227,10 @@ static int proc_capidrv_read_proc(char *page, char **start, off_t off,
int
len
=
0
;
len
+=
sprintf
(
page
+
len
,
"%lu %lu %lu %lu
\n
"
,
global
.
nrecvctlpkt
,
global
.
nrecvdatapkt
,
global
.
nsentctlpkt
,
global
.
nsentdatapkt
);
global
.
ap
.
nrecvctlpkt
,
global
.
ap
.
nrecvdatapkt
,
global
.
ap
.
nsentctlpkt
,
global
.
ap
.
nsentdatapkt
);
if
(
off
+
count
>=
len
)
*
eof
=
1
;
if
(
len
<
off
)
...
...
@@ -2292,14 +2276,8 @@ static void __exit proc_exit(void)
}
}
static
struct
capi_interface_user
cuser
=
{
name:
"capidrv"
,
callback:
lower_callback
};
static
int
__init
capidrv_init
(
void
)
{
struct
capi_register_params
rparam
;
capi_profile
profile
;
char
rev
[
32
];
char
*
p
;
...
...
@@ -2308,13 +2286,6 @@ static int __init capidrv_init(void)
MOD_INC_USE_COUNT
;
capifuncs
=
attach_capi_interface
(
&
cuser
);
if
(
!
capifuncs
)
{
MOD_DEC_USE_COUNT
;
return
-
EIO
;
}
if
((
p
=
strchr
(
revision
,
':'
))
!=
0
&&
p
[
1
])
{
strncpy
(
rev
,
p
+
2
,
sizeof
(
rev
));
rev
[
sizeof
(
rev
)
-
1
]
=
0
;
...
...
@@ -2323,29 +2294,29 @@ static int __init capidrv_init(void)
}
else
strcpy
(
rev
,
"1.0"
);
rparam
.
level3cnt
=
-
2
;
/* number of bchannels twice */
rparam
.
datablkcnt
=
16
;
rparam
.
datablklen
=
2048
;
errcode
=
(
*
capifuncs
->
capi_register
)
(
&
rparam
,
&
global
.
appid
);
global
.
ap
.
rparam
.
level3cnt
=
-
2
;
/* number of bchannels twice */
global
.
ap
.
rparam
.
datablkcnt
=
16
;
global
.
ap
.
rparam
.
datablklen
=
2048
;
global
.
ap
.
recv_message
=
capidrv_recv_message
;
errcode
=
capi20_register
(
&
global
.
ap
);
if
(
errcode
)
{
detach_capi_interface
(
&
cuser
);
MOD_DEC_USE_COUNT
;
return
-
EIO
;
}
errcode
=
(
*
capifuncs
->
capi_get_profile
)
(
0
,
&
profile
);
capi20_set_callback
(
&
global
.
ap
,
lower_callback
);
errcode
=
capi20_get_profile
(
0
,
&
profile
);
if
(
errcode
!=
CAPI_NOERROR
)
{
(
void
)
(
*
capifuncs
->
capi_release
)
(
global
.
appid
);
detach_capi_interface
(
&
cuser
);
capi20_release
(
&
global
.
ap
);
MOD_DEC_USE_COUNT
;
return
-
EIO
;
}
(
void
)
(
*
capifuncs
->
capi_set_signal
)
(
global
.
appid
,
capidrv_signal
,
0
);
ncontr
=
profile
.
ncontroller
;
for
(
contr
=
1
;
contr
<=
ncontr
;
contr
++
)
{
errcode
=
(
*
capifuncs
->
capi_get_profile
)
(
contr
,
&
profile
);
errcode
=
capi20_get_profile
(
contr
,
&
profile
);
if
(
errcode
!=
CAPI_NOERROR
)
continue
;
(
void
)
capidrv_addcontr
(
contr
,
&
profile
);
...
...
@@ -2371,9 +2342,7 @@ static void __exit capidrv_exit(void)
strcpy
(
rev
,
" ??? "
);
}
(
void
)
(
*
capifuncs
->
capi_release
)
(
global
.
appid
);
detach_capi_interface
(
&
cuser
);
capi20_release
(
&
global
.
ap
);
proc_exit
();
...
...
drivers/isdn/capi/kcapi.c
View file @
3e12a6dc
...
...
@@ -55,21 +55,6 @@ MODULE_PARM(showcapimsgs, "i");
/* ------------------------------------------------------------- */
struct
capi_appl
{
u16
applid
;
capi_register_params
rparam
;
void
*
param
;
void
(
*
signal
)
(
u16
applid
,
void
*
param
);
struct
sk_buff_head
recv_queue
;
int
nncci
;
struct
capi_ncci
*
nccilist
;
unsigned
long
nrecvctlpkt
;
unsigned
long
nrecvdatapkt
;
unsigned
long
nsentctlpkt
;
unsigned
long
nsentdatapkt
;
};
struct
capi_notifier
{
struct
capi_notifier
*
next
;
unsigned
int
cmd
;
...
...
@@ -86,14 +71,11 @@ static char capi_manufakturer[64] = "AVM Berlin";
#define NCCI2CTRL(ncci) (((ncci) >> 24) & 0x7f)
static
struct
capi_appl
*
applications
[
CAPI_MAXAPPL
];
static
struct
capi
20
_appl
*
applications
[
CAPI_MAXAPPL
];
static
struct
capi_ctr
*
cards
[
CAPI_MAXCONTR
];
static
int
ncards
;
static
struct
sk_buff_head
recv_queue
;
static
LIST_HEAD
(
users
);
static
spinlock_t
users_lock
=
SPIN_LOCK_UNLOCKED
;
static
LIST_HEAD
(
drivers
);
static
spinlock_t
drivers_lock
=
SPIN_LOCK_UNLOCKED
;
...
...
@@ -134,7 +116,7 @@ static inline struct capi_ctr *get_capi_ctr_by_nr(u16 contr)
return
cards
[
contr
-
1
];
}
static
inline
struct
capi_appl
*
get_capi_appl_by_nr
(
u16
applid
)
static
inline
struct
capi
20
_appl
*
get_capi_appl_by_nr
(
u16
applid
)
{
if
(
applid
-
1
>=
CAPI_MAXAPPL
)
return
NULL
;
...
...
@@ -197,20 +179,18 @@ static inline int capi_subcmd_valid(u8 subcmd)
static
int
proc_applications_read_proc
(
char
*
page
,
char
**
start
,
off_t
off
,
int
count
,
int
*
eof
,
void
*
data
)
{
struct
capi_appl
*
ap
;
struct
capi
20
_appl
*
ap
;
int
i
;
int
len
=
0
;
for
(
i
=
1
;
i
<=
CAPI_MAXAPPL
;
i
++
)
{
ap
=
get_capi_appl_by_nr
(
i
);
if
(
!
ap
)
continue
;
len
+=
sprintf
(
page
+
len
,
"%u %d %d %d %d %d
\n
"
,
ap
->
applid
,
ap
->
rparam
.
level3cnt
,
ap
->
rparam
.
datablkcnt
,
ap
->
rparam
.
datablklen
,
ap
->
nncci
,
skb_queue_len
(
&
ap
->
recv_queue
));
len
+=
sprintf
(
page
+
len
,
"%u %d %d %d
\n
"
,
ap
->
applid
,
ap
->
rparam
.
level3cnt
,
ap
->
rparam
.
datablkcnt
,
ap
->
rparam
.
datablklen
);
if
(
len
<=
off
)
{
off
-=
len
;
len
=
0
;
...
...
@@ -265,39 +245,6 @@ static int proc_driver_read_proc(char *page, char **start, off_t off,
return
len
;
}
/*
* /proc/capi/users:
* name
*/
static
int
proc_users_read_proc
(
char
*
page
,
char
**
start
,
off_t
off
,
int
count
,
int
*
eof
,
void
*
data
)
{
struct
list_head
*
l
;
struct
capi_interface_user
*
cp
;
int
len
=
0
;
spin_lock
(
&
users_lock
);
list_for_each
(
l
,
&
users
)
{
cp
=
list_entry
(
l
,
struct
capi_interface_user
,
user_list
);
len
+=
sprintf
(
page
+
len
,
"%s
\n
"
,
cp
->
name
);
if
(
len
<=
off
)
{
off
-=
len
;
len
=
0
;
}
else
{
if
(
len
-
off
>
count
)
goto
endloop
;
}
}
endloop:
spin_unlock
(
&
users_lock
);
*
start
=
page
+
off
;
if
(
len
<
count
)
*
eof
=
1
;
if
(
len
>
count
)
len
=
count
;
if
(
len
<
0
)
len
=
0
;
return
len
;
}
/*
* /proc/capi/controller:
* cnr driver cardstate name driverinfo
...
...
@@ -344,7 +291,7 @@ static int proc_controller_read_proc(char *page, char **start, off_t off,
static
int
proc_applstats_read_proc
(
char
*
page
,
char
**
start
,
off_t
off
,
int
count
,
int
*
eof
,
void
*
data
)
{
struct
capi_appl
*
ap
;
struct
capi
20
_appl
*
ap
;
int
i
;
int
len
=
0
;
...
...
@@ -422,7 +369,6 @@ static struct procfsentries {
{
"capi"
,
S_IFDIR
,
0
},
{
"capi/applications"
,
0
,
proc_applications_read_proc
},
{
"capi/driver"
,
0
,
proc_driver_read_proc
},
{
"capi/users"
,
0
,
proc_users_read_proc
},
{
"capi/controller"
,
0
,
proc_controller_read_proc
},
{
"capi/applstats"
,
0
,
proc_applstats_read_proc
},
{
"capi/contrstats"
,
0
,
proc_contrstats_read_proc
},
...
...
@@ -548,35 +494,33 @@ static int notify_push(unsigned int cmd, u32 controller,
static
void
notify_up
(
u32
contr
)
{
struct
list_head
*
l
;
struct
capi_interface_user
*
p
;
struct
capi_ctr
*
card
=
get_capi_ctr_by_nr
(
contr
);
struct
capi20_appl
*
ap
;
u16
applid
;
printk
(
KERN_DEBUG
"kcapi: notify up contr %d
\n
"
,
contr
);
printk
(
KERN_NOTICE
"kcapi: notify up contr %d
\n
"
,
contr
);
spin_lock
(
&
users_lock
);
list_for_each
(
l
,
&
users
)
{
p
=
list_entry
(
l
,
struct
capi_interface_user
,
user_list
);
if
(
!
p
->
callback
)
continue
;
(
*
p
->
callback
)
(
KCI_CONTRUP
,
contr
,
&
card
->
profile
);
for
(
applid
=
1
;
applid
<=
CAPI_MAXAPPL
;
applid
++
)
{
ap
=
get_capi_appl_by_nr
(
applid
);
if
(
ap
&&
ap
->
callback
)
ap
->
callback
(
KCI_CONTRUP
,
contr
,
&
card
->
profile
);
}
spin_unlock
(
&
users_lock
);
}
/* -------- KCI_CONTRDOWN ------------------------------------- */
static
void
notify_down
(
u32
contr
)
{
struct
list_head
*
l
;
struct
capi_interface_user
*
p
;
printk
(
KERN_
NOTICE
"kcapi: notify down contr %d
\n
"
,
contr
);
spin_lock
(
&
users_lock
);
list_for_each
(
l
,
&
users
)
{
p
=
list_entry
(
l
,
struct
capi_interface_user
,
user_list
);
if
(
!
p
->
callback
)
continue
;
(
*
p
->
callback
)
(
KCI_CONTRDOWN
,
contr
,
0
);
struct
capi20_appl
*
ap
;
u16
applid
;
printk
(
KERN_
DEBUG
"kcapi: notify down contr %d
\n
"
,
contr
);
for
(
applid
=
1
;
applid
<=
CAPI_MAXAPPL
;
applid
++
)
{
ap
=
get_capi_appl_by_nr
(
applid
);
if
(
ap
&&
ap
->
callback
)
ap
->
callback
(
KCI_CONTRDOWN
,
contr
,
0
);
}
spin_unlock
(
&
users_lock
);
}
/* ------------------------------------------------------------ */
...
...
@@ -610,7 +554,7 @@ static void notify_handler(void *dummy)
static
void
recv_handler
(
void
*
dummy
)
{
struct
sk_buff
*
skb
;
struct
capi_appl
*
ap
;
struct
capi
20
_appl
*
ap
;
while
((
skb
=
skb_dequeue
(
&
recv_queue
))
!=
0
)
{
ap
=
get_capi_appl_by_nr
(
CAPIMSG_APPID
(
skb
->
data
));
...
...
@@ -620,20 +564,14 @@ static void recv_handler(void *dummy)
kfree_skb
(
skb
);
continue
;
}
if
(
ap
->
signal
==
0
)
{
printk
(
KERN_ERR
"kcapi: recv_handler: applid %d has no signal function
\n
"
,
ap
->
applid
);
kfree_skb
(
skb
);
continue
;
}
if
(
CAPIMSG_COMMAND
(
skb
->
data
)
==
CAPI_DATA_B3
&&
CAPIMSG_SUBCOMMAND
(
skb
->
data
)
==
CAPI_IND
)
{
ap
->
nrecvdatapkt
++
;
}
else
{
ap
->
nrecvctlpkt
++
;
}
skb_queue_tail
(
&
ap
->
recv_queue
,
skb
);
(
ap
->
signal
)
(
ap
->
applid
,
ap
->
param
);
ap
->
recv_message
(
ap
,
skb
);
}
}
...
...
@@ -684,7 +622,7 @@ static void controllercb_handle_capimsg(struct capi_ctr * card,
static
void
controllercb_ready
(
struct
capi_ctr
*
card
)
{
u16
appl
;
struct
capi_appl
*
ap
;
struct
capi
20
_appl
*
ap
;
card
->
cardstate
=
CARD_RUNNING
;
...
...
@@ -717,7 +655,7 @@ static void controllercb_reseted(struct capi_ctr * card)
memset
(
card
->
serial
,
0
,
sizeof
(
card
->
serial
));
for
(
appl
=
1
;
appl
<=
CAPI_MAXAPPL
;
appl
++
)
{
struct
capi_appl
*
ap
=
get_capi_appl_by_nr
(
appl
);
struct
capi
20
_appl
*
ap
=
get_capi_appl_by_nr
(
appl
);
if
(
!
ap
)
continue
;
...
...
@@ -892,7 +830,7 @@ EXPORT_SYMBOL(detach_capi_driver);
/* -------- CAPI2.0 Interface ---------------------------------- */
/* ------------------------------------------------------------- */
static
u16
capi
_isinstalled
(
void
)
u16
capi20
_isinstalled
(
void
)
{
int
i
;
for
(
i
=
0
;
i
<
CAPI_MAXCONTR
;
i
++
)
{
...
...
@@ -902,84 +840,76 @@ static u16 capi_isinstalled(void)
return
CAPI_REGNOTINSTALLED
;
}
static
u16
capi_register
(
capi_register_params
*
rparam
,
u16
*
applidp
)
EXPORT_SYMBOL
(
capi20_isinstalled
);
u16
capi20_register
(
struct
capi20_appl
*
ap
)
{
struct
capi_appl
*
ap
;
int
appl
;
int
i
;
u16
applid
;
DBG
(
""
);
if
(
rparam
->
datablklen
<
128
)
if
(
ap
->
rparam
.
datablklen
<
128
)
return
CAPI_LOGBLKSIZETOSMALL
;
for
(
appl
=
1
;
appl
<=
CAPI_MAXAPPL
;
appl
++
)
{
if
(
applications
[
appl
-
1
]
==
NULL
)
for
(
appl
id
=
1
;
applid
<=
CAPI_MAXAPPL
;
applid
++
)
{
if
(
applications
[
appl
id
-
1
]
==
NULL
)
break
;
}
if
(
appl
>
CAPI_MAXAPPL
)
if
(
appl
id
>
CAPI_MAXAPPL
)
return
CAPI_TOOMANYAPPLS
;
ap
=
kmalloc
(
sizeof
(
*
ap
),
GFP_KERNEL
);
if
(
!
ap
)
return
CAPI_REGOSRESOURCEERR
;
ap
->
applid
=
applid
;
applications
[
applid
-
1
]
=
ap
;
memset
(
ap
,
0
,
sizeof
(
*
ap
));
ap
->
applid
=
appl
;
applications
[
appl
-
1
]
=
ap
;
ap
->
nrecvctlpkt
=
0
;
ap
->
nrecvdatapkt
=
0
;
ap
->
nsentctlpkt
=
0
;
ap
->
nsentdatapkt
=
0
;
ap
->
callback
=
0
;
skb_queue_head_init
(
&
ap
->
recv_queue
);
ap
->
nncci
=
0
;
memcpy
(
&
ap
->
rparam
,
rparam
,
sizeof
(
capi_register_params
));
for
(
i
=
0
;
i
<
CAPI_MAXCONTR
;
i
++
)
{
if
(
!
cards
[
i
]
||
cards
[
i
]
->
cardstate
!=
CARD_RUNNING
)
continue
;
register_appl
(
cards
[
i
],
appl
,
&
ap
->
rparam
);
register_appl
(
cards
[
i
],
appl
id
,
&
ap
->
rparam
);
}
*
applidp
=
appl
;
printk
(
KERN_INFO
"kcapi: appl %d up
\n
"
,
appl
);
printk
(
KERN_DEBUG
"kcapi: appl %d up
\n
"
,
applid
);
return
CAPI_NOERROR
;
}
static
u16
capi_release
(
u16
applid
)
EXPORT_SYMBOL
(
capi20_register
);
u16
capi20_release
(
struct
capi20_appl
*
ap
)
{
struct
capi_appl
*
ap
=
get_capi_appl_by_nr
(
applid
);
int
i
;
DBG
(
"applid %#x"
,
applid
);
DBG
(
"applid %#x"
,
ap
->
ap
plid
);
if
(
!
ap
)
return
CAPI_ILLAPPNR
;
skb_queue_purge
(
&
ap
->
recv_queue
);
for
(
i
=
0
;
i
<
CAPI_MAXCONTR
;
i
++
)
{
if
(
!
cards
[
i
]
||
cards
[
i
]
->
cardstate
!=
CARD_RUNNING
)
continue
;
release_appl
(
cards
[
i
],
applid
);
release_appl
(
cards
[
i
],
ap
->
ap
plid
);
}
applications
[
applid
-
1
]
=
NULL
;
kfree
(
ap
);
printk
(
KERN_INFO
"kcapi: appl %d down
\n
"
,
applid
);
applications
[
ap
->
applid
-
1
]
=
NULL
;
printk
(
KERN_DEBUG
"kcapi: appl %d down
\n
"
,
ap
->
applid
);
return
CAPI_NOERROR
;
}
static
u16
capi_put_message
(
u16
applid
,
struct
sk_buff
*
skb
)
EXPORT_SYMBOL
(
capi20_release
);
u16
capi20_put_message
(
struct
capi20_appl
*
ap
,
struct
sk_buff
*
skb
)
{
struct
capi_ctr
*
card
;
struct
capi_appl
*
ap
;
int
showctl
=
0
;
u8
cmd
,
subcmd
;
DBG
(
"applid %#x"
,
applid
);
DBG
(
"applid %#x"
,
ap
->
ap
plid
);
if
(
ncards
==
0
)
return
CAPI_REGNOTINSTALLED
;
ap
=
get_capi_appl_by_nr
(
applid
);
if
(
!
ap
)
if
(
ap
->
applid
==
0
)
return
CAPI_ILLAPPNR
;
if
(
skb
->
len
<
12
||
!
capi_cmd_valid
(
CAPIMSG_COMMAND
(
skb
->
data
))
...
...
@@ -1024,33 +954,9 @@ static u16 capi_put_message(u16 applid, struct sk_buff *skb)
return
card
->
driver
->
send_message
(
card
,
skb
);
}
static
u16
capi_get_message
(
u16
applid
,
struct
sk_buff
**
msgp
)
{
struct
capi_appl
*
ap
=
get_capi_appl_by_nr
(
applid
);
struct
sk_buff
*
skb
;
if
(
!
ap
)
return
CAPI_ILLAPPNR
;
if
((
skb
=
skb_dequeue
(
&
ap
->
recv_queue
))
==
0
)
return
CAPI_RECEIVEQUEUEEMPTY
;
*
msgp
=
skb
;
return
CAPI_NOERROR
;
}
EXPORT_SYMBOL
(
capi20_put_message
);
static
u16
capi_set_signal
(
u16
applid
,
void
(
*
signal
)
(
u16
applid
,
void
*
param
),
void
*
param
)
{
struct
capi_appl
*
ap
=
get_capi_appl_by_nr
(
applid
);
if
(
!
ap
)
return
CAPI_ILLAPPNR
;
ap
->
signal
=
signal
;
ap
->
param
=
param
;
return
CAPI_NOERROR
;
}
static
u16
capi_get_manufacturer
(
u32
contr
,
u8
buf
[
CAPI_MANUFACTURER_LEN
])
u16
capi20_get_manufacturer
(
u32
contr
,
u8
buf
[
CAPI_MANUFACTURER_LEN
])
{
struct
capi_ctr
*
card
;
...
...
@@ -1066,7 +972,9 @@ static u16 capi_get_manufacturer(u32 contr, u8 buf[CAPI_MANUFACTURER_LEN])
return
CAPI_NOERROR
;
}
static
u16
capi_get_version
(
u32
contr
,
struct
capi_version
*
verp
)
EXPORT_SYMBOL
(
capi20_get_manufacturer
);
u16
capi20_get_version
(
u32
contr
,
struct
capi_version
*
verp
)
{
struct
capi_ctr
*
card
;
...
...
@@ -1082,7 +990,9 @@ static u16 capi_get_version(u32 contr, struct capi_version *verp)
return
CAPI_NOERROR
;
}
static
u16
capi_get_serial
(
u32
contr
,
u8
serial
[
CAPI_SERIAL_LEN
])
EXPORT_SYMBOL
(
capi20_get_version
);
u16
capi20_get_serial
(
u32
contr
,
u8
serial
[
CAPI_SERIAL_LEN
])
{
struct
capi_ctr
*
card
;
...
...
@@ -1098,7 +1008,9 @@ static u16 capi_get_serial(u32 contr, u8 serial[CAPI_SERIAL_LEN])
return
CAPI_NOERROR
;
}
static
u16
capi_get_profile
(
u32
contr
,
struct
capi_profile
*
profp
)
EXPORT_SYMBOL
(
capi20_get_serial
);
u16
capi20_get_profile
(
u32
contr
,
struct
capi_profile
*
profp
)
{
struct
capi_ctr
*
card
;
...
...
@@ -1115,6 +1027,8 @@ static u16 capi_get_profile(u32 contr, struct capi_profile *profp)
return
CAPI_NOERROR
;
}
EXPORT_SYMBOL
(
capi20_get_profile
);
static
struct
capi_driver
*
find_driver
(
char
*
name
)
{
struct
list_head
*
l
;
...
...
@@ -1255,7 +1169,7 @@ static int old_capi_manufacturer(unsigned int cmd, void *data)
}
#endif
static
int
capi
_manufacturer
(
unsigned
int
cmd
,
void
*
data
)
int
capi20
_manufacturer
(
unsigned
int
cmd
,
void
*
data
)
{
struct
capi_ctr
*
card
;
int
retval
;
...
...
@@ -1296,47 +1210,16 @@ static int capi_manufacturer(unsigned int cmd, void *data)
return
-
EINVAL
;
}
struct
capi_interface
avmb1_interface
=
{
capi_isinstalled
,
capi_register
,
capi_release
,
capi_put_message
,
capi_get_message
,
capi_set_signal
,
capi_get_manufacturer
,
capi_get_version
,
capi_get_serial
,
capi_get_profile
,
capi_manufacturer
};
EXPORT_SYMBOL
(
capi20_manufacturer
);
/* ------------------------------------------------------------- */
/* -------- Exported Functions --------------------------------- */
/* ------------------------------------------------------------- */
struct
capi_interface
*
attach_capi_interface
(
struct
capi_interface_user
*
userp
)
/* temporary hack */
void
capi20_set_callback
(
struct
capi20_appl
*
ap
,
void
(
*
callback
)
(
unsigned
int
cmd
,
__u32
contr
,
void
*
data
))
{
spin_lock
(
&
users_lock
);
list_add_tail
(
&
userp
->
user_list
,
&
users
);
spin_unlock
(
&
users_lock
);
printk
(
KERN_NOTICE
"kcapi: %s attached
\n
"
,
userp
->
name
);
return
&
avmb1_interface
;
}
EXPORT_SYMBOL
(
attach_capi_interface
);
int
detach_capi_interface
(
struct
capi_interface_user
*
userp
)
{
spin_lock
(
&
users_lock
);
list_del
(
&
userp
->
user_list
);
printk
(
KERN_NOTICE
"kcapi: %s detached
\n
"
,
userp
->
name
);
return
0
;
ap
->
callback
=
callback
;
}
EXPORT_SYMBOL
(
detach_capi_interface
);
EXPORT_SYMBOL
(
capi20_set_callback
);
/* ------------------------------------------------------------- */
/* -------- Init & Cleanup ------------------------------------- */
...
...
drivers/isdn/hardware/avm/b1isa.c
View file @
3e12a6dc
...
...
@@ -178,8 +178,6 @@ static int __init b1isa_init(void)
int
i
,
retval
;
int
found
=
0
;
MOD_INC_USE_COUNT
;
b1_set_revision
(
&
b1isa_driver
,
revision
);
attach_capi_driver
(
&
b1isa_driver
);
...
...
@@ -203,7 +201,6 @@ static int __init b1isa_init(void)
err:
detach_capi_driver
(
&
b1isa_driver
);
out:
MOD_DEC_USE_COUNT
;
return
retval
;
}
...
...
drivers/isdn/hardware/avm/b1pci.c
View file @
3e12a6dc
...
...
@@ -397,8 +397,6 @@ static int __init b1pci_init(void)
{
int
retval
;
MOD_INC_USE_COUNT
;
b1_set_revision
(
&
b1pci_driver
,
revision
);
attach_capi_driver
(
&
b1pci_driver
);
...
...
@@ -422,7 +420,6 @@ static int __init b1pci_init(void)
detach_capi_driver
(
&
b1pciv4_driver
);
#endif
out:
MOD_DEC_USE_COUNT
;
return
retval
;
}
...
...
drivers/isdn/hardware/avm/b1pcmcia.c
View file @
3e12a6dc
...
...
@@ -200,12 +200,9 @@ EXPORT_SYMBOL(b1pcmcia_delcard);
static
int
__init
b1pcmcia_init
(
void
)
{
MOD_INC_USE_COUNT
;
b1_set_revision
(
&
b1pcmcia_driver
,
revision
);
attach_capi_driver
(
&
b1pcmcia_driver
);
MOD_DEC_USE_COUNT
;
return
0
;
}
...
...
drivers/isdn/hardware/avm/c4.c
View file @
3e12a6dc
...
...
@@ -1282,8 +1282,6 @@ static int __init c4_init(void)
{
int
retval
;
MOD_INC_USE_COUNT
;
b1_set_revision
(
&
c2_driver
,
revision
);
attach_capi_driver
(
&
c2_driver
);
...
...
@@ -1304,7 +1302,6 @@ static int __init c4_init(void)
detach_capi_driver
(
&
c2_driver
);
detach_capi_driver
(
&
c4_driver
);
out:
MOD_DEC_USE_COUNT
;
return
retval
;
}
...
...
drivers/isdn/hardware/avm/t1isa.c
View file @
3e12a6dc
...
...
@@ -345,12 +345,11 @@ static void t1isa_remove(struct pci_dev *pdev)
/* ------------------------------------------------------------- */
static
int
__init
t1isa_probe
(
struct
pci_dev
*
pdev
)
static
int
__init
t1isa_probe
(
struct
pci_dev
*
pdev
,
int
cardnr
)
{
avmctrl_info
*
cinfo
;
avmcard
*
card
;
int
retval
;
static
int
cardnr
=
1
;
card
=
b1_alloc_card
(
1
);
if
(
!
card
)
{
...
...
@@ -363,7 +362,7 @@ static int __init t1isa_probe(struct pci_dev *pdev)
card
->
port
=
pci_resource_start
(
pdev
,
0
);
card
->
irq
=
pdev
->
irq
;
card
->
cardtype
=
avm_t1isa
;
card
->
cardnr
=
cardnr
++
;
card
->
cardnr
=
cardnr
;
sprintf
(
card
->
name
,
"t1isa-%x"
,
card
->
port
);
if
(
!
(((
card
->
port
&
0x7
)
==
0
)
&&
((
card
->
port
&
0x30
)
!=
0x30
)))
{
...
...
@@ -505,19 +504,20 @@ static struct capi_driver t1isa_driver = {
static
struct
pci_dev
isa_dev
[
MAX_CARDS
];
static
int
io
[
MAX_CARDS
];
static
int
irq
[
MAX_CARDS
];
static
int
cardnr
[
MAX_CARDS
];
MODULE_PARM
(
io
,
"1-"
__MODULE_STRING
(
MAX_CARDS
)
"i"
);
MODULE_PARM
(
irq
,
"1-"
__MODULE_STRING
(
MAX_CARDS
)
"i"
);
MODULE_PARM
(
cardnr
,
"1-"
__MODULE_STRING
(
MAX_CARDS
)
"i"
);
MODULE_PARM_DESC
(
io
,
"I/O base address(es)"
);
MODULE_PARM_DESC
(
irq
,
"IRQ number(s) (assigned)"
);
MODULE_PARM_DESC
(
cardnr
,
"Card number(s) (as jumpered)"
);
static
int
__init
t1isa_init
(
void
)
{
int
i
,
retval
;
int
found
=
0
;
MOD_INC_USE_COUNT
;
b1_set_revision
(
&
t1isa_driver
,
revision
);
attach_capi_driver
(
&
t1isa_driver
);
...
...
@@ -528,7 +528,7 @@ static int __init t1isa_init(void)
isa_dev
[
i
].
resource
[
0
].
start
=
io
[
i
];
isa_dev
[
i
].
irq_resource
[
0
].
start
=
irq
[
i
];
if
(
t1isa_probe
(
&
isa_dev
[
i
])
==
0
)
if
(
t1isa_probe
(
&
isa_dev
[
i
]
,
cardnr
[
i
]
)
==
0
)
found
++
;
}
if
(
found
==
0
)
{
...
...
@@ -541,7 +541,6 @@ static int __init t1isa_init(void)
err:
detach_capi_driver
(
&
t1isa_driver
);
out:
MOD_DEC_USE_COUNT
;
return
retval
;
}
...
...
drivers/isdn/hardware/avm/t1pci.c
View file @
3e12a6dc
...
...
@@ -239,8 +239,6 @@ static int __init t1pci_init(void)
{
int
retval
;
MOD_INC_USE_COUNT
;
b1_set_revision
(
&
t1pci_driver
,
revision
);
attach_capi_driver
(
&
t1pci_driver
);
...
...
@@ -256,7 +254,6 @@ static int __init t1pci_init(void)
err:
detach_capi_driver
(
&
t1pci_driver
);
out:
MOD_DEC_USE_COUNT
;
return
retval
;
}
...
...
include/linux/kernelcapi.h
View file @
3e12a6dc
...
...
@@ -49,40 +49,41 @@ typedef struct kcapi_carddef {
#include <linux/skbuff.h>
struct
capi_interface
{
__u16
(
*
capi_isinstalled
)
(
void
);
__u16
(
*
capi_register
)
(
capi_register_params
*
rparam
,
__u16
*
applidp
);
__u16
(
*
capi_release
)
(
__u16
applid
)
;
__u16
(
*
capi_put_message
)
(
__u16
applid
,
struct
sk_buff
*
msg
)
;
__u16
(
*
capi_get_message
)
(
__u16
applid
,
struct
sk_buff
**
msgp
);
__u16
(
*
capi_set_signal
)
(
__u16
applid
,
void
(
*
signal
)
(
__u16
applid
,
void
*
param
),
void
*
param
);
__u16
(
*
capi_get_manufacturer
)
(
__u32
contr
,
__u8
buf
[
CAPI_MANUFACTURER_LEN
])
;
__u16
(
*
capi_get_version
)
(
__u32
contr
,
struct
capi_version
*
verp
)
;
__u16
(
*
capi_get_serial
)
(
__u32
contr
,
__u8
serial
[
CAPI_SERIAL_LEN
])
;
__u16
(
*
capi_get_profile
)
(
__u32
contr
,
struct
capi_profile
*
profp
)
;
/*
*
to init controllers, data is always in user memory
#define KCI_CONTRUP 0
/* arg: struct capi_profile */
#define KCI_CONTRDOWN 1
/* arg: NULL */
struct
capi20_appl
{
u16
applid
;
capi_register_params
rparam
;
void
(
*
recv_message
)(
struct
capi20_appl
*
ap
,
struct
sk_buff
*
skb
);
void
*
private
;
/* internal to kernelcapi.o */
unsigned
long
nrecvctlpkt
;
unsigned
long
nrecvdatapkt
;
unsigned
long
nsentctlpkt
;
unsigned
long
nsentdatapkt
;
/*
ugly hack to allow for notification of added/removed
*
controllers. The Right Way (tm) is known. XXX
*/
int
(
*
capi_manufacturer
)
(
unsigned
int
cmd
,
void
*
data
);
void
(
*
callback
)
(
unsigned
int
cmd
,
__u32
contr
,
void
*
data
);
};
#define KCI_CONTRUP 0
/* struct capi_profile */
#define KCI_CONTRDOWN 1
/* NULL */
u16
capi20_isinstalled
(
void
);
u16
capi20_register
(
struct
capi20_appl
*
ap
);
u16
capi20_release
(
struct
capi20_appl
*
ap
);
u16
capi20_put_message
(
struct
capi20_appl
*
ap
,
struct
sk_buff
*
skb
);
u16
capi20_get_manufacturer
(
u32
contr
,
u8
buf
[
CAPI_MANUFACTURER_LEN
]);
u16
capi20_get_version
(
u32
contr
,
struct
capi_version
*
verp
);
u16
capi20_get_serial
(
u32
contr
,
u8
serial
[
CAPI_SERIAL_LEN
]);
u16
capi20_get_profile
(
u32
contr
,
struct
capi_profile
*
profp
);
int
capi20_manufacturer
(
unsigned
int
cmd
,
void
*
data
);
struct
capi_interface_user
{
char
name
[
20
];
void
(
*
callback
)
(
unsigned
int
cmd
,
__u32
contr
,
void
*
data
);
/* internal */
struct
list_head
user_list
;
};
/* temporary hack XXX */
void
capi20_set_callback
(
struct
capi20_appl
*
ap
,
void
(
*
callback
)
(
unsigned
int
cmd
,
__u32
contr
,
void
*
data
));
struct
capi_interface
*
attach_capi_interface
(
struct
capi_interface_user
*
);
int
detach_capi_interface
(
struct
capi_interface_user
*
);
#define CAPI_NOERROR 0x0000
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment