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
Kirill Smelkov
linux
Commits
c747c791
Commit
c747c791
authored
Mar 07, 2003
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Plain Diff
Merge
bk://linux-dj.bkbits.net/watchdog
into home.transmeta.com:/home/torvalds/v2.5/linux
parents
00b1533f
df081c08
Changes
44
Hide whitespace changes
Inline
Side-by-side
Showing
44 changed files
with
2409 additions
and
3111 deletions
+2409
-3111
drivers/isdn/hardware/avm/b1pci.c
drivers/isdn/hardware/avm/b1pci.c
+4
-0
drivers/isdn/hisax/amd7930.c
drivers/isdn/hisax/amd7930.c
+0
-717
drivers/isdn/hisax/asuscom.c
drivers/isdn/hisax/asuscom.c
+47
-34
drivers/isdn/hisax/avm_a1.c
drivers/isdn/hisax/avm_a1.c
+21
-20
drivers/isdn/hisax/avm_a1p.c
drivers/isdn/hisax/avm_a1p.c
+20
-12
drivers/isdn/hisax/avm_pci.c
drivers/isdn/hisax/avm_pci.c
+89
-60
drivers/isdn/hisax/bkm_a4t.c
drivers/isdn/hisax/bkm_a4t.c
+53
-47
drivers/isdn/hisax/config.c
drivers/isdn/hisax/config.c
+102
-174
drivers/isdn/hisax/diva.c
drivers/isdn/hisax/diva.c
+220
-187
drivers/isdn/hisax/elsa.c
drivers/isdn/hisax/elsa.c
+299
-259
drivers/isdn/hisax/enternow_pci.c
drivers/isdn/hisax/enternow_pci.c
+69
-67
drivers/isdn/hisax/gazel.c
drivers/isdn/hisax/gazel.c
+169
-204
drivers/isdn/hisax/hfc_pci.c
drivers/isdn/hisax/hfc_pci.c
+61
-63
drivers/isdn/hisax/hfc_sx.c
drivers/isdn/hisax/hfc_sx.c
+69
-57
drivers/isdn/hisax/hfcscard.c
drivers/isdn/hisax/hfcscard.c
+47
-38
drivers/isdn/hisax/hisax.h
drivers/isdn/hisax/hisax.h
+1
-249
drivers/isdn/hisax/hisax_fcclassic.c
drivers/isdn/hisax/hisax_fcclassic.c
+1
-1
drivers/isdn/hisax/hisax_fcpcipnp.c
drivers/isdn/hisax/hisax_fcpcipnp.c
+30
-26
drivers/isdn/hisax/hisax_isac.c
drivers/isdn/hisax/hisax_isac.c
+2
-2
drivers/isdn/hisax/hisax_isac.h
drivers/isdn/hisax/hisax_isac.h
+1
-1
drivers/isdn/hisax/isdnl1.c
drivers/isdn/hisax/isdnl1.c
+1
-1
drivers/isdn/hisax/isdnl1.h
drivers/isdn/hisax/isdnl1.h
+1
-1
drivers/isdn/hisax/isurf.c
drivers/isdn/hisax/isurf.c
+66
-69
drivers/isdn/hisax/ix1_micro.c
drivers/isdn/hisax/ix1_micro.c
+32
-22
drivers/isdn/hisax/mic.c
drivers/isdn/hisax/mic.c
+19
-11
drivers/isdn/hisax/niccy.c
drivers/isdn/hisax/niccy.c
+70
-55
drivers/isdn/hisax/nj_s.c
drivers/isdn/hisax/nj_s.c
+82
-79
drivers/isdn/hisax/nj_u.c
drivers/isdn/hisax/nj_u.c
+70
-73
drivers/isdn/hisax/s0box.c
drivers/isdn/hisax/s0box.c
+16
-9
drivers/isdn/hisax/saphir.c
drivers/isdn/hisax/saphir.c
+27
-23
drivers/isdn/hisax/sedlbauer.c
drivers/isdn/hisax/sedlbauer.c
+318
-232
drivers/isdn/hisax/sportster.c
drivers/isdn/hisax/sportster.c
+32
-31
drivers/isdn/hisax/teleint.c
drivers/isdn/hisax/teleint.c
+42
-36
drivers/isdn/hisax/teles0.c
drivers/isdn/hisax/teles0.c
+75
-52
drivers/isdn/hisax/teles3.c
drivers/isdn/hisax/teles3.c
+157
-99
drivers/isdn/hisax/telespci.c
drivers/isdn/hisax/telespci.c
+40
-34
drivers/isdn/hisax/w6692.c
drivers/isdn/hisax/w6692.c
+45
-55
drivers/isdn/i4l/Kconfig
drivers/isdn/i4l/Kconfig
+1
-1
drivers/isdn/i4l/isdn_net_lib.c
drivers/isdn/i4l/isdn_net_lib.c
+1
-0
drivers/isdn/i4l/isdn_ppp.c
drivers/isdn/i4l/isdn_ppp.c
+2
-2
drivers/isdn/i4l/isdn_ppp_mp.c
drivers/isdn/i4l/isdn_ppp_mp.c
+3
-2
drivers/isdn/i4l/isdn_ppp_mp.h
drivers/isdn/i4l/isdn_ppp_mp.h
+3
-3
kernel/ksyms.c
kernel/ksyms.c
+0
-2
kernel/sched.c
kernel/sched.c
+1
-1
No files found.
drivers/isdn/hardware/avm/b1pci.c
View file @
c747c791
...
...
@@ -343,12 +343,16 @@ static int __devinit b1pci_pci_probe(struct pci_dev *pdev,
static
void
__devexit
b1pci_pci_remove
(
struct
pci_dev
*
pdev
)
{
#ifdef CONFIG_ISDN_DRV_AVMB1_B1PCIV4
avmcard
*
card
=
pci_get_drvdata
(
pdev
);
if
(
card
->
dma
)
b1pciv4_remove
(
pdev
);
else
b1pci_remove
(
pdev
);
#else
b1pci_remove
(
pdev
);
#endif
}
static
struct
pci_driver
b1pci_pci_driver
=
{
...
...
drivers/isdn/hisax/amd7930.c
deleted
100644 → 0
View file @
00b1533f
/* $Id: amd7930.c,v 1.5.6.4 2001/09/23 22:24:46 kai Exp $
*
* HiSax ISDN driver - chip specific routines for AMD 7930
*
* Author Brent Baccala
* Copyright by Brent Baccala <baccala@FreeSoft.org>
*
* This software may be used and distributed according to the terms
* of the GNU General Public License, incorporated herein by reference.
*
* - Existing ISDN HiSax driver provides all the smarts
* - it compiles, runs, talks to an isolated phone switch, connects
* to a Cisco, pings go through
* - AMD 7930 support only (no DBRI yet)
* - no US NI-1 support (may not work on US phone system - untested)
* - periodic packet loss, apparently due to lost interrupts
* - ISDN sometimes freezes, requiring reboot before it will work again
*
* The code is unreliable enough to be consider alpha
*
* This file is (c) under GNU General Public License
*
* Advanced Micro Devices' Am79C30A is an ISDN/audio chip used in the
* SparcStation 1+. The chip provides microphone and speaker interfaces
* which provide mono-channel audio at 8K samples per second via either
* 8-bit A-law or 8-bit mu-law encoding. Also, the chip features an
* ISDN BRI Line Interface Unit (LIU), I.430 S/T physical interface,
* which performs basic D channel LAPD processing and provides raw
* B channel data. The digital audio channel, the two ISDN B channels,
* and two 64 Kbps channels to the microprocessor are all interconnected
* via a multiplexer.
*
* This driver interfaces to the Linux HiSax ISDN driver, which performs
* all high-level Q.921 and Q.931 ISDN functions. The file is not
* itself a hardware driver; rather it uses functions exported by
* the AMD7930 driver in the sparcaudio subsystem (drivers/sbus/audio),
* allowing the chip to be simultaneously used for both audio and ISDN data.
* The hardware driver does _no_ buffering, but provides several callbacks
* which are called during interrupt service and should therefore run quickly.
*
* D channel transmission is performed by passing the hardware driver the
* address and size of an skb's data area, then waiting for a callback
* to signal successful transmission of the packet. A task is then
* queued to notify the HiSax driver that another packet may be transmitted.
*
* D channel reception is quite simple, mainly because of:
* 1) the slow speed of the D channel - 16 kbps, and
* 2) the presence of an 8- or 32-byte (depending on chip version) FIFO
* to buffer the D channel data on the chip
* Worst case scenario of back-to-back packets with the 8 byte buffer
* at 16 kbps yields an service time of 4 ms - long enough to preclude
* the need for fancy buffering. We queue a background task that copies
* data out of the receive buffer into an skb, and the hardware driver
* simply does nothing until we're done with the receive buffer and
* reset it for a new packet.
*
* B channel processing is more complex, because of:
* 1) the faster speed - 64 kbps,
* 2) the lack of any on-chip buffering (it interrupts for every byte), and
* 3) the lack of any chip support for HDLC encapsulation
*
* The HiSax driver can put each B channel into one of three modes -
* L1_MODE_NULL (channel disabled), L1_MODE_TRANS (transparent data relay),
* and L1_MODE_HDLC (HDLC encapsulation by low-level driver).
* L1_MODE_HDLC is the most common, used for almost all "pure" digital
* data sessions. L1_MODE_TRANS is used for ISDN audio.
*
* HDLC B channel transmission is performed via a large buffer into
* which the skb is copied while performing HDLC bit-stuffing. A CRC
* is computed and attached to the end of the buffer, which is then
* passed to the low-level routines for raw transmission. Once
* transmission is complete, the hardware driver is set to enter HDLC
* idle by successive transmission of mark (all 1) bytes, waiting for
* the ISDN driver to prepare another packet for transmission and
* deliver it.
*
* HDLC B channel reception is performed via an X-byte ring buffer
* divided into N sections of X/N bytes each. Defaults: X=256 bytes, N=4.
* As the hardware driver notifies us that each section is full, we
* hand it the next section and schedule a background task to peruse
* the received section, bit-by-bit, with an HDLC decoder. As
* packets are detected, they are copied into a large buffer while
* decoding HDLC bit-stuffing. The ending CRC is verified, and if
* it is correct, we alloc a new skb of the correct length (which we
* now know), copy the packet into it, and hand it to the upper layers.
* Optimization: for large packets, we hand the buffer (which also
* happens to be an skb) directly to the upper layer after an skb_trim,
* and alloc a new large buffer for future packets, thus avoiding a copy.
* Then we return to HDLC processing; state is saved between calls.
*
*/
#include "hisax.h"
#include "../../sbus/audio/amd7930.h"
#include "isac.h"
#include "isdnl1.h"
#include "rawhdlc.h"
#include <linux/interrupt.h>
static
const
char
*
amd7930_revision
=
"$Revision: 1.5.6.4 $"
;
#define RCV_BUFSIZE 1024
/* Size of raw receive buffer in bytes */
#define RCV_BUFBLKS 4
/* Number of blocks to divide buffer into
* (must divide RCV_BUFSIZE) */
static
void
Bchan_fill_fifo
(
struct
BCState
*
,
struct
sk_buff
*
);
static
void
Bchan_xmt_bh
(
void
*
data
)
{
struct
BCState
*
bcs
=
data
;
struct
sk_buff
*
skb
;
if
(
bcs
->
hw
.
amd7930
.
tx_skb
!=
NULL
)
{
dev_kfree_skb
(
bcs
->
hw
.
amd7930
.
tx_skb
);
bcs
->
hw
.
amd7930
.
tx_skb
=
NULL
;
}
xmit_ready_b
(
bcs
);
}
static
void
Bchan_xmit_callback
(
struct
BCState
*
bcs
)
{
schedule_work
(
&
bcs
->
hw
.
amd7930
.
xmt_work
);
}
/* B channel transmission: two modes (three, if you count L1_MODE_NULL)
*
* L1_MODE_HDLC - We need to do HDLC encapsulation before transmiting
* the packet (i.e. make_raw_hdlc_data). Since this can be a
* time-consuming operation, our completion callback just schedules
* a bottom half to do encapsulation for the next packet. In between,
* the link will just idle
*
* L1_MODE_TRANS - Data goes through, well, transparent. No HDLC encap,
* and we can't just let the link idle, so the "bottom half" actually
* gets called during the top half (it's our callback routine in this case),
* but it's a lot faster now since we don't call make_raw_hdlc_data
*/
static
void
Bchan_fill_fifo
(
struct
BCState
*
bcs
,
struct
sk_buff
*
skb
)
{
struct
IsdnCardState
*
cs
=
bcs
->
cs
;
int
len
;
if
((
cs
->
debug
&
L1_DEB_HSCX
)
||
(
cs
->
debug
&
L1_DEB_HSCX_FIFO
))
{
char
tmp
[
1024
];
char
*
t
=
tmp
;
t
+=
sprintf
(
t
,
"amd7930_fill_fifo %c cnt %d"
,
bcs
->
channel
?
'B'
:
'A'
,
skb
->
len
);
if
(
cs
->
debug
&
L1_DEB_HSCX_FIFO
)
QuickHex
(
t
,
skb
->
data
,
skb
->
len
);
debugl1
(
cs
,
tmp
);
}
if
(
bcs
->
mode
==
L1_MODE_HDLC
)
{
len
=
make_raw_hdlc_data
(
skb
->
data
,
skb
->
len
,
bcs
->
hw
.
amd7930
.
tx_buff
,
RAW_BUFMAX
);
if
(
len
>
0
)
amd7930_bxmit
(
0
,
bcs
->
channel
,
bcs
->
hw
.
amd7930
.
tx_buff
,
len
,
(
void
*
)
&
Bchan_xmit_callback
,
(
void
*
)
bcs
);
dev_kfree_skb
(
skb
);
}
else
if
(
bcs
->
mode
==
L1_MODE_TRANS
)
{
amd7930_bxmit
(
0
,
bcs
->
channel
,
bcs
->
hw
.
amd7930
.
tx_buff
,
skb
->
len
,
(
void
*
)
&
Bchan_xmt_bh
,
(
void
*
)
bcs
);
bcs
->
hw
.
amd7930
.
tx_skb
=
skb
;
}
else
{
dev_kfree_skb
(
skb
);
}
}
static
void
Bchan_mode
(
struct
BCState
*
bcs
,
int
mode
,
int
bc
)
{
struct
IsdnCardState
*
cs
=
bcs
->
cs
;
if
(
cs
->
debug
&
L1_DEB_HSCX
)
{
char
tmp
[
40
];
sprintf
(
tmp
,
"AMD 7930 mode %d bchan %d/%d"
,
mode
,
bc
,
bcs
->
channel
);
debugl1
(
cs
,
tmp
);
}
bcs
->
mode
=
mode
;
}
/* Bchan_l2l1 is the entry point for upper layer routines that want to
* transmit on the B channel. PH_DATA_REQ is a normal packet that
* we either start transmitting (if idle) or queue (if busy).
* PH_PULL_REQ can be called to request a callback message (PH_PULL_CNF)
* once the link is idle. After a "pull" callback, the upper layer
* routines can use PH_PULL_IND to send data.
*/
static
void
Bchan_l2l1
(
struct
PStack
*
st
,
int
pr
,
void
*
arg
)
{
struct
sk_buff
*
skb
=
arg
;
switch
(
pr
)
{
case
(
PH_DATA_REQ
):
if
(
test_bit
(
BC_FLG_BUSY
,
&
st
->
l1
.
bcs
->
Flag
))
{
skb_queue_tail
(
&
st
->
l1
.
bcs
->
squeue
,
skb
);
}
else
{
test_and_set_bit
(
BC_FLG_BUSY
,
&
st
->
l1
.
bcs
->
Flag
);
Bchan_fill_fifo
(
st
->
l1
.
bcs
,
skb
);
}
break
;
case
(
PH_PULL_IND
):
if
(
test_bit
(
BC_FLG_BUSY
,
&
st
->
l1
.
bcs
->
Flag
))
{
printk
(
KERN_WARNING
"amd7930: this shouldn't happen
\n
"
);
break
;
}
test_and_set_bit
(
BC_FLG_BUSY
,
&
st
->
l1
.
bcs
->
Flag
);
Bchan_fill_fifo
(
st
->
l1
.
bcs
,
skb
);
break
;
case
(
PH_PULL_REQ
):
if
(
!
test_bit
(
BC_FLG_BUSY
,
&
st
->
l1
.
bcs
->
Flag
))
{
clear_bit
(
FLG_L1_PULL_REQ
,
&
st
->
l1
.
Flags
);
st
->
l1
.
l1l2
(
st
,
PH_PULL_CNF
,
NULL
);
}
else
set_bit
(
FLG_L1_PULL_REQ
,
&
st
->
l1
.
Flags
);
break
;
}
}
/* Receiver callback and bottom half - decodes HDLC at leisure (if
* L1_MODE_HDLC) and passes newly received skb on via bcs->rqueue. If
* a large packet is received, stick rv_skb (the buffer that the
* packet has been decoded into) on the receive queue and alloc a new
* (large) skb to act as buffer for future receives. If a small
* packet is received, leave rv_skb alone, alloc a new skb of the
* correct size, and copy the packet into it
*/
static
void
Bchan_recv_callback
(
struct
BCState
*
bcs
)
{
struct
amd7930_hw
*
hw
=
&
bcs
->
hw
.
amd7930
;
hw
->
rv_buff_in
+=
RCV_BUFSIZE
/
RCV_BUFBLKS
;
hw
->
rv_buff_in
%=
RCV_BUFSIZE
;
if
(
hw
->
rv_buff_in
!=
hw
->
rv_buff_out
)
{
amd7930_brecv
(
0
,
bcs
->
channel
,
hw
->
rv_buff
+
hw
->
rv_buff_in
,
RCV_BUFSIZE
/
RCV_BUFBLKS
,
(
void
*
)
&
Bchan_recv_callback
,
(
void
*
)
bcs
);
}
schedule_work
(
&
hw
->
rcv_work
);
}
static
void
Bchan_rcv_bh
(
void
*
data
)
{
struct
BCState
*
bcs
=
data
;
struct
IsdnCardState
*
cs
=
bcs
->
cs
;
struct
amd7930_hw
*
hw
=
&
bcs
->
hw
.
amd7930
;
struct
sk_buff
*
skb
;
int
len
;
if
(
cs
->
debug
&
L1_DEB_HSCX
)
{
char
tmp
[
1024
];
sprintf
(
tmp
,
"amd7930_Bchan_rcv (%d/%d)"
,
hw
->
rv_buff_in
,
hw
->
rv_buff_out
);
debugl1
(
cs
,
tmp
);
QuickHex
(
tmp
,
hw
->
rv_buff
+
hw
->
rv_buff_out
,
RCV_BUFSIZE
/
RCV_BUFBLKS
);
debugl1
(
cs
,
tmp
);
}
do
{
if
(
bcs
->
mode
==
L1_MODE_HDLC
)
{
while
((
len
=
read_raw_hdlc_data
(
hw
->
hdlc_state
,
hw
->
rv_buff
+
hw
->
rv_buff_out
,
RCV_BUFSIZE
/
RCV_BUFBLKS
,
hw
->
rv_skb
->
tail
,
HSCX_BUFMAX
)))
{
if
(
len
>
0
&&
(
cs
->
debug
&
L1_DEB_HSCX_FIFO
))
{
char
tmp
[
1024
];
char
*
t
=
tmp
;
t
+=
sprintf
(
t
,
"amd7930_Bchan_rcv %c cnt %d"
,
bcs
->
channel
?
'B'
:
'A'
,
len
);
QuickHex
(
t
,
hw
->
rv_skb
->
tail
,
len
);
debugl1
(
cs
,
tmp
);
}
if
(
len
>
HSCX_BUFMAX
/
2
)
{
/* Large packet received */
if
(
!
(
skb
=
dev_alloc_skb
(
HSCX_BUFMAX
)))
{
printk
(
KERN_WARNING
"amd7930: receive out of memory"
);
}
else
{
skb_put
(
hw
->
rv_skb
,
len
);
skb_queue_tail
(
&
bcs
->
rqueue
,
hw
->
rv_skb
);
hw
->
rv_skb
=
skb
;
bcs
->
event
|=
1
<<
B_RCVBUFREADY
;
schedule_work
(
&
bcs
->
work
);
}
}
else
if
(
len
>
0
)
{
/* Small packet received */
if
(
!
(
skb
=
dev_alloc_skb
(
len
)))
{
printk
(
KERN_WARNING
"amd7930: receive out of memory
\n
"
);
}
else
{
memcpy
(
skb_put
(
skb
,
len
),
hw
->
rv_skb
->
tail
,
len
);
skb_queue_tail
(
&
bcs
->
rqueue
,
skb
);
bcs
->
event
|=
1
<<
B_RCVBUFREADY
;
schedule_work
(
&
bcs
->
work
);
}
}
else
{
/* Reception Error */
/* printk("amd7930: B channel receive error\n"); */
}
}
}
else
if
(
bcs
->
mode
==
L1_MODE_TRANS
)
{
if
(
!
(
skb
=
dev_alloc_skb
(
RCV_BUFSIZE
/
RCV_BUFBLKS
)))
{
printk
(
KERN_WARNING
"amd7930: receive out of memory
\n
"
);
}
else
{
memcpy
(
skb_put
(
skb
,
RCV_BUFSIZE
/
RCV_BUFBLKS
),
hw
->
rv_buff
+
hw
->
rv_buff_out
,
RCV_BUFSIZE
/
RCV_BUFBLKS
);
skb_queue_tail
(
&
bcs
->
rqueue
,
skb
);
bcs
->
event
|=
1
<<
B_RCVBUFREADY
;
schedule_work
(
&
bcs
->
work
);
}
}
if
(
hw
->
rv_buff_in
==
hw
->
rv_buff_out
)
{
/* Buffer was filled up - need to restart receiver */
amd7930_brecv
(
0
,
bcs
->
channel
,
hw
->
rv_buff
+
hw
->
rv_buff_in
,
RCV_BUFSIZE
/
RCV_BUFBLKS
,
(
void
*
)
&
Bchan_recv_callback
,
(
void
*
)
bcs
);
}
hw
->
rv_buff_out
+=
RCV_BUFSIZE
/
RCV_BUFBLKS
;
hw
->
rv_buff_out
%=
RCV_BUFSIZE
;
}
while
(
hw
->
rv_buff_in
!=
hw
->
rv_buff_out
);
}
static
void
Bchan_close
(
struct
BCState
*
bcs
)
{
struct
sk_buff
*
skb
;
Bchan_mode
(
bcs
,
0
,
0
);
amd7930_bclose
(
0
,
bcs
->
channel
);
if
(
test_bit
(
BC_FLG_INIT
,
&
bcs
->
Flag
))
{
skb_queue_purge
(
&
bcs
->
rqueue
);
skb_queue_purge
(
&
bcs
->
squeue
);
}
test_and_clear_bit
(
BC_FLG_INIT
,
&
bcs
->
Flag
);
}
static
int
Bchan_open
(
struct
BCState
*
bcs
)
{
struct
amd7930_hw
*
hw
=
&
bcs
->
hw
.
amd7930
;
if
(
!
test_and_set_bit
(
BC_FLG_INIT
,
&
bcs
->
Flag
))
{
skb_queue_head_init
(
&
bcs
->
rqueue
);
skb_queue_head_init
(
&
bcs
->
squeue
);
}
test_and_clear_bit
(
BC_FLG_BUSY
,
&
bcs
->
Flag
);
amd7930_bopen
(
0
,
bcs
->
channel
,
0xff
);
hw
->
rv_buff_in
=
0
;
hw
->
rv_buff_out
=
0
;
hw
->
tx_skb
=
NULL
;
init_hdlc_state
(
hw
->
hdlc_state
,
0
);
amd7930_brecv
(
0
,
bcs
->
channel
,
hw
->
rv_buff
+
hw
->
rv_buff_in
,
RCV_BUFSIZE
/
RCV_BUFBLKS
,
(
void
*
)
&
Bchan_recv_callback
,
(
void
*
)
bcs
);
bcs
->
event
=
0
;
bcs
->
tx_cnt
=
0
;
return
(
0
);
}
static
void
Bchan_init
(
struct
BCState
*
bcs
)
{
if
(
!
(
bcs
->
hw
.
amd7930
.
tx_buff
=
kmalloc
(
RAW_BUFMAX
,
GFP_ATOMIC
)))
{
printk
(
KERN_WARNING
"HiSax: No memory for amd7930.tx_buff
\n
"
);
return
;
}
if
(
!
(
bcs
->
hw
.
amd7930
.
rv_buff
=
kmalloc
(
RCV_BUFSIZE
,
GFP_ATOMIC
)))
{
printk
(
KERN_WARNING
"HiSax: No memory for amd7930.rv_buff
\n
"
);
return
;
}
if
(
!
(
bcs
->
hw
.
amd7930
.
rv_skb
=
dev_alloc_skb
(
HSCX_BUFMAX
)))
{
printk
(
KERN_WARNING
"HiSax: No memory for amd7930.rv_skb
\n
"
);
return
;
}
if
(
!
(
bcs
->
hw
.
amd7930
.
hdlc_state
=
kmalloc
(
sizeof
(
struct
hdlc_state
),
GFP_ATOMIC
)))
{
printk
(
KERN_WARNING
"HiSax: No memory for amd7930.hdlc_state
\n
"
);
return
;
}
INIT_WORK
(
&
bcs
->
hw
.
amd7930
.
rcv_work
,
&
Bchan_rcv_bh
,
bcs
);
INIT_WORK
(
&
bcs
->
hw
.
amd7930
.
xmt_work
,
&
Bchan_xmt_bh
,
bcs
);
}
static
void
Bchan_manl1
(
struct
PStack
*
st
,
int
pr
,
void
*
arg
)
{
switch
(
pr
)
{
case
(
PH_ACTIVATE_REQ
):
test_and_set_bit
(
BC_FLG_ACTIV
,
&
st
->
l1
.
bcs
->
Flag
);
Bchan_mode
(
st
->
l1
.
bcs
,
st
->
l1
.
mode
,
st
->
l1
.
bc
);
st
->
l1
.
l1man
(
st
,
PH_ACTIVATE_CNF
,
NULL
);
break
;
case
(
PH_DEACTIVATE_REQ
):
if
(
!
test_bit
(
BC_FLG_BUSY
,
&
st
->
l1
.
bcs
->
Flag
))
Bchan_mode
(
st
->
l1
.
bcs
,
0
,
0
);
test_and_clear_bit
(
BC_FLG_ACTIV
,
&
st
->
l1
.
bcs
->
Flag
);
break
;
}
}
int
setstack_amd7930
(
struct
PStack
*
st
,
struct
BCState
*
bcs
)
{
if
(
Bchan_open
(
bcs
))
return
(
-
1
);
st
->
l1
.
bcs
=
bcs
;
st
->
l2
.
l2l1
=
Bchan_l2l1
;
st
->
ma
.
manl1
=
Bchan_manl1
;
setstack_manager
(
st
);
bcs
->
st
=
st
;
return
(
0
);
}
static
void
amd7930_drecv_callback
(
void
*
arg
,
int
error
,
unsigned
int
count
)
{
struct
IsdnCardState
*
cs
=
(
struct
IsdnCardState
*
)
arg
;
static
struct
work_struct
task
;
struct
sk_buff
*
skb
;
/* NOTE: This function is called directly from an interrupt handler */
if
(
1
)
{
if
(
!
(
skb
=
alloc_skb
(
count
,
GFP_ATOMIC
)))
printk
(
KERN_WARNING
"HiSax: D receive out of memory
\n
"
);
else
{
memcpy
(
skb_put
(
skb
,
count
),
cs
->
rcvbuf
,
count
);
skb_queue_tail
(
&
cs
->
rq
,
skb
);
}
INIT_WORK
(
&
task
,
(
void
*
)
DChannel_proc_rcv
,
(
void
*
)
cs
);
schedule_work
(
&
task
);
}
if
(
cs
->
debug
&
L1_DEB_ISAC_FIFO
)
{
char
tmp
[
128
];
char
*
t
=
tmp
;
t
+=
sprintf
(
t
,
"amd7930 Drecv cnt %d"
,
count
);
if
(
error
)
t
+=
sprintf
(
t
,
" ERR %x"
,
error
);
QuickHex
(
t
,
cs
->
rcvbuf
,
count
);
debugl1
(
cs
,
tmp
);
}
amd7930_drecv
(
0
,
cs
->
rcvbuf
,
MAX_DFRAME_LEN
,
&
amd7930_drecv_callback
,
cs
);
}
static
void
amd7930_dxmit_callback
(
void
*
arg
,
int
error
)
{
struct
IsdnCardState
*
cs
=
(
struct
IsdnCardState
*
)
arg
;
static
struct
work_struct
task
;
/* NOTE: This function is called directly from an interrupt handler */
/* may wish to do retransmission here, if error indicates collision */
if
(
cs
->
debug
&
L1_DEB_ISAC_FIFO
)
{
char
tmp
[
128
];
char
*
t
=
tmp
;
t
+=
sprintf
(
t
,
"amd7930 Dxmit cnt %d"
,
cs
->
tx_skb
->
len
);
if
(
error
)
t
+=
sprintf
(
t
,
" ERR %x"
,
error
);
QuickHex
(
t
,
cs
->
tx_skb
->
data
,
cs
->
tx_skb
->
len
);
debugl1
(
cs
,
tmp
);
}
cs
->
tx_skb
=
NULL
;
INIT_WORK
(
&
task
,
(
void
*
)
DChannel_proc_xmt
,
(
void
*
)
cs
);
schedule_work
(
&
task
);
}
static
void
amd7930_Dchan_l2l1
(
struct
PStack
*
st
,
int
pr
,
void
*
arg
)
{
struct
IsdnCardState
*
cs
=
(
struct
IsdnCardState
*
)
st
->
l1
.
hardware
;
struct
sk_buff
*
skb
=
arg
;
char
str
[
64
];
switch
(
pr
)
{
case
(
PH_DATA_REQ
):
if
(
cs
->
tx_skb
)
{
skb_queue_tail
(
&
cs
->
sq
,
skb
);
#ifdef L2FRAME_DEBUG
/* psa */
if
(
cs
->
debug
&
L1_DEB_LAPD
)
Logl2Frame
(
cs
,
skb
,
"PH_DATA Queued"
,
0
);
#endif
}
else
{
if
((
cs
->
dlogflag
)
&&
(
!
(
skb
->
data
[
2
]
&
1
)))
{
/* I-FRAME */
LogFrame
(
cs
,
skb
->
data
,
skb
->
len
);
sprintf
(
str
,
"Q.931 frame user->network tei %d"
,
st
->
l2
.
tei
);
dlogframe
(
cs
,
skb
->
data
+
4
,
skb
->
len
-
4
,
str
);
}
cs
->
tx_skb
=
skb
;
cs
->
tx_cnt
=
0
;
#ifdef L2FRAME_DEBUG
/* psa */
if
(
cs
->
debug
&
L1_DEB_LAPD
)
Logl2Frame
(
cs
,
skb
,
"PH_DATA"
,
0
);
#endif
amd7930_dxmit
(
0
,
skb
->
data
,
skb
->
len
,
&
amd7930_dxmit_callback
,
cs
);
}
break
;
case
(
PH_PULL_IND
):
if
(
cs
->
tx_skb
)
{
if
(
cs
->
debug
&
L1_DEB_WARN
)
debugl1
(
cs
,
" l2l1 tx_skb exist this shouldn't happen"
);
skb_queue_tail
(
&
cs
->
sq
,
skb
);
break
;
}
if
((
cs
->
dlogflag
)
&&
(
!
(
skb
->
data
[
2
]
&
1
)))
{
/* I-FRAME */
LogFrame
(
cs
,
skb
->
data
,
skb
->
len
);
sprintf
(
str
,
"Q.931 frame user->network tei %d"
,
st
->
l2
.
tei
);
dlogframe
(
cs
,
skb
->
data
+
4
,
skb
->
len
-
4
,
str
);
}
cs
->
tx_skb
=
skb
;
cs
->
tx_cnt
=
0
;
#ifdef L2FRAME_DEBUG
/* psa */
if
(
cs
->
debug
&
L1_DEB_LAPD
)
Logl2Frame
(
cs
,
skb
,
"PH_DATA_PULLED"
,
0
);
#endif
amd7930_dxmit
(
0
,
cs
->
tx_skb
->
data
,
cs
->
tx_skb
->
len
,
&
amd7930_dxmit_callback
,
cs
);
break
;
case
(
PH_PULL_REQ
):
#ifdef L2FRAME_DEBUG
/* psa */
if
(
cs
->
debug
&
L1_DEB_LAPD
)
debugl1
(
cs
,
"-> PH_REQUEST_PULL"
);
#endif
if
(
!
cs
->
tx_skb
)
{
test_and_clear_bit
(
FLG_L1_PULL_REQ
,
&
st
->
l1
.
Flags
);
st
->
l1
.
l1l2
(
st
,
PH_PULL_CNF
,
NULL
);
}
else
test_and_set_bit
(
FLG_L1_PULL_REQ
,
&
st
->
l1
.
Flags
);
break
;
}
}
int
setDstack_amd7930
(
struct
PStack
*
st
,
struct
IsdnCardState
*
cs
)
{
st
->
l2
.
l2l1
=
amd7930_Dchan_l2l1
;
if
(
!
cs
->
rcvbuf
)
{
printk
(
"setDstack_amd7930: No cs->rcvbuf!
\n
"
);
}
else
{
amd7930_drecv
(
0
,
cs
->
rcvbuf
,
MAX_DFRAME_LEN
,
&
amd7930_drecv_callback
,
cs
);
}
return
(
0
);
}
static
void
manl1_msg
(
struct
IsdnCardState
*
cs
,
int
msg
,
void
*
arg
)
{
struct
PStack
*
st
;
st
=
cs
->
stlist
;
while
(
st
)
{
st
->
ma
.
manl1
(
st
,
msg
,
arg
);
st
=
st
->
next
;
}
}
static
void
amd7930_new_ph
(
struct
IsdnCardState
*
cs
)
{
switch
(
amd7930_get_liu_state
(
0
))
{
case
3
:
manl1_msg
(
cs
,
PH_POWERUP_CNF
,
NULL
);
break
;
case
7
:
manl1_msg
(
cs
,
PH_I4_P8_IND
,
NULL
);
break
;
case
8
:
manl1_msg
(
cs
,
PH_RSYNC_IND
,
NULL
);
break
;
}
}
/* amd7930 LIU state change callback */
static
void
amd7930_liu_callback
(
struct
IsdnCardState
*
cs
)
{
static
struct
work_struct
task
;
if
(
!
cs
)
return
;
if
(
cs
->
debug
&
L1_DEB_ISAC
)
{
char
tmp
[
32
];
sprintf
(
tmp
,
"amd7930_liu state %d"
,
amd7930_get_liu_state
(
0
));
debugl1
(
cs
,
tmp
);
}
INIT_WORK
(
&
task
,
(
void
*
)
&
amd7930_new_ph
,
(
void
*
)
cs
);
schedule_work
(
&
task
);
}
void
amd7930_l1cmd
(
struct
IsdnCardState
*
cs
,
int
msg
,
void
*
arg
)
{
u8
val
;
char
tmp
[
32
];
if
(
cs
->
debug
&
L1_DEB_ISAC
)
{
char
tmp
[
32
];
sprintf
(
tmp
,
"amd7930_l1cmd msg %x"
,
msg
);
debugl1
(
cs
,
tmp
);
}
switch
(
msg
)
{
case
PH_RESET_REQ
:
if
(
amd7930_get_liu_state
(
0
)
<=
3
)
amd7930_liu_activate
(
0
,
0
);
else
amd7930_liu_deactivate
(
0
);
break
;
case
PH_ENABLE_REQ
:
break
;
case
PH_INFO3_REQ
:
amd7930_liu_activate
(
0
,
0
);
break
;
case
PH_TESTLOOP_REQ
:
break
;
default:
if
(
cs
->
debug
&
L1_DEB_WARN
)
{
sprintf
(
tmp
,
"amd7930_l1cmd unknown %4x"
,
msg
);
debugl1
(
cs
,
tmp
);
}
break
;
}
}
static
void
init_amd7930
(
struct
IsdnCardState
*
cs
)
{
Bchan_init
(
&
cs
->
bcs
[
0
]);
Bchan_init
(
&
cs
->
bcs
[
1
]);
cs
->
bcs
[
0
].
BC_SetStack
=
setstack_amd7930
;
cs
->
bcs
[
1
].
BC_SetStack
=
setstack_amd7930
;
cs
->
bcs
[
0
].
BC_Close
=
Bchan_close
;
cs
->
bcs
[
1
].
BC_Close
=
Bchan_close
;
Bchan_mode
(
cs
->
bcs
,
0
,
0
);
Bchan_mode
(
cs
->
bcs
+
1
,
0
,
0
);
}
static
int
amd7930_init
(
struct
IsdnCardState
*
cs
)
{
cs
->
l1cmd
=
amd7930_l1cmd
;
amd7930_liu_init
(
0
,
&
amd7930_liu_callback
,
(
void
*
)
cs
);
init_amd7930
(
cs
);
return
0
;
}
static
struct
card_ops
amd7930_ops
=
{
.
init
=
amd7930_init
,
};
int
__init
setup_amd7930
(
struct
IsdnCard
*
card
)
{
struct
IsdnCardState
*
cs
=
card
->
cs
;
char
tmp
[
64
];
strcpy
(
tmp
,
amd7930_revision
);
printk
(
KERN_INFO
"HiSax: AMD7930 driver Rev. %s
\n
"
,
HiSax_getrev
(
tmp
));
cs
->
irq
=
amd7930_get_irqnum
(
0
);
if
(
cs
->
irq
==
0
)
return
0
;
cs
->
card_ops
=
&
amd7930_ops
;
return
1
;
}
drivers/isdn/hisax/asuscom.c
View file @
c747c791
...
...
@@ -231,6 +231,51 @@ static struct card_ops asuscom_ipac_ops = {
.
irq_func
=
ipac_irq
,
};
static
int
__init
asuscom_probe
(
struct
IsdnCardState
*
cs
,
struct
IsdnCard
*
card
)
{
int
rc
;
u8
val
;
printk
(
KERN_INFO
"ISDNLink: defined at %#lx IRQ %lu
\n
"
,
card
->
para
[
1
],
card
->
para
[
0
]);
cs
->
hw
.
asus
.
cfg_reg
=
card
->
para
[
1
];
cs
->
irq
=
card
->
para
[
0
];
rc
=
-
EBUSY
;
if
(
!
request_io
(
&
cs
->
rs
,
cs
->
hw
.
asus
.
cfg_reg
,
8
,
"asuscom isdn"
))
goto
err
;
rc
=
-
ENODEV
;
cs
->
hw
.
asus
.
adr
=
cs
->
hw
.
asus
.
cfg_reg
+
ASUS_IPAC_ALE
;
val
=
readreg
(
cs
,
cs
->
hw
.
asus
.
cfg_reg
+
ASUS_IPAC_DATA
,
IPAC_ID
);
if
((
val
==
1
)
||
(
val
==
2
))
{
cs
->
subtyp
=
ASUS_IPAC
;
cs
->
card_ops
=
&
asuscom_ipac_ops
;
cs
->
hw
.
asus
.
isac
=
cs
->
hw
.
asus
.
cfg_reg
+
ASUS_IPAC_DATA
;
if
(
ipac_setup
(
cs
,
&
ipac_dc_ops
,
&
ipac_bc_ops
))
goto
err
;
}
else
{
cs
->
subtyp
=
ASUS_ISACHSCX
;
cs
->
card_ops
=
&
asuscom_ops
;
cs
->
hw
.
asus
.
adr
=
cs
->
hw
.
asus
.
cfg_reg
+
ASUS_ADR
;
cs
->
hw
.
asus
.
isac
=
cs
->
hw
.
asus
.
cfg_reg
+
ASUS_ISAC
;
cs
->
hw
.
asus
.
hscx
=
cs
->
hw
.
asus
.
cfg_reg
+
ASUS_HSCX
;
cs
->
hw
.
asus
.
u7
=
cs
->
hw
.
asus
.
cfg_reg
+
ASUS_CTRL_U7
;
cs
->
hw
.
asus
.
pots
=
cs
->
hw
.
asus
.
cfg_reg
+
ASUS_CTRL_POTS
;
if
(
hscxisac_setup
(
cs
,
&
isac_ops
,
&
hscx_ops
))
goto
err
;
}
printk
(
KERN_INFO
"ISDNLink: resetting card
\n
"
);
cs
->
card_ops
->
reset
(
cs
);
return
0
;
err:
hisax_release_resources
(
cs
);
return
rc
;
}
#ifdef __ISAPNP__
static
struct
isapnp_device_id
asus_ids
[]
__initdata
=
{
{
ISAPNP_VENDOR
(
'A'
,
'S'
,
'U'
),
ISAPNP_FUNCTION
(
0x1688
),
...
...
@@ -255,9 +300,6 @@ static struct pnp_card *pnp_c __devinitdata = NULL;
int
__init
setup_asuscom
(
struct
IsdnCard
*
card
)
{
int
bytecnt
;
struct
IsdnCardState
*
cs
=
card
->
cs
;
u8
val
;
char
tmp
[
64
];
strcpy
(
tmp
,
Asuscom_revision
);
...
...
@@ -310,36 +352,7 @@ setup_asuscom(struct IsdnCard *card)
}
}
#endif
bytecnt
=
8
;
cs
->
hw
.
asus
.
cfg_reg
=
card
->
para
[
1
];
cs
->
irq
=
card
->
para
[
0
];
if
(
!
request_io
(
&
cs
->
rs
,
cs
->
hw
.
asus
.
cfg_reg
,
bytecnt
,
"asuscom isdn"
))
goto
err
;
printk
(
KERN_INFO
"ISDNLink: defined at 0x%x IRQ %d
\n
"
,
cs
->
hw
.
asus
.
cfg_reg
,
cs
->
irq
);
cs
->
hw
.
asus
.
adr
=
cs
->
hw
.
asus
.
cfg_reg
+
ASUS_IPAC_ALE
;
val
=
readreg
(
cs
,
cs
->
hw
.
asus
.
cfg_reg
+
ASUS_IPAC_DATA
,
IPAC_ID
);
if
((
val
==
1
)
||
(
val
==
2
))
{
cs
->
subtyp
=
ASUS_IPAC
;
cs
->
card_ops
=
&
asuscom_ipac_ops
;
cs
->
hw
.
asus
.
isac
=
cs
->
hw
.
asus
.
cfg_reg
+
ASUS_IPAC_DATA
;
if
(
ipac_setup
(
cs
,
&
ipac_dc_ops
,
&
ipac_bc_ops
))
goto
err
;
}
else
{
cs
->
subtyp
=
ASUS_ISACHSCX
;
cs
->
card_ops
=
&
asuscom_ops
;
cs
->
hw
.
asus
.
adr
=
cs
->
hw
.
asus
.
cfg_reg
+
ASUS_ADR
;
cs
->
hw
.
asus
.
isac
=
cs
->
hw
.
asus
.
cfg_reg
+
ASUS_ISAC
;
cs
->
hw
.
asus
.
hscx
=
cs
->
hw
.
asus
.
cfg_reg
+
ASUS_HSCX
;
cs
->
hw
.
asus
.
u7
=
cs
->
hw
.
asus
.
cfg_reg
+
ASUS_CTRL_U7
;
cs
->
hw
.
asus
.
pots
=
cs
->
hw
.
asus
.
cfg_reg
+
ASUS_CTRL_POTS
;
if
(
hscxisac_setup
(
cs
,
&
isac_ops
,
&
hscx_ops
))
goto
err
;
}
printk
(
KERN_INFO
"ISDNLink: resetting card
\n
"
);
cs
->
card_ops
->
reset
(
cs
);
if
(
asuscom_probe
(
card
->
cs
,
card
)
<
0
)
return
0
;
return
1
;
err:
hisax_release_resources
(
cs
);
return
0
;
}
drivers/isdn/hisax/avm_a1.c
View file @
c747c791
...
...
@@ -160,16 +160,16 @@ static struct card_ops avm_a1_ops = {
.
irq_func
=
avm_a1_interrupt
,
};
int
__init
setup_avm_a1
(
struct
IsdnCard
*
card
)
static
int
__init
avm_a1_probe
(
struct
IsdnCardState
*
cs
,
struct
IsdnCard
*
card
)
{
int
rc
;
u8
val
;
struct
IsdnCardState
*
cs
=
card
->
cs
;
char
tmp
[
64
];
strcpy
(
tmp
,
avm_revision
);
printk
(
KERN_INFO
"HiSax: AVM driver Rev. %s
\n
"
,
HiSax_getrev
(
tmp
)
);
printk
(
KERN_INFO
"AVM A1: defined at %#lx IRQ %lu
\n
"
,
card
->
para
[
1
],
card
->
para
[
0
]
);
rc
=
-
EBUSY
;
cs
->
hw
.
avm
.
cfg_reg
=
request_io
(
&
cs
->
rs
,
card
->
para
[
1
]
+
0x1800
,
8
,
"avm cfg"
);
if
(
!
cs
->
hw
.
avm
.
cfg_reg
)
goto
err
;
cs
->
hw
.
avm
.
isac
=
request_io
(
&
cs
->
rs
,
card
->
para
[
1
]
+
0x1400
,
32
,
"HiSax isac"
);
...
...
@@ -216,23 +216,24 @@ setup_avm_a1(struct IsdnCard *card)
printk
(
KERN_INFO
"AVM A1: Byte at %x is %x
\n
"
,
cs
->
hw
.
avm
.
cfg_reg
,
val
);
printk
(
KERN_INFO
"HiSax: %s config irq:%d cfg:0x%X
\n
"
,
CardType
[
cs
->
typ
],
cs
->
irq
,
cs
->
hw
.
avm
.
cfg_reg
);
printk
(
KERN_INFO
"HiSax: isac:0x%X/0x%X
\n
"
,
cs
->
hw
.
avm
.
isac
+
32
,
cs
->
hw
.
avm
.
isacfifo
);
printk
(
KERN_INFO
"HiSax: hscx A:0x%X/0x%X hscx B:0x%X/0x%X
\n
"
,
cs
->
hw
.
avm
.
hscx
[
0
]
+
32
,
cs
->
hw
.
avm
.
hscxfifo
[
0
],
cs
->
hw
.
avm
.
hscx
[
1
]
+
32
,
cs
->
hw
.
avm
.
hscxfifo
[
1
]);
cs
->
card_ops
=
&
avm_a1_ops
;
if
(
hscxisac_setup
(
cs
,
&
isac_ops
,
&
hscx_ops
))
goto
err
;
return
1
;
return
0
;
err:
hisax_release_resources
(
cs
);
return
0
;
return
rc
;
}
int
__init
setup_avm_a1
(
struct
IsdnCard
*
card
)
{
char
tmp
[
64
];
strcpy
(
tmp
,
avm_revision
);
printk
(
KERN_INFO
"HiSax: AVM driver Rev. %s
\n
"
,
HiSax_getrev
(
tmp
));
if
(
avm_a1_probe
(
card
->
cs
,
card
)
<
0
)
return
0
;
return
1
;
}
drivers/isdn/hisax/avm_a1p.c
View file @
c747c791
...
...
@@ -215,20 +215,13 @@ static struct card_ops avm_a1p_ops = {
.
irq_func
=
avm_a1p_interrupt
,
};
int
__dev
init
setup_avm_a1_pcmcia
(
struct
IsdnCard
*
card
)
static
int
__
init
avm_a1p_probe
(
struct
IsdnCardState
*
cs
,
struct
IsdnCard
*
card
)
{
u8
model
,
vers
;
struct
IsdnCardState
*
cs
=
card
->
cs
;
char
tmp
[
64
];
strcpy
(
tmp
,
avm_revision
);
printk
(
KERN_INFO
"HiSax: AVM A1 PCMCIA driver Rev. %s
\n
"
,
HiSax_getrev
(
tmp
));
cs
->
hw
.
avm
.
cfg_reg
=
card
->
para
[
1
];
cs
->
irq
=
card
->
para
[
0
];
cs
->
hw
.
avm
.
cfg_reg
=
card
->
para
[
1
];
outb
(
cs
->
hw
.
avm
.
cfg_reg
+
ASL1_OFFSET
,
ASL1_W_ENABLE_S0
);
...
...
@@ -244,11 +237,26 @@ setup_avm_a1_pcmcia(struct IsdnCard *card)
vers
=
bytein
(
cs
->
hw
.
avm
.
cfg_reg
+
VERREG_OFFSET
);
printk
(
KERN_INFO
"AVM A1 PCMCIA: io 0x%x irq %d model %d version %d
\n
"
,
cs
->
hw
.
avm
.
cfg_reg
,
cs
->
irq
,
model
,
vers
);
cs
->
hw
.
avm
.
cfg_reg
,
cs
->
irq
,
model
,
vers
);
cs
->
card_ops
=
&
avm_a1p_ops
;
if
(
hscxisac_setup
(
cs
,
&
isac_ops
,
&
hscx_ops
))
return
0
;
goto
err
;
return
0
;
err:
hisax_release_resources
(
cs
);
return
-
EBUSY
;
}
int
__devinit
setup_avm_a1_pcmcia
(
struct
IsdnCard
*
card
)
{
char
tmp
[
64
];
strcpy
(
tmp
,
avm_revision
);
printk
(
KERN_INFO
"HiSax: AVM A1 PCMCIA driver Rev. %s
\n
"
,
HiSax_getrev
(
tmp
));
if
(
avm_a1p_probe
(
card
->
cs
,
card
))
return
0
;
return
1
;
}
drivers/isdn/hisax/avm_pci.c
View file @
c747c791
...
...
@@ -497,7 +497,7 @@ static struct bc_l1_ops hdlc_l1_ops = {
.
close
=
close_hdlcstate
,
};
void
__init
static
void
__init
inithdlc
(
struct
IsdnCardState
*
cs
)
{
u_int
val
;
...
...
@@ -596,6 +596,82 @@ static struct card_ops avm_pci_ops = {
.
irq_func
=
avm_pcipnp_interrupt
,
};
static
int
__init
avm_pcipnp_hw_init
(
struct
IsdnCardState
*
cs
)
{
cs
->
bc_hw_ops
=
&
hdlc_hw_ops
;
cs
->
bc_l1_ops
=
&
hdlc_l1_ops
;
cs
->
card_ops
=
&
avm_pci_ops
;
avm_pcipnp_reset
(
cs
);
return
isac_setup
(
cs
,
&
isac_ops
);
}
static
int
__init
avm_pci_probe
(
struct
IsdnCardState
*
cs
,
struct
pci_dev
*
pdev
)
{
int
rc
;
u32
val
;
printk
(
KERN_INFO
"AVM PCI: defined at %#lx IRQ %u
\n
"
,
pci_resource_start
(
pdev
,
1
),
pdev
->
irq
);
rc
=
-
EBUSY
;
if
(
pci_enable_device
(
pdev
))
goto
err
;
cs
->
subtyp
=
AVM_FRITZ_PCI
;
cs
->
irq
=
pdev
->
irq
;
cs
->
irq_flags
|=
SA_SHIRQ
;
cs
->
hw
.
avm
.
cfg_reg
=
pci_resource_start
(
pdev
,
1
);
cs
->
hw
.
avm
.
isac
=
cs
->
hw
.
avm
.
cfg_reg
+
0x10
;
if
(
!
request_io
(
&
cs
->
rs
,
cs
->
hw
.
avm
.
cfg_reg
,
32
,
"avm PCI"
))
goto
err
;
val
=
inl
(
cs
->
hw
.
avm
.
cfg_reg
);
printk
(
KERN_INFO
"AVM PCI: stat %#x
\n
"
,
val
);
printk
(
KERN_INFO
"AVM PCI: Class %X Rev %d
\n
"
,
val
&
0xff
,
(
val
>>
8
)
&
0xff
);
if
(
avm_pcipnp_hw_init
(
cs
))
goto
err
;
return
0
;
err:
hisax_release_resources
(
cs
);
return
rc
;
}
static
int
__init
avm_pnp_probe
(
struct
IsdnCardState
*
cs
,
struct
IsdnCard
*
card
)
{
int
rc
;
u8
val
,
ver
;
printk
(
KERN_INFO
"AVM PnP: defined at %#lx IRQ %lu
\n
"
,
card
->
para
[
1
],
card
->
para
[
0
]);
cs
->
subtyp
=
AVM_FRITZ_PNP
;
cs
->
irq
=
card
->
para
[
0
];
cs
->
hw
.
avm
.
cfg_reg
=
card
->
para
[
1
];
cs
->
hw
.
avm
.
isac
=
cs
->
hw
.
avm
.
cfg_reg
+
0x10
;
rc
=
-
EBUSY
;
if
(
!
request_io
(
&
cs
->
rs
,
cs
->
hw
.
avm
.
cfg_reg
,
32
,
"avm PnP"
))
goto
err
;
val
=
inb
(
cs
->
hw
.
avm
.
cfg_reg
);
ver
=
inb
(
cs
->
hw
.
avm
.
cfg_reg
+
1
);
printk
(
KERN_INFO
"AVM PnP: Class %X Rev %d
\n
"
,
val
,
ver
);
if
(
avm_pcipnp_hw_init
(
cs
))
goto
err
;
return
0
;
err:
hisax_release_resources
(
cs
);
return
rc
;
}
static
struct
pci_dev
*
dev_avm
__initdata
=
NULL
;
#ifdef __ISAPNP__
static
struct
pnp_card
*
card_avm
__initdata
=
NULL
;
...
...
@@ -605,17 +681,15 @@ static struct pnp_dev *pnp_avm __initdata = NULL;
int
__init
setup_avm_pcipnp
(
struct
IsdnCard
*
card
)
{
u_int
val
,
ver
;
struct
IsdnCardState
*
cs
=
card
->
cs
;
char
tmp
[
64
];
strcpy
(
tmp
,
avm_pci_rev
);
printk
(
KERN_INFO
"HiSax: AVM PCI driver Rev. %s
\n
"
,
HiSax_getrev
(
tmp
));
if
(
card
->
para
[
1
])
{
/* old manual method */
cs
->
hw
.
avm
.
cfg_reg
=
card
->
para
[
1
];
cs
->
irq
=
card
->
para
[
0
]
;
cs
->
subtyp
=
AVM_FRITZ_PNP
;
if
(
avm_pnp_probe
(
card
->
cs
,
card
))
return
0
;
return
1
;
}
else
{
#ifdef __ISAPNP__
if
(
isapnp_present
())
{
...
...
@@ -647,69 +721,24 @@ setup_avm_pcipnp(struct IsdnCard *card)
pnp_device_detach
(
pnp_avm
);
return
(
0
);
}
cs
->
hw
.
avm
.
cfg_reg
=
pnp_port_start
(
pnp_avm
,
0
);
cs
->
irq
=
pnp_irq
(
pnp_avm
,
0
);
cs
->
subtyp
=
AVM_FRITZ_PNP
;
goto
ready
;
card
->
para
[
1
]
=
pnp_port_start
(
pnp_avm
,
0
);
card
->
para
[
0
]
=
pnp_irq
(
pnp_avm
,
0
);
if
(
avm_pnp_probe
(
card
->
cs
,
card
))
return
0
;
return
1
;
}
}
}
else
{
printk
(
KERN_INFO
"FritzPnP: no ISA PnP present
\n
"
);
}
#endif
#if CONFIG_PCI
if
((
dev_avm
=
pci_find_device
(
PCI_VENDOR_ID_AVM
,
PCI_DEVICE_ID_AVM_A1
,
dev_avm
)))
{
cs
->
irq
=
dev_avm
->
irq
;
if
(
!
cs
->
irq
)
{
printk
(
KERN_ERR
"FritzPCI: No IRQ for PCI card found
\n
"
);
return
(
0
);
}
if
(
pci_enable_device
(
dev_avm
))
return
(
0
);
cs
->
hw
.
avm
.
cfg_reg
=
pci_resource_start
(
dev_avm
,
1
);
if
(
!
cs
->
hw
.
avm
.
cfg_reg
)
{
printk
(
KERN_ERR
"FritzPCI: No IO-Adr for PCI card found
\n
"
);
return
(
0
);
}
cs
->
subtyp
=
AVM_FRITZ_PCI
;
}
else
{
printk
(
KERN_WARNING
"FritzPCI: No PCI card found
\n
"
);
return
(
0
);
if
(
avm_pci_probe
(
card
->
cs
,
dev_avm
))
return
0
;
return
1
;
}
cs
->
irq_flags
|=
SA_SHIRQ
;
#endif
/* CONFIG_PCI */
}
ready:
cs
->
hw
.
avm
.
isac
=
cs
->
hw
.
avm
.
cfg_reg
+
0x10
;
if
(
!
request_io
(
&
cs
->
rs
,
cs
->
hw
.
avm
.
cfg_reg
,
32
,
cs
->
subtyp
==
AVM_FRITZ_PCI
?
"avm PCI"
:
"avm PnP"
))
goto
err
;
switch
(
cs
->
subtyp
)
{
case
AVM_FRITZ_PCI
:
val
=
inl
(
cs
->
hw
.
avm
.
cfg_reg
);
printk
(
KERN_INFO
"AVM PCI: stat %#x
\n
"
,
val
);
printk
(
KERN_INFO
"AVM PCI: Class %X Rev %d
\n
"
,
val
&
0xff
,
(
val
>>
8
)
&
0xff
);
break
;
case
AVM_FRITZ_PNP
:
val
=
inb
(
cs
->
hw
.
avm
.
cfg_reg
);
ver
=
inb
(
cs
->
hw
.
avm
.
cfg_reg
+
1
);
printk
(
KERN_INFO
"AVM PnP: Class %X Rev %d
\n
"
,
val
,
ver
);
avm_pcipnp_reset
(
cs
);
break
;
}
printk
(
KERN_INFO
"HiSax: %s config irq:%d base:0x%X
\n
"
,
(
cs
->
subtyp
==
AVM_FRITZ_PCI
)
?
"AVM Fritz!PCI"
:
"AVM Fritz!PnP"
,
cs
->
irq
,
cs
->
hw
.
avm
.
cfg_reg
);
cs
->
bc_hw_ops
=
&
hdlc_hw_ops
;
cs
->
bc_l1_ops
=
&
hdlc_l1_ops
;
cs
->
card_ops
=
&
avm_pci_ops
;
isac_setup
(
cs
,
&
isac_ops
);
return
1
;
err:
hisax_release_resources
(
cs
);
printk
(
KERN_WARNING
"FritzPCI: No card found
\n
"
);
return
0
;
}
drivers/isdn/hisax/bkm_a4t.c
View file @
c747c791
...
...
@@ -21,11 +21,11 @@
#include "bkm_ax.h"
extern
const
char
*
CardType
[];
// FIXME needs per card lock
static
spinlock_t
bkm_a4t_lock
=
SPIN_LOCK_UNLOCKED
;
const
char
*
bkm_a4t_revision
=
"$Revision: 1.13.6.6 $"
;
static
inline
u8
readreg
(
unsigned
int
ale
,
unsigned
long
adr
,
u8
off
)
{
...
...
@@ -249,15 +249,57 @@ static struct card_ops bkm_a4t_ops = {
.
irq_func
=
bkm_interrupt
,
};
static
int
__init
bkm_a4t_probe
(
struct
IsdnCardState
*
cs
,
struct
pci_dev
*
pdev
)
{
I20_REGISTER_FILE
*
pI20_Regs
;
int
rc
;
printk
(
KERN_INFO
"BKM A4T: defined at %#lx IRQ %u
\n
"
,
pci_resource_start
(
pdev
,
0
),
pdev
->
irq
);
rc
=
-
EBUSY
;
if
(
pci_enable_device
(
pdev
))
goto
err
;
cs
->
irq
=
pdev
->
irq
;
cs
->
irq_flags
|=
SA_SHIRQ
;
cs
->
hw
.
avm
.
cfg_reg
=
pci_resource_start
(
pdev
,
1
);
cs
->
hw
.
ax
.
base
=
(
unsigned
long
)
request_mmio
(
&
cs
->
rs
,
pci_resource_start
(
pdev
,
0
),
4096
,
"Telekom A4T"
);
if
(
!
cs
->
hw
.
ax
.
base
)
goto
err
;
/* Check suspicious address */
// FIXME needs to use read[bl]
pI20_Regs
=
(
I20_REGISTER_FILE
*
)
(
cs
->
hw
.
ax
.
base
);
if
((
pI20_Regs
->
i20IntStatus
&
0x8EFFFFFF
)
!=
0
)
{
printk
(
KERN_WARNING
"HiSax: address %lx suspicious
\n
"
,
cs
->
hw
.
ax
.
base
);
goto
err
;
}
cs
->
hw
.
ax
.
isac_adr
=
cs
->
hw
.
ax
.
base
+
PO_OFFSET
;
cs
->
hw
.
ax
.
jade_adr
=
cs
->
hw
.
ax
.
base
+
PO_OFFSET
;
cs
->
hw
.
ax
.
isac_ale
=
GCS_1
;
cs
->
hw
.
ax
.
jade_ale
=
GCS_3
;
reset_bkm
(
cs
);
cs
->
card_ops
=
&
bkm_a4t_ops
;
isac_setup
(
cs
,
&
isac_ops
);
jade_setup
(
cs
,
&
jade_ops
);
return
0
;
err:
hisax_release_resources
(
cs
);
return
rc
;
}
static
struct
pci_dev
*
dev_a4t
__initdata
=
NULL
;
int
__init
setup_bkm_a4t
(
struct
IsdnCard
*
card
)
{
struct
IsdnCardState
*
cs
=
card
->
cs
;
char
tmp
[
64
];
u_int
pci_memaddr
=
0
,
found
=
0
;
I20_REGISTER_FILE
*
pI20_Regs
;
strcpy
(
tmp
,
bkm_a4t_revision
);
printk
(
KERN_INFO
"HiSax: T-Berkom driver Rev. %s
\n
"
,
HiSax_getrev
(
tmp
));
...
...
@@ -268,49 +310,13 @@ setup_bkm_a4t(struct IsdnCard *card)
sub_vendor
=
dev_a4t
->
subsystem_vendor
;
sub_sys
=
dev_a4t
->
subsystem_device
;
if
((
sub_sys
==
PCI_DEVICE_ID_BERKOM_A4T
)
&&
(
sub_vendor
==
PCI_VENDOR_ID_BERKOM
))
{
if
(
pci_enable_device
(
dev_a4t
))
return
(
0
);
found
=
1
;
pci_memaddr
=
pci_resource_start
(
dev_a4t
,
0
);
cs
->
irq
=
dev_a4t
->
irq
;
break
;
if
(
sub_sys
==
PCI_DEVICE_ID_BERKOM_A4T
&&
sub_vendor
==
PCI_VENDOR_ID_BERKOM
)
{
if
(
bkm_a4t_probe
(
card
->
cs
,
dev_a4t
))
return
0
;
return
1
;
}
}
if
(
!
found
)
{
printk
(
KERN_WARNING
"HiSax: %s: Card not found
\n
"
,
CardType
[
card
->
typ
]);
return
(
0
);
}
if
(
!
cs
->
irq
)
{
/* IRQ range check ?? */
printk
(
KERN_WARNING
"HiSax: %s: No IRQ
\n
"
,
CardType
[
card
->
typ
]);
return
(
0
);
}
cs
->
hw
.
ax
.
base
=
(
unsigned
long
)
request_mmio
(
&
cs
->
rs
,
pci_memaddr
,
4096
,
"Telekom A4T"
);
if
(
!
cs
->
hw
.
ax
.
base
)
{
printk
(
KERN_WARNING
"HiSax: %s: No Memory base address
\n
"
,
CardType
[
card
->
typ
]);
return
(
0
);
}
/* Check suspecious address */
pI20_Regs
=
(
I20_REGISTER_FILE
*
)
(
cs
->
hw
.
ax
.
base
);
if
((
pI20_Regs
->
i20IntStatus
&
0x8EFFFFFF
)
!=
0
)
{
printk
(
KERN_WARNING
"HiSax: %s address %lx-%lx suspecious
\n
"
,
CardType
[
card
->
typ
],
cs
->
hw
.
ax
.
base
,
cs
->
hw
.
ax
.
base
+
4096
);
hisax_release_resources
(
cs
);
return
(
0
);
}
cs
->
hw
.
ax
.
isac_adr
=
cs
->
hw
.
ax
.
base
+
PO_OFFSET
;
cs
->
hw
.
ax
.
jade_adr
=
cs
->
hw
.
ax
.
base
+
PO_OFFSET
;
cs
->
hw
.
ax
.
isac_ale
=
GCS_1
;
cs
->
hw
.
ax
.
jade_ale
=
GCS_3
;
printk
(
KERN_INFO
"HiSax: %s: Card configured at 0x%lX IRQ %d
\n
"
,
CardType
[
card
->
typ
],
cs
->
hw
.
ax
.
base
,
cs
->
irq
);
reset_bkm
(
cs
);
cs
->
irq_flags
|=
SA_SHIRQ
;
cs
->
card_ops
=
&
bkm_a4t_ops
;
isac_setup
(
cs
,
&
isac_ops
);
jade_setup
(
cs
,
&
jade_ops
);
return
1
;
printk
(
KERN_WARNING
"HiSax: %s: Card not found
\n
"
,
CardType
[
card
->
typ
]);
return
0
;
}
drivers/isdn/hisax/config.c
View file @
c747c791
...
...
@@ -490,125 +490,36 @@ static int __init HiSax_setup(char *line)
__setup
(
"hisax="
,
HiSax_setup
);
#endif
/* MODULES */
#if CARD_TELES0
extern
int
setup_teles0
(
struct
IsdnCard
*
card
);
#endif
#if CARD_TELES3
extern
int
setup_teles3
(
struct
IsdnCard
*
card
);
#endif
#if CARD_S0BOX
extern
int
setup_s0box
(
struct
IsdnCard
*
card
);
#endif
#if CARD_TELESPCI
extern
int
setup_telespci
(
struct
IsdnCard
*
card
);
#endif
#if CARD_AVM_A1
extern
int
setup_avm_a1
(
struct
IsdnCard
*
card
);
#endif
#if CARD_AVM_A1_PCMCIA
extern
int
setup_avm_a1_pcmcia
(
struct
IsdnCard
*
card
);
#endif
#if CARD_FRITZPCI
extern
int
setup_avm_pcipnp
(
struct
IsdnCard
*
card
);
#endif
#if CARD_ELSA
extern
int
setup_elsa
(
struct
IsdnCard
*
card
);
#endif
#if CARD_IX1MICROR2
extern
int
setup_ix1micro
(
struct
IsdnCard
*
card
);
#endif
#if CARD_DIEHLDIVA
extern
int
setup_diva
(
struct
IsdnCard
*
card
);
#endif
#if CARD_ASUSCOM
extern
int
setup_asuscom
(
struct
IsdnCard
*
card
);
#endif
#if CARD_TELEINT
extern
int
setup_TeleInt
(
struct
IsdnCard
*
card
);
#endif
#if CARD_SEDLBAUER
extern
int
setup_sedlbauer
(
struct
IsdnCard
*
card
);
#endif
#if CARD_SPORTSTER
extern
int
setup_sportster
(
struct
IsdnCard
*
card
);
#endif
#if CARD_MIC
extern
int
setup_mic
(
struct
IsdnCard
*
card
);
#endif
#if CARD_NETJET_S
extern
int
setup_netjet_s
(
struct
IsdnCard
*
card
);
#endif
#if CARD_HFCS
extern
int
setup_hfcs
(
struct
IsdnCard
*
card
);
#endif
#if CARD_HFC_PCI
extern
int
setup_hfcpci
(
struct
IsdnCard
*
card
);
#endif
#if CARD_HFC_SX
extern
int
setup_hfcsx
(
struct
IsdnCard
*
card
);
#endif
#if CARD_AMD7930
extern
int
setup_amd7930
(
struct
IsdnCard
*
card
);
#endif
#if CARD_NICCY
extern
int
setup_niccy
(
struct
IsdnCard
*
card
);
#endif
#if CARD_ISURF
extern
int
setup_isurf
(
struct
IsdnCard
*
card
);
#endif
#if CARD_HSTSAPHIR
extern
int
setup_saphir
(
struct
IsdnCard
*
card
);
#endif
#if CARD_TESTEMU
extern
int
setup_testemu
(
struct
IsdnCard
*
card
);
#endif
#if CARD_BKM_A4T
extern
int
setup_bkm_a4t
(
struct
IsdnCard
*
card
);
#endif
#if CARD_SCT_QUADRO
extern
int
setup_sct_quadro
(
struct
IsdnCard
*
card
);
#endif
#if CARD_GAZEL
extern
int
setup_gazel
(
struct
IsdnCard
*
card
);
#endif
#if CARD_W6692
extern
int
setup_w6692
(
struct
IsdnCard
*
card
);
#endif
#if CARD_NETJET_U
extern
int
setup_netjet_u
(
struct
IsdnCard
*
card
);
#endif
#if CARD_FN_ENTERNOW_PCI
extern
int
setup_enternow_pci
(
struct
IsdnCard
*
card
);
#endif
/*
* Find card with given driverId
...
...
@@ -703,16 +614,16 @@ int jiftime(char *s, long mark)
return
8
;
}
static
u8
tmpbuf
[
HISAX_STATUS_BUFSIZE
];
static
char
tmpbuf
[
HISAX_STATUS_BUFSIZE
];
void
VHiSax_putstatus
(
struct
IsdnCardState
*
cs
,
char
*
head
,
char
*
fmt
,
void
VHiSax_putstatus
(
struct
IsdnCardState
*
cs
,
char
*
head
,
c
onst
c
har
*
fmt
,
va_list
args
)
{
/* if head == NULL the fmt contains the full info */
unsigned
long
flags
;
int
count
,
i
;
u8
*
p
;
char
*
p
;
isdn_ctrl
ic
;
int
len
;
...
...
@@ -727,7 +638,7 @@ void VHiSax_putstatus(struct IsdnCardState *cs, char *head, char *fmt,
len
=
p
-
tmpbuf
;
p
=
tmpbuf
;
}
else
{
p
=
fmt
;
p
=
(
char
*
)
fmt
;
len
=
strlen
(
fmt
);
}
if
(
!
cs
)
{
...
...
@@ -814,12 +725,6 @@ static void ll_unload(struct IsdnCardState *cs)
ic
.
command
=
ISDN_STAT_UNLOAD
;
ic
.
driver
=
cs
->
myid
;
cs
->
iif
.
statcallb
(
&
ic
);
if
(
cs
->
status_buf
)
kfree
(
cs
->
status_buf
);
cs
->
status_read
=
NULL
;
cs
->
status_write
=
NULL
;
cs
->
status_end
=
NULL
;
kfree
(
cs
->
dlog
);
}
static
void
closecard
(
int
cardnr
)
...
...
@@ -893,59 +798,97 @@ static int __devinit init_card(struct IsdnCardState *cs)
return
3
;
}
static
struct
IsdnCardState
*
alloc_IsdnCardState
(
void
)
{
struct
IsdnCardState
*
cs
;
cs
=
kmalloc
(
sizeof
(
*
cs
),
GFP_ATOMIC
);
// FIXME
if
(
!
cs
)
goto
err
;
memset
(
cs
,
0
,
sizeof
(
*
cs
));
cs
->
dlog
=
kmalloc
(
MAX_DLOG_SPACE
,
GFP_ATOMIC
);
if
(
!
cs
->
dlog
)
goto
err_cs
;
cs
->
status_buf
=
kmalloc
(
HISAX_STATUS_BUFSIZE
,
GFP_ATOMIC
);
if
(
!
cs
->
status_buf
)
goto
err_dlog
;
cs
->
rcvbuf
=
kmalloc
(
MAX_DFRAME_LEN_L1
,
GFP_ATOMIC
);
if
(
!
cs
->
rcvbuf
)
goto
err_status_buf
;
cs
->
chanlimit
=
2
;
/* maximum B-channel number */
cs
->
debug
=
L1_DEB_WARN
;
cs
->
irq_flags
=
I4L_IRQ_FLAG
;
cs
->
stlist
=
NULL
;
cs
->
status_read
=
cs
->
status_buf
;
cs
->
status_write
=
cs
->
status_buf
;
cs
->
status_end
=
cs
->
status_buf
+
HISAX_STATUS_BUFSIZE
-
1
;
cs
->
rcvidx
=
0
;
cs
->
tx_skb
=
NULL
;
cs
->
tx_cnt
=
0
;
cs
->
event
=
0
;
skb_queue_head_init
(
&
cs
->
rq
);
skb_queue_head_init
(
&
cs
->
sq
);
spin_lock_init
(
&
cs
->
lock
);
resources_init
(
&
cs
->
rs
);
return
cs
;
err_status_buf:
kfree
(
cs
->
status_buf
);
err_dlog:
kfree
(
cs
->
dlog
);
err_cs:
kfree
(
cs
);
err:
return
NULL
;
}
static
void
free_IsdnCardState
(
struct
IsdnCardState
*
cs
)
{
kfree
(
cs
->
rcvbuf
);
kfree
(
cs
->
status_buf
);
kfree
(
cs
->
dlog
);
kfree
(
cs
);
}
static
int
__devinit
checkcard
(
int
cardnr
,
char
*
id
,
int
*
busy_flag
)
{
int
ret
=
0
;
struct
IsdnCard
*
card
=
cards
+
cardnr
;
struct
IsdnCardState
*
cs
;
cs
=
kmalloc
(
sizeof
(
struct
IsdnCardState
),
GFP_ATOMIC
);
cs
=
alloc_IsdnCardState
(
);
if
(
!
cs
)
{
printk
(
KERN_WARNING
"HiSax: No memory for IsdnCardState(card %d)
\n
"
,
cardnr
+
1
);
goto
out
;
}
memset
(
cs
,
0
,
sizeof
(
struct
IsdnCardState
));
card
->
cs
=
cs
;
cs
->
chanlimit
=
2
;
/* maximum B-channel number */
cs
->
logecho
=
0
;
/* No echo logging */
cs
->
cardnr
=
cardnr
;
cs
->
debug
=
L1_DEB_WARN
;
cs
->
HW_Flags
=
0
;
cs
->
busy_flag
=
busy_flag
;
cs
->
irq_flags
=
I4L_IRQ_FLAG
;
#if TEI_PER_CARD
if
(
card
->
protocol
==
ISDN_PTYPE_NI1
)
test_and_set_bit
(
FLG_TWO_DCHAN
,
&
cs
->
HW_Flags
);
#else
test_and_set_bit
(
FLG_TWO_DCHAN
,
&
cs
->
HW_Flags
);
#endif
cs
->
cardnr
=
cardnr
;
cs
->
protocol
=
card
->
protocol
;
cs
->
typ
=
card
->
typ
;
cs
->
busy_flag
=
busy_flag
;
if
(
card
->
typ
<=
0
||
card
->
typ
>
ISDN_CTYPE_COUNT
)
{
printk
(
KERN_WARNING
"HiSax: Card Type %d out of range
\n
"
,
card
->
typ
);
goto
outf_cs
;
}
if
(
!
(
cs
->
dlog
=
kmalloc
(
MAX_DLOG_SPACE
,
GFP_ATOMIC
)))
{
printk
(
KERN_WARNING
"HiSax: No memory for dlog(card %d)
\n
"
,
cardnr
+
1
);
goto
outf_cs
;
}
if
(
!
(
cs
->
status_buf
=
kmalloc
(
HISAX_STATUS_BUFSIZE
,
GFP_ATOMIC
)))
{
printk
(
KERN_WARNING
"HiSax: No memory for status_buf(card %d)
\n
"
,
cardnr
+
1
);
goto
outf_dlog
;
}
cs
->
stlist
=
NULL
;
cs
->
status_read
=
cs
->
status_buf
;
cs
->
status_write
=
cs
->
status_buf
;
cs
->
status_end
=
cs
->
status_buf
+
HISAX_STATUS_BUFSIZE
-
1
;
cs
->
typ
=
card
->
typ
;
spin_lock_init
(
&
cs
->
lock
);
resources_init
(
&
cs
->
rs
);
SET_MODULE_OWNER
(
&
cs
->
iif
);
strcpy
(
cs
->
iif
.
id
,
id
);
cs
->
iif
.
channels
=
2
;
...
...
@@ -982,13 +925,13 @@ static int __devinit checkcard(int cardnr, char *id, int *busy_flag)
(
card
->
protocol
==
ISDN_PTYPE_NI1
)
?
"NI1"
:
"NONE"
,
cs
->
iif
.
id
,
cs
->
myid
);
switch
(
card
->
typ
)
{
#if
CARD_TELES
0
#if
def CONFIG_HISAX_16_
0
case
ISDN_CTYPE_16_0
:
case
ISDN_CTYPE_8_0
:
ret
=
setup_teles0
(
card
);
break
;
#endif
#if
CARD_TELES
3
#if
def CONFIG_HISAX_16_
3
case
ISDN_CTYPE_16_3
:
case
ISDN_CTYPE_PNP
:
case
ISDN_CTYPE_TELESPCMCIA
:
...
...
@@ -996,32 +939,32 @@ static int __devinit checkcard(int cardnr, char *id, int *busy_flag)
ret
=
setup_teles3
(
card
);
break
;
#endif
#if
CARD
_S0BOX
#if
def CONFIG_HISAX
_S0BOX
case
ISDN_CTYPE_S0BOX
:
ret
=
setup_s0box
(
card
);
break
;
#endif
#if
CARD
_TELESPCI
#if
def CONFIG_HISAX
_TELESPCI
case
ISDN_CTYPE_TELESPCI
:
ret
=
setup_telespci
(
card
);
break
;
#endif
#if
CARD
_AVM_A1
#if
def CONFIG_HISAX
_AVM_A1
case
ISDN_CTYPE_A1
:
ret
=
setup_avm_a1
(
card
);
break
;
#endif
#if
CARD
_AVM_A1_PCMCIA
#if
def CONFIG_HISAX
_AVM_A1_PCMCIA
case
ISDN_CTYPE_A1_PCMCIA
:
ret
=
setup_avm_a1_pcmcia
(
card
);
break
;
#endif
#if
CARD
_FRITZPCI
#if
def CONFIG_HISAX
_FRITZPCI
case
ISDN_CTYPE_FRITZPCI
:
ret
=
setup_avm_pcipnp
(
card
);
break
;
#endif
#if
CARD
_ELSA
#if
def CONFIG_HISAX
_ELSA
case
ISDN_CTYPE_ELSA
:
case
ISDN_CTYPE_ELSA_PNP
:
case
ISDN_CTYPE_ELSA_PCMCIA
:
...
...
@@ -1029,115 +972,115 @@ static int __devinit checkcard(int cardnr, char *id, int *busy_flag)
ret
=
setup_elsa
(
card
);
break
;
#endif
#if
CARD
_IX1MICROR2
#if
def CONFIG_HISAX
_IX1MICROR2
case
ISDN_CTYPE_IX1MICROR2
:
ret
=
setup_ix1micro
(
card
);
break
;
#endif
#if
CARD
_DIEHLDIVA
#if
def CONFIG_HISAX
_DIEHLDIVA
case
ISDN_CTYPE_DIEHLDIVA
:
ret
=
setup_diva
(
card
);
break
;
#endif
#if
CARD
_ASUSCOM
#if
def CONFIG_HISAX
_ASUSCOM
case
ISDN_CTYPE_ASUSCOM
:
ret
=
setup_asuscom
(
card
);
break
;
#endif
#if
CARD
_TELEINT
#if
def CONFIG_HISAX
_TELEINT
case
ISDN_CTYPE_TELEINT
:
ret
=
setup_TeleInt
(
card
);
break
;
#endif
#if
CARD
_SEDLBAUER
#if
def CONFIG_HISAX
_SEDLBAUER
case
ISDN_CTYPE_SEDLBAUER
:
case
ISDN_CTYPE_SEDLBAUER_PCMCIA
:
case
ISDN_CTYPE_SEDLBAUER_FAX
:
ret
=
setup_sedlbauer
(
card
);
break
;
#endif
#if
CARD
_SPORTSTER
#if
def CONFIG_HISAX
_SPORTSTER
case
ISDN_CTYPE_SPORTSTER
:
ret
=
setup_sportster
(
card
);
break
;
#endif
#if
CARD
_MIC
#if
def CONFIG_HISAX
_MIC
case
ISDN_CTYPE_MIC
:
ret
=
setup_mic
(
card
);
break
;
#endif
#if
CARD_NETJET_S
#if
def CONFIG_HISAX_NETJET
case
ISDN_CTYPE_NETJET_S
:
ret
=
setup_netjet_s
(
card
);
break
;
#endif
#if
CARD
_HFCS
#if
def CONFIG_HISAX
_HFCS
case
ISDN_CTYPE_TELES3C
:
case
ISDN_CTYPE_ACERP10
:
ret
=
setup_hfcs
(
card
);
break
;
#endif
#if
CARD
_HFC_PCI
#if
def CONFIG_HISAX
_HFC_PCI
case
ISDN_CTYPE_HFC_PCI
:
ret
=
setup_hfcpci
(
card
);
break
;
#endif
#if
CARD
_HFC_SX
#if
def CONFIG_HISAX
_HFC_SX
case
ISDN_CTYPE_HFC_SX
:
ret
=
setup_hfcsx
(
card
);
break
;
#endif
#if
CARD
_NICCY
#if
def CONFIG_HISAX
_NICCY
case
ISDN_CTYPE_NICCY
:
ret
=
setup_niccy
(
card
);
break
;
#endif
#if
CARD
_AMD7930
#if
def CONFIG_HISAX
_AMD7930
case
ISDN_CTYPE_AMD7930
:
ret
=
setup_amd7930
(
card
);
break
;
#endif
#if
CARD
_ISURF
#if
def CONFIG_HISAX
_ISURF
case
ISDN_CTYPE_ISURF
:
ret
=
setup_isurf
(
card
);
break
;
#endif
#if
CARD
_HSTSAPHIR
#if
def CONFIG_HISAX
_HSTSAPHIR
case
ISDN_CTYPE_HSTSAPHIR
:
ret
=
setup_saphir
(
card
);
break
;
#endif
#if
CARD
_TESTEMU
#if
def CONFIG_HISAX
_TESTEMU
case
ISDN_CTYPE_TESTEMU
:
ret
=
setup_testemu
(
card
);
break
;
#endif
#if
CARD
_BKM_A4T
#if
def CONFIG_HISAX
_BKM_A4T
case
ISDN_CTYPE_BKM_A4T
:
ret
=
setup_bkm_a4t
(
card
);
break
;
#endif
#if
CARD
_SCT_QUADRO
#if
def CONFIG_HISAX
_SCT_QUADRO
case
ISDN_CTYPE_SCT_QUADRO
:
ret
=
setup_sct_quadro
(
card
);
break
;
#endif
#if
CARD
_GAZEL
#if
def CONFIG_HISAX
_GAZEL
case
ISDN_CTYPE_GAZEL
:
ret
=
setup_gazel
(
card
);
break
;
#endif
#if
CARD
_W6692
#if
def CONFIG_HISAX
_W6692
case
ISDN_CTYPE_W6692
:
ret
=
setup_w6692
(
card
);
break
;
#endif
#if
CARD
_NETJET_U
#if
def CONFIG_HISAX
_NETJET_U
case
ISDN_CTYPE_NETJET_U
:
ret
=
setup_netjet_u
(
card
);
break
;
#endif
#if
CARD_FN
_ENTERNOW_PCI
#if
def CONFIG_HISAX
_ENTERNOW_PCI
case
ISDN_CTYPE_ENTERNOW
:
ret
=
setup_enternow_pci
(
card
);
break
;
...
...
@@ -1156,19 +1099,6 @@ static int __devinit checkcard(int cardnr, char *id, int *busy_flag)
ll_unload
(
cs
);
goto
outf_cs
;
}
if
(
!
(
cs
->
rcvbuf
=
kmalloc
(
MAX_DFRAME_LEN_L1
,
GFP_ATOMIC
)))
{
printk
(
KERN_WARNING
"HiSax: No memory for isac rcvbuf
\n
"
);
ll_unload
(
cs
);
goto
outf_cs
;
}
cs
->
rcvidx
=
0
;
cs
->
tx_skb
=
NULL
;
cs
->
tx_cnt
=
0
;
cs
->
event
=
0
;
skb_queue_head_init
(
&
cs
->
rq
);
skb_queue_head_init
(
&
cs
->
sq
);
init_bcstate
(
cs
,
0
);
init_bcstate
(
cs
,
1
);
...
...
@@ -1201,10 +1131,8 @@ static int __devinit checkcard(int cardnr, char *id, int *busy_flag)
ret
=
1
;
goto
out
;
outf_dlog:
kfree
(
cs
->
dlog
);
outf_cs:
kfre
e
(
cs
);
free_IsdnCardStat
e
(
cs
);
card
->
cs
=
NULL
;
out:
return
ret
;
...
...
@@ -1253,8 +1181,8 @@ int __devinit HiSax_inithardware(int *busy_flag)
i
++
;
}
else
{
printk
(
KERN_WARNING
"HiSax: Card
%s
not installed !
\n
"
,
CardType
[
cards
[
i
].
typ
]
);
"HiSax: Card
type %d
not installed !
\n
"
,
cards
[
i
].
typ
);
HiSax_shiftcards
(
i
);
nrcards
--
;
}
...
...
drivers/isdn/hisax/diva.c
View file @
c747c791
...
...
@@ -362,7 +362,7 @@ diva_ipacx_pci_irq(int intno, void *dev_id, struct pt_regs *regs)
static
void
diva_release
(
struct
IsdnCardState
*
cs
)
{
del_timer
(
&
cs
->
hw
.
diva
.
tl
);
del_timer
_sync
(
&
cs
->
hw
.
diva
.
tl
);
if
(
cs
->
hw
.
diva
.
cfg_reg
)
byteout
(
cs
->
hw
.
diva
.
ctrl
,
0
);
/* LED off, Reset */
...
...
@@ -515,6 +515,162 @@ static struct card_ops diva_ipacx_pci_ops = {
.
irq_func
=
diva_ipacx_pci_irq
,
};
static
int
__init
diva_ipac_probe
(
struct
IsdnCardState
*
cs
)
{
u8
val
;
// request_io
val
=
readreg
(
cs
->
hw
.
diva
.
cfg_reg
+
DIVA_IPAC_ADR
,
cs
->
hw
.
diva
.
cfg_reg
+
DIVA_IPAC_DATA
,
IPAC_ID
);
printk
(
KERN_INFO
"Diva: IPAC version %x
\n
"
,
val
);
return
(
val
==
1
||
val
==
2
);
}
static
int
__init
diva_ipac_isa_probe
(
struct
IsdnCardState
*
cs
,
struct
IsdnCard
*
card
)
{
cs
->
subtyp
=
DIVA_IPAC_ISA
;
cs
->
irq
=
card
->
para
[
0
];
cs
->
hw
.
diva
.
cfg_reg
=
card
->
para
[
1
];
cs
->
hw
.
diva
.
isac
=
card
->
para
[
1
]
+
DIVA_IPAC_DATA
;
cs
->
hw
.
diva
.
isac_adr
=
card
->
para
[
1
]
+
DIVA_IPAC_ADR
;
printk
(
KERN_INFO
"Diva: %s card configured at %#lx IRQ %d
\n
"
,
"IPAC ISA"
,
cs
->
hw
.
diva
.
cfg_reg
,
cs
->
irq
);
if
(
!
request_io
(
&
cs
->
rs
,
cs
->
hw
.
diva
.
cfg_reg
,
8
,
"diva isdn"
))
goto
err
;
diva_ipac_isa_reset
(
cs
);
cs
->
card_ops
=
&
diva_ipac_isa_ops
;
if
(
ipac_setup
(
cs
,
&
ipac_dc_ops
,
&
ipac_bc_ops
))
goto
err
;
return
0
;
err:
hisax_release_resources
(
cs
);
return
-
EBUSY
;
}
static
int
__init
diva_isac_isa_probe
(
struct
IsdnCardState
*
cs
,
struct
IsdnCard
*
card
)
{
cs
->
subtyp
=
DIVA_ISA
;
cs
->
irq
=
card
->
para
[
0
];
cs
->
hw
.
diva
.
cfg_reg
=
card
->
para
[
1
];
cs
->
hw
.
diva
.
ctrl
=
card
->
para
[
1
]
+
DIVA_ISA_CTRL
;
cs
->
hw
.
diva
.
isac
=
card
->
para
[
1
]
+
DIVA_ISA_ISAC_DATA
;
cs
->
hw
.
diva
.
hscx
=
card
->
para
[
1
]
+
DIVA_HSCX_DATA
;
cs
->
hw
.
diva
.
isac_adr
=
card
->
para
[
1
]
+
DIVA_ISA_ISAC_ADR
;
cs
->
hw
.
diva
.
hscx_adr
=
card
->
para
[
1
]
+
DIVA_HSCX_ADR
;
printk
(
KERN_INFO
"Diva: %s card configured at %#lx IRQ %d
\n
"
,
"ISA"
,
cs
->
hw
.
diva
.
cfg_reg
,
cs
->
irq
);
if
(
!
request_io
(
&
cs
->
rs
,
cs
->
hw
.
diva
.
cfg_reg
,
8
,
"diva isdn"
))
goto
err
;
diva_reset
(
cs
);
init_timer
(
&
cs
->
hw
.
diva
.
tl
);
cs
->
hw
.
diva
.
tl
.
function
=
(
void
*
)
diva_led_handler
;
cs
->
hw
.
diva
.
tl
.
data
=
(
long
)
cs
;
cs
->
card_ops
=
&
diva_ops
;
if
(
hscxisac_setup
(
cs
,
&
isac_ops
,
&
hscx_ops
))
goto
err
;
return
0
;
err:
hisax_release_resources
(
cs
);
return
-
EBUSY
;
}
static
int
__init
diva_isa_probe
(
struct
IsdnCardState
*
cs
,
struct
IsdnCard
*
card
)
{
int
is_ipac
;
cs
->
hw
.
diva
.
cfg_reg
=
card
->
para
[
1
];
if
(
!
request_io
(
&
cs
->
rs
,
cs
->
hw
.
diva
.
cfg_reg
,
8
,
"diva isdn"
))
return
-
EBUSY
;
is_ipac
=
diva_ipac_probe
(
cs
);
hisax_release_resources
(
cs
);
if
(
is_ipac
)
return
diva_ipac_isa_probe
(
cs
,
card
);
else
return
diva_isac_isa_probe
(
cs
,
card
);
}
static
int
__init
diva_pci_probe
(
struct
IsdnCardState
*
cs
,
struct
pci_dev
*
pdev
)
{
if
(
pci_enable_device
(
pdev
))
goto
err
;
cs
->
subtyp
=
DIVA_PCI
;
cs
->
irq
=
pdev
->
irq
;
cs
->
irq_flags
|=
SA_SHIRQ
;
cs
->
hw
.
diva
.
cfg_reg
=
pci_resource_start
(
pdev
,
2
);
cs
->
hw
.
diva
.
ctrl
=
cs
->
hw
.
diva
.
cfg_reg
+
DIVA_PCI_CTRL
;
cs
->
hw
.
diva
.
isac
=
cs
->
hw
.
diva
.
cfg_reg
+
DIVA_PCI_ISAC_DATA
;
cs
->
hw
.
diva
.
hscx
=
cs
->
hw
.
diva
.
cfg_reg
+
DIVA_HSCX_DATA
;
cs
->
hw
.
diva
.
isac_adr
=
cs
->
hw
.
diva
.
cfg_reg
+
DIVA_PCI_ISAC_ADR
;
cs
->
hw
.
diva
.
hscx_adr
=
cs
->
hw
.
diva
.
cfg_reg
+
DIVA_HSCX_ADR
;
printk
(
KERN_INFO
"Diva: %s card configured at %#lx IRQ %d
\n
"
,
"PCI"
,
cs
->
hw
.
diva
.
cfg_reg
,
cs
->
irq
);
printk
(
KERN_INFO
"Diva: %s space at %#lx
\n
"
,
"PCI"
,
cs
->
hw
.
diva
.
pci_cfg
);
if
(
!
request_io
(
&
cs
->
rs
,
cs
->
hw
.
diva
.
cfg_reg
,
32
,
"diva isdn"
))
goto
err
;
return
0
;
err:
hisax_release_resources
(
cs
);
return
-
EBUSY
;
}
static
int
__init
diva_ipac_pci_probe
(
struct
IsdnCardState
*
cs
,
struct
pci_dev
*
pdev
)
{
if
(
pci_enable_device
(
pdev
))
goto
err
;
cs
->
subtyp
=
DIVA_IPAC_PCI
;
cs
->
irq
=
pdev
->
irq
;
cs
->
irq_flags
|=
SA_SHIRQ
;
cs
->
hw
.
diva
.
pci_cfg
=
(
unsigned
long
)
request_mmio
(
&
cs
->
rs
,
pci_resource_start
(
pdev
,
0
),
4096
,
"diva"
);
cs
->
hw
.
diva
.
cfg_reg
=
(
unsigned
long
)
request_mmio
(
&
cs
->
rs
,
pci_resource_start
(
pdev
,
1
),
4096
,
"diva"
);
printk
(
KERN_INFO
"Diva: %s card configured at %#lx IRQ %d
\n
"
,
"IPAC PCI"
,
cs
->
hw
.
diva
.
cfg_reg
,
cs
->
irq
);
printk
(
KERN_INFO
"Diva: %s space at %#lx
\n
"
,
"IPAC PCI"
,
cs
->
hw
.
diva
.
pci_cfg
);
diva_ipac_pci_reset
(
cs
);
cs
->
card_ops
=
&
diva_ipac_pci_ops
;
if
(
ipac_setup
(
cs
,
&
mem_ipac_dc_ops
,
&
mem_ipac_bc_ops
))
goto
err
;
return
0
;
err:
hisax_release_resources
(
cs
);
return
-
EBUSY
;
}
static
int
__init
diva_ipacx_pci_probe
(
struct
IsdnCardState
*
cs
,
struct
pci_dev
*
pdev
)
{
if
(
pci_enable_device
(
pdev
))
goto
err
;
cs
->
subtyp
=
DIVA_IPACX_PCI
;
cs
->
irq
=
pdev
->
irq
;
cs
->
irq_flags
|=
SA_SHIRQ
;
printk
(
KERN_INFO
"Diva: %s card configured at %#lx IRQ %d
\n
"
,
"IPACX PCI"
,
cs
->
hw
.
diva
.
cfg_reg
,
cs
->
irq
);
printk
(
KERN_INFO
"Diva: %s space at %#lx
\n
"
,
"IPACX PCI"
,
cs
->
hw
.
diva
.
pci_cfg
);
diva_ipacx_pci_reset
(
cs
);
cs
->
card_ops
=
&
diva_ipacx_pci_ops
;
if
(
ipacx_setup
(
cs
,
&
ipacx_dc_ops
,
&
ipacx_bc_ops
))
goto
err
;
return
0
;
err:
hisax_release_resources
(
cs
);
return
-
EBUSY
;
}
static
struct
pci_dev
*
dev_diva
__initdata
=
NULL
;
static
struct
pci_dev
*
dev_diva_u
__initdata
=
NULL
;
static
struct
pci_dev
*
dev_diva201
__initdata
=
NULL
;
...
...
@@ -545,101 +701,60 @@ static struct isapnp_device_id *pdev = &diva_ids[0];
static
struct
pnp_card
*
pnp_c
__devinitdata
=
NULL
;
#endif
int
__init
setup_diva
(
struct
IsdnCard
*
card
)
{
int
bytecnt
=
8
;
u8
val
;
struct
IsdnCardState
*
cs
=
card
->
cs
;
char
tmp
[
64
];
strcpy
(
tmp
,
Diva_revision
);
printk
(
KERN_INFO
"HiSax: Eicon.Diehl Diva driver Rev. %s
\n
"
,
HiSax_getrev
(
tmp
));
if
(
card
->
para
[
1
])
{
cs
->
hw
.
diva
.
ctrl_reg
=
0
;
cs
->
hw
.
diva
.
cfg_reg
=
card
->
para
[
1
];
val
=
readreg
(
cs
->
hw
.
diva
.
cfg_reg
+
DIVA_IPAC_ADR
,
cs
->
hw
.
diva
.
cfg_reg
+
DIVA_IPAC_DATA
,
IPAC_ID
);
printk
(
KERN_INFO
"Diva: IPAC version %x
\n
"
,
val
);
if
((
val
==
1
)
||
(
val
==
2
))
{
cs
->
subtyp
=
DIVA_IPAC_ISA
;
cs
->
hw
.
diva
.
ctrl
=
0
;
cs
->
hw
.
diva
.
isac
=
card
->
para
[
1
]
+
DIVA_IPAC_DATA
;
cs
->
hw
.
diva
.
hscx
=
card
->
para
[
1
]
+
DIVA_IPAC_DATA
;
cs
->
hw
.
diva
.
isac_adr
=
card
->
para
[
1
]
+
DIVA_IPAC_ADR
;
cs
->
hw
.
diva
.
hscx_adr
=
card
->
para
[
1
]
+
DIVA_IPAC_ADR
;
}
else
{
cs
->
subtyp
=
DIVA_ISA
;
cs
->
hw
.
diva
.
ctrl
=
card
->
para
[
1
]
+
DIVA_ISA_CTRL
;
cs
->
hw
.
diva
.
isac
=
card
->
para
[
1
]
+
DIVA_ISA_ISAC_DATA
;
cs
->
hw
.
diva
.
hscx
=
card
->
para
[
1
]
+
DIVA_HSCX_DATA
;
cs
->
hw
.
diva
.
isac_adr
=
card
->
para
[
1
]
+
DIVA_ISA_ISAC_ADR
;
cs
->
hw
.
diva
.
hscx_adr
=
card
->
para
[
1
]
+
DIVA_HSCX_ADR
;
}
cs
->
irq
=
card
->
para
[
0
];
}
else
{
if
(
diva_isa_probe
(
card
->
cs
,
card
)
<
0
)
return
0
;
return
1
;
}
#ifdef __ISAPNP__
if
(
isapnp_present
())
{
struct
pnp_card
*
pb
;
struct
pnp_dev
*
pd
;
while
(
pdev
->
card_vendor
)
{
if
((
pb
=
pnp_find_card
(
pdev
->
card_vendor
,
pdev
->
card_device
,
pnp_c
)))
{
pnp_c
=
pb
;
pd
=
NULL
;
if
((
pd
=
pnp_find_dev
(
pnp_c
,
pdev
->
vendor
,
pdev
->
function
,
pd
)))
{
printk
(
KERN_INFO
"HiSax: %s detected
\n
"
,
(
char
*
)
pdev
->
driver_data
);
if
(
pnp_device_attach
(
pd
)
<
0
)
{
printk
(
KERN_ERR
"Diva PnP: attach failed
\n
"
);
if
(
isapnp_present
())
{
struct
pnp_card
*
pb
;
struct
pnp_dev
*
pd
;
while
(
pdev
->
card_vendor
)
{
if
((
pb
=
pnp_find_card
(
pdev
->
card_vendor
,
pdev
->
card_device
,
pnp_c
)))
{
pnp_c
=
pb
;
pd
=
NULL
;
if
((
pd
=
pnp_find_dev
(
pnp_c
,
pdev
->
vendor
,
pdev
->
function
,
pd
)))
{
printk
(
KERN_INFO
"HiSax: %s detected
\n
"
,
(
char
*
)
pdev
->
driver_data
);
if
(
pnp_device_attach
(
pd
)
<
0
)
{
printk
(
KERN_ERR
"Diva PnP: attach failed
\n
"
);
return
0
;
}
if
(
pnp_activate_dev
(
pd
)
<
0
)
{
printk
(
KERN_ERR
"Diva PnP: activate failed
\n
"
);
pnp_device_detach
(
pd
);
return
0
;
}
if
(
!
pnp_irq_valid
(
pd
,
0
)
||
!
pnp_port_valid
(
pd
,
0
))
{
printk
(
KERN_ERR
"Diva PnP:some resources are missing %ld/%lx
\n
"
,
pnp_irq
(
pd
,
0
),
pnp_port_start
(
pd
,
0
));
pnp_device_detach
(
pd
);
return
(
0
);
}
card
->
para
[
1
]
=
pnp_port_start
(
pd
,
0
);
card
->
para
[
0
]
=
pnp_irq
(
pd
,
0
);
if
(
pdev
->
function
==
ISAPNP_FUNCTION
(
0xA1
))
{
if
(
diva_ipac_isa_probe
(
cs
->
card
,
cs
))
return
0
;
}
if
(
pnp_activate_dev
(
pd
)
<
0
)
{
printk
(
KERN_ERR
"Diva PnP: activate failed
\n
"
);
pnp_device_detach
(
pd
);
return
1
;
}
else
{
if
(
diva_isac_isa_probe
(
cs
->
card
,
cs
))
return
0
;
}
if
(
!
pnp_irq_valid
(
pd
,
0
)
||
!
pnp_port_valid
(
pd
,
0
))
{
printk
(
KERN_ERR
"Diva PnP:some resources are missing %ld/%lx
\n
"
,
pnp_irq
(
pd
,
0
),
pnp_port_start
(
pd
,
0
));
pnp_device_detach
(
pd
);
return
(
0
);
}
card
->
para
[
1
]
=
pnp_port_start
(
pd
,
0
);
card
->
para
[
0
]
=
pnp_irq
(
pd
,
0
);
cs
->
hw
.
diva
.
cfg_reg
=
card
->
para
[
1
];
cs
->
irq
=
card
->
para
[
0
];
if
(
pdev
->
function
==
ISAPNP_FUNCTION
(
0xA1
))
{
cs
->
subtyp
=
DIVA_IPAC_ISA
;
cs
->
hw
.
diva
.
ctrl
=
0
;
cs
->
hw
.
diva
.
isac
=
card
->
para
[
1
]
+
DIVA_IPAC_DATA
;
cs
->
hw
.
diva
.
hscx
=
card
->
para
[
1
]
+
DIVA_IPAC_DATA
;
cs
->
hw
.
diva
.
isac_adr
=
card
->
para
[
1
]
+
DIVA_IPAC_ADR
;
cs
->
hw
.
diva
.
hscx_adr
=
card
->
para
[
1
]
+
DIVA_IPAC_ADR
;
}
else
{
cs
->
subtyp
=
DIVA_ISA
;
cs
->
hw
.
diva
.
ctrl
=
card
->
para
[
1
]
+
DIVA_ISA_CTRL
;
cs
->
hw
.
diva
.
isac
=
card
->
para
[
1
]
+
DIVA_ISA_ISAC_DATA
;
cs
->
hw
.
diva
.
hscx
=
card
->
para
[
1
]
+
DIVA_HSCX_DATA
;
cs
->
hw
.
diva
.
isac_adr
=
card
->
para
[
1
]
+
DIVA_ISA_ISAC_ADR
;
cs
->
hw
.
diva
.
hscx_adr
=
card
->
para
[
1
]
+
DIVA_HSCX_ADR
;
}
goto
ready
;
return
1
;
}
else
{
printk
(
KERN_ERR
"Diva PnP: PnP error card found, no device
\n
"
);
return
(
0
);
...
...
@@ -652,111 +767,29 @@ setup_diva(struct IsdnCard *card)
printk
(
KERN_INFO
"Diva PnP: no ISAPnP card found
\n
"
);
}
}
}
#endif
#if CONFIG_PCI
cs
->
subtyp
=
0
;
if
((
dev_diva
=
pci_find_device
(
PCI_VENDOR_ID_EICON
,
PCI_DEVICE_ID_EICON_DIVA20
,
dev_diva
)))
{
if
(
pci_enable_device
(
dev_diva
))
return
(
0
);
cs
->
subtyp
=
DIVA_PCI
;
cs
->
irq
=
dev_diva
->
irq
;
cs
->
hw
.
diva
.
cfg_reg
=
pci_resource_start
(
dev_diva
,
2
);
}
else
if
((
dev_diva_u
=
pci_find_device
(
PCI_VENDOR_ID_EICON
,
PCI_DEVICE_ID_EICON_DIVA20_U
,
dev_diva_u
)))
{
if
(
pci_enable_device
(
dev_diva_u
))
return
(
0
);
cs
->
subtyp
=
DIVA_PCI
;
cs
->
irq
=
dev_diva_u
->
irq
;
cs
->
hw
.
diva
.
cfg_reg
=
pci_resource_start
(
dev_diva_u
,
2
);
}
else
if
((
dev_diva201
=
pci_find_device
(
PCI_VENDOR_ID_EICON
,
PCI_DEVICE_ID_EICON_DIVA201
,
dev_diva201
)))
{
if
(
pci_enable_device
(
dev_diva201
))
return
(
0
);
cs
->
subtyp
=
DIVA_IPAC_PCI
;
cs
->
irq
=
dev_diva201
->
irq
;
cs
->
hw
.
diva
.
pci_cfg
=
(
unsigned
long
)
request_mmio
(
&
cs
->
rs
,
pci_resource_start
(
dev_diva201
,
0
),
4096
,
"diva"
);
cs
->
hw
.
diva
.
cfg_reg
=
(
unsigned
long
)
request_mmio
(
&
cs
->
rs
,
pci_resource_start
(
dev_diva201
,
1
),
4096
,
"diva"
);
}
else
{
printk
(
KERN_WARNING
"Diva: No PCI card found
\n
"
);
return
(
0
);
}
if
(
!
cs
->
irq
)
{
printk
(
KERN_WARNING
"Diva: No IRQ for PCI card found
\n
"
);
goto
err
;
}
if
(
!
cs
->
hw
.
diva
.
cfg_reg
)
{
printk
(
KERN_WARNING
"Diva: No IO-Adr for PCI card found
\n
"
);
goto
err
;
}
cs
->
irq_flags
|=
SA_SHIRQ
;
#endif
/* CONFIG_PCI */
if
((
cs
->
subtyp
==
DIVA_IPAC_PCI
)
||
(
cs
->
subtyp
==
DIVA_IPACX_PCI
)
)
{
cs
->
hw
.
diva
.
ctrl
=
0
;
cs
->
hw
.
diva
.
isac
=
0
;
cs
->
hw
.
diva
.
hscx
=
0
;
cs
->
hw
.
diva
.
isac_adr
=
0
;
cs
->
hw
.
diva
.
hscx_adr
=
0
;
bytecnt
=
0
;
}
else
{
cs
->
hw
.
diva
.
ctrl
=
cs
->
hw
.
diva
.
cfg_reg
+
DIVA_PCI_CTRL
;
cs
->
hw
.
diva
.
isac
=
cs
->
hw
.
diva
.
cfg_reg
+
DIVA_PCI_ISAC_DATA
;
cs
->
hw
.
diva
.
hscx
=
cs
->
hw
.
diva
.
cfg_reg
+
DIVA_HSCX_DATA
;
cs
->
hw
.
diva
.
isac_adr
=
cs
->
hw
.
diva
.
cfg_reg
+
DIVA_PCI_ISAC_ADR
;
cs
->
hw
.
diva
.
hscx_adr
=
cs
->
hw
.
diva
.
cfg_reg
+
DIVA_HSCX_ADR
;
bytecnt
=
32
;
}
}
ready:
printk
(
KERN_INFO
"Diva: %s card configured at %#lx IRQ %d
\n
"
,
(
cs
->
subtyp
==
DIVA_PCI
)
?
"PCI"
:
(
cs
->
subtyp
==
DIVA_ISA
)
?
"ISA"
:
(
cs
->
subtyp
==
DIVA_IPAC_ISA
)
?
"IPAC ISA"
:
(
cs
->
subtyp
==
DIVA_IPAC_PCI
)
?
"IPAC PCI"
:
"IPACX PCI"
,
cs
->
hw
.
diva
.
cfg_reg
,
cs
->
irq
);
if
((
cs
->
subtyp
==
DIVA_IPAC_PCI
)
||
(
cs
->
subtyp
==
DIVA_IPACX_PCI
)
||
(
cs
->
subtyp
==
DIVA_PCI
)
)
printk
(
KERN_INFO
"Diva: %s space at %#lx
\n
"
,
(
cs
->
subtyp
==
DIVA_PCI
)
?
"PCI"
:
(
cs
->
subtyp
==
DIVA_IPAC_PCI
)
?
"IPAC PCI"
:
"IPACX PCI"
,
cs
->
hw
.
diva
.
pci_cfg
);
if
((
cs
->
subtyp
!=
DIVA_IPAC_PCI
)
&&
(
cs
->
subtyp
!=
DIVA_IPACX_PCI
)
)
{
if
(
!
request_io
(
&
cs
->
rs
,
cs
->
hw
.
diva
.
cfg_reg
,
bytecnt
,
"diva isdn"
))
if
((
dev_diva
=
pci_find_device
(
PCI_VENDOR_ID_EICON
,
PCI_DEVICE_ID_EICON_DIVA20
,
dev_diva
)))
{
if
(
diva_pci_probe
(
card
->
cs
,
dev_diva
))
return
0
;
return
1
;
}
else
if
((
dev_diva_u
=
pci_find_device
(
PCI_VENDOR_ID_EICON
,
PCI_DEVICE_ID_EICON_DIVA20_U
,
dev_diva_u
)))
{
if
(
diva_pci_probe
(
card
->
cs
,
dev_diva_u
))
return
0
;
return
1
;
}
else
if
((
dev_diva201
=
pci_find_device
(
PCI_VENDOR_ID_EICON
,
PCI_DEVICE_ID_EICON_DIVA201
,
dev_diva201
)))
{
if
(
diva_ipac_pci_probe
(
card
->
cs
,
dev_diva201
))
return
0
;
return
1
;
}
if
(
cs
->
subtyp
==
DIVA_IPAC_ISA
)
{
diva_ipac_isa_reset
(
cs
);
cs
->
card_ops
=
&
diva_ipac_isa_ops
;
if
(
ipac_setup
(
cs
,
&
ipac_dc_ops
,
&
ipac_bc_ops
))
goto
err
;
}
else
if
(
cs
->
subtyp
==
DIVA_IPAC_PCI
)
{
diva_ipac_pci_reset
(
cs
);
cs
->
card_ops
=
&
diva_ipac_pci_ops
;
if
(
ipac_setup
(
cs
,
&
mem_ipac_dc_ops
,
&
mem_ipac_bc_ops
))
goto
err
;
}
else
if
(
cs
->
subtyp
==
DIVA_IPACX_PCI
)
{
diva_ipacx_pci_reset
(
cs
);
cs
->
card_ops
=
&
diva_ipacx_pci_ops
;
if
(
ipacx_setup
(
cs
,
&
ipacx_dc_ops
,
&
ipacx_bc_ops
))
goto
err
;
}
else
{
/* DIVA 2.0 */
diva_reset
(
cs
);
cs
->
hw
.
diva
.
tl
.
function
=
(
void
*
)
diva_led_handler
;
cs
->
hw
.
diva
.
tl
.
data
=
(
long
)
cs
;
init_timer
(
&
cs
->
hw
.
diva
.
tl
);
cs
->
card_ops
=
&
diva_ops
;
if
(
hscxisac_setup
(
cs
,
&
isac_ops
,
&
hscx_ops
))
goto
err
;
}
return
1
;
err:
diva_release
(
cs
);
printk
(
KERN_WARNING
"Diva: No PCI card found
\n
"
);
#endif
/* CONFIG_PCI */
return
0
;
}
drivers/isdn/hisax/elsa.c
View file @
c747c791
...
...
@@ -690,7 +690,47 @@ static struct card_ops elsa_ipac_ops = {
.
irq_func
=
elsa_interrupt_ipac
,
};
static
unsigned
char
static
void
__init
elsa_arcofi_init
(
struct
IsdnCardState
*
cs
)
{
#if ARCOFI_USE
init_arcofi
(
cs
);
#endif
}
static
void
__init
elsa_timer_init
(
struct
IsdnCardState
*
cs
)
{
cs
->
hw
.
elsa
.
tl
.
function
=
(
void
*
)
elsa_led_handler
;
cs
->
hw
.
elsa
.
tl
.
data
=
(
long
)
cs
;
init_timer
(
&
cs
->
hw
.
elsa
.
tl
);
}
static
int
__init
elsa_timer_test
(
struct
IsdnCardState
*
cs
)
{
/* test timer */
byteout
(
cs
->
hw
.
elsa
.
trig
,
0xff
);
byteout
(
cs
->
hw
.
elsa
.
timer
,
0
);
if
(
!
TimerRun
(
cs
))
{
byteout
(
cs
->
hw
.
elsa
.
timer
,
0
);
/* second attempt */
if
(
!
TimerRun
(
cs
))
{
printk
(
KERN_WARNING
"Elsa: timer does not start
\n
"
);
goto
err
;
}
}
HZDELAY
(
10
*
HZ
/
1000
);
/* wait >=10 ms */
if
(
TimerRun
(
cs
))
{
printk
(
KERN_WARNING
"Elsa: timer does not run
\n
"
);
goto
err
;
}
printk
(
KERN_INFO
"Elsa: timer OK; resetting card
\n
"
);
return
0
;
err:
return
-
EBUSY
;
}
static
unsigned
char
__init
probe_elsa_adr
(
unsigned
int
adr
,
int
typ
)
{
int
i
,
in1
,
in2
,
p16_1
=
0
,
p16_2
=
0
,
p8_1
=
0
,
p8_2
=
0
,
pc_1
=
0
,
...
...
@@ -699,15 +739,13 @@ probe_elsa_adr(unsigned int adr, int typ)
/* In case of the elsa pcmcia card, this region is in use,
reserved for us by the card manager. So we do not check it
here, it would fail. */
if
(
typ
!=
ISDN_CTYPE_ELSA_PCMCIA
&&
check_region
(
adr
,
8
))
{
printk
(
KERN_WARNING
"Elsa: Probing Port 0x%x: already in use
\n
"
,
adr
);
return
(
0
);
if
(
typ
!=
ISDN_CTYPE_ELSA_PCMCIA
&&
!
request_region
(
adr
,
8
,
"elsa"
))
{
printk
(
KERN_WARNING
"Elsa: probing port 0x%x: in use
\n
"
,
adr
);
return
0
;
}
for
(
i
=
0
;
i
<
16
;
i
++
)
{
in1
=
inb
(
adr
+
ELSA_CONFIG
);
/* 'toggel
t' bei
*/
in2
=
inb
(
adr
+
ELSA_CONFIG
);
/*
jedem Zugriff
*/
in1
=
inb
(
adr
+
ELSA_CONFIG
);
/* 'toggel
s' at
*/
in2
=
inb
(
adr
+
ELSA_CONFIG
);
/*
each access
*/
p16_1
+=
0x04
&
in1
;
p16_2
+=
0x04
&
in2
;
p8_1
+=
0x02
&
in1
;
...
...
@@ -717,6 +755,7 @@ probe_elsa_adr(unsigned int adr, int typ)
pfp_1
+=
0x40
&
in1
;
pfp_2
+=
0x40
&
in2
;
}
release_region
(
adr
,
8
);
printk
(
KERN_INFO
"Elsa: Probing IO 0x%x"
,
adr
);
if
(
65
==
++
p16_1
*
++
p16_2
)
{
printk
(
" PCC-16/PCF found
\n
"
);
...
...
@@ -736,18 +775,227 @@ probe_elsa_adr(unsigned int adr, int typ)
}
}
static
unsigned
in
t
probe_elsa
(
struct
IsdnCardState
*
cs
)
static
int
__ini
t
elsa_probe
(
struct
IsdnCardState
*
cs
,
struct
IsdnCard
*
card
)
{
int
i
;
unsigned
int
CARD_portlist
[]
=
{
0x160
,
0x170
,
0x260
,
0x360
,
0
};
for
(
i
=
0
;
CARD_portlist
[
i
];
i
++
)
{
if
((
cs
->
subtyp
=
probe_elsa_adr
(
CARD_portlist
[
i
],
cs
->
typ
)))
u8
val
;
int
i
,
bytecnt
=
8
;
unsigned
int
CARD_portlist
[]
=
{
0x160
,
0x170
,
0x260
,
0x360
,
0
};
cs
->
hw
.
elsa
.
base
=
card
->
para
[
0
];
printk
(
KERN_INFO
"Elsa: Microlink IO probing
\n
"
);
if
(
cs
->
hw
.
elsa
.
base
)
{
cs
->
subtyp
=
probe_elsa_adr
(
cs
->
hw
.
elsa
.
base
,
cs
->
typ
);
if
(
!
cs
->
subtyp
)
{
printk
(
KERN_WARNING
"Elsa: no Microlink at %#lx
\n
"
,
cs
->
hw
.
elsa
.
base
);
goto
err
;
}
}
else
{
for
(
i
=
0
;
CARD_portlist
[
i
];
i
++
)
{
cs
->
subtyp
=
probe_elsa_adr
(
CARD_portlist
[
i
],
cs
->
typ
);
if
(
cs
->
subtyp
)
cs
->
hw
.
elsa
.
base
=
CARD_portlist
[
i
];
break
;
}
}
if
(
!
cs
->
hw
.
elsa
.
base
)
goto
err
;
cs
->
hw
.
elsa
.
cfg
=
cs
->
hw
.
elsa
.
base
+
ELSA_CONFIG
;
cs
->
hw
.
elsa
.
ctrl
=
cs
->
hw
.
elsa
.
base
+
ELSA_CONTROL
;
cs
->
hw
.
elsa
.
ale
=
cs
->
hw
.
elsa
.
base
+
ELSA_ALE
;
cs
->
hw
.
elsa
.
isac
=
cs
->
hw
.
elsa
.
base
+
ELSA_ISAC
;
cs
->
hw
.
elsa
.
itac
=
cs
->
hw
.
elsa
.
base
+
ELSA_ITAC
;
cs
->
hw
.
elsa
.
hscx
=
cs
->
hw
.
elsa
.
base
+
ELSA_HSCX
;
cs
->
hw
.
elsa
.
trig
=
cs
->
hw
.
elsa
.
base
+
ELSA_TRIG_IRQ
;
cs
->
hw
.
elsa
.
timer
=
cs
->
hw
.
elsa
.
base
+
ELSA_START_TIMER
;
val
=
bytein
(
cs
->
hw
.
elsa
.
cfg
);
if
(
cs
->
subtyp
==
ELSA_PC
)
{
const
u8
CARD_IrqTab
[
8
]
=
{
7
,
3
,
5
,
9
,
0
,
0
,
0
,
0
};
cs
->
irq
=
CARD_IrqTab
[(
val
&
ELSA_IRQ_IDX_PC
)
>>
2
];
}
else
if
(
cs
->
subtyp
==
ELSA_PCC8
)
{
const
u8
CARD_IrqTab
[
8
]
=
{
7
,
3
,
5
,
9
,
0
,
0
,
0
,
0
};
cs
->
irq
=
CARD_IrqTab
[(
val
&
ELSA_IRQ_IDX_PCC8
)
>>
4
];
}
else
{
const
u8
CARD_IrqTab
[
8
]
=
{
15
,
10
,
15
,
3
,
11
,
5
,
11
,
9
};
cs
->
irq
=
CARD_IrqTab
[(
val
&
ELSA_IRQ_IDX
)
>>
3
];
}
val
=
bytein
(
cs
->
hw
.
elsa
.
ale
)
&
ELSA_HW_RELEASE
;
if
(
val
<
3
)
val
|=
8
;
val
+=
'A'
-
3
;
if
(
val
==
'B'
||
val
==
'C'
)
val
^=
1
;
if
((
cs
->
subtyp
==
ELSA_PCFPRO
)
&&
(
val
=
'G'
))
val
=
'C'
;
printk
(
KERN_INFO
"Elsa: %s found at %#lx Rev.:%c IRQ %d
\n
"
,
Elsa_Types
[
cs
->
subtyp
],
cs
->
hw
.
elsa
.
base
,
val
,
cs
->
irq
);
val
=
bytein
(
cs
->
hw
.
elsa
.
ale
)
&
ELSA_S0_POWER_BAD
;
if
(
val
)
{
printk
(
KERN_WARNING
"Elsa: Microlink S0 bus power bad
\n
"
);
cs
->
hw
.
elsa
.
status
|=
ELSA_BAD_PWR
;
}
return
(
CARD_portlist
[
i
]);
switch
(
cs
->
subtyp
)
{
case
ELSA_PCFPRO
:
bytecnt
=
16
;
break
;
}
if
(
!
request_io
(
&
cs
->
rs
,
cs
->
hw
.
elsa
.
base
,
bytecnt
,
"elsa isdn"
))
goto
err
;
elsa_arcofi_init
(
cs
);
elsa_timer_init
(
cs
);
if
(
elsa_timer_test
(
cs
))
goto
err
;
elsa_reset
(
cs
);
cs
->
card_ops
=
&
elsa_ops
;
if
(
hscxisac_setup
(
cs
,
&
isac_ops
,
&
hscx_ops
))
goto
err
;
if
(
cs
->
subtyp
==
ELSA_PC
)
{
val
=
readitac
(
cs
,
ITAC_SYS
);
printk
(
KERN_INFO
"Elsa: ITAC version %s
\n
"
,
ITACVer
[
val
&
7
]);
writeitac
(
cs
,
ITAC_ISEN
,
0
);
writeitac
(
cs
,
ITAC_RFIE
,
0
);
writeitac
(
cs
,
ITAC_XFIE
,
0
);
writeitac
(
cs
,
ITAC_SCIE
,
0
);
writeitac
(
cs
,
ITAC_STIE
,
0
);
}
return
0
;
err:
elsa_release
(
cs
);
return
-
EBUSY
;
}
static
int
__init
elsa_qs_probe
(
struct
IsdnCardState
*
cs
,
struct
IsdnCard
*
card
)
{
int
bytecnt
=
8
;
cs
->
irq
=
card
->
para
[
0
];
cs
->
hw
.
elsa
.
base
=
card
->
para
[
1
];
cs
->
hw
.
elsa
.
cfg
=
cs
->
hw
.
elsa
.
base
+
ELSA_CONFIG
;
cs
->
hw
.
elsa
.
ale
=
cs
->
hw
.
elsa
.
base
+
ELSA_ALE
;
cs
->
hw
.
elsa
.
isac
=
cs
->
hw
.
elsa
.
base
+
ELSA_ISAC
;
cs
->
hw
.
elsa
.
hscx
=
cs
->
hw
.
elsa
.
base
+
ELSA_HSCX
;
cs
->
hw
.
elsa
.
trig
=
cs
->
hw
.
elsa
.
base
+
ELSA_TRIG_IRQ
;
cs
->
hw
.
elsa
.
timer
=
cs
->
hw
.
elsa
.
base
+
ELSA_START_TIMER
;
cs
->
hw
.
elsa
.
ctrl
=
cs
->
hw
.
elsa
.
base
+
ELSA_CONTROL
;
printk
(
KERN_INFO
"Elsa: %s defined at %#lx IRQ %d
\n
"
,
Elsa_Types
[
cs
->
subtyp
],
cs
->
hw
.
elsa
.
base
,
cs
->
irq
);
switch
(
cs
->
subtyp
)
{
case
ELSA_QS3000
:
bytecnt
=
16
;
break
;
}
if
(
!
request_io
(
&
cs
->
rs
,
cs
->
hw
.
elsa
.
base
,
bytecnt
,
"elsa isdn"
))
goto
err
;
elsa_arcofi_init
(
cs
);
elsa_timer_init
(
cs
);
if
(
elsa_timer_test
(
cs
))
goto
err
;
elsa_reset
(
cs
);
cs
->
card_ops
=
&
elsa_ops
;
if
(
hscxisac_setup
(
cs
,
&
isac_ops
,
&
hscx_ops
))
goto
err
;
return
0
;
err:
elsa_release
(
cs
);
return
-
EBUSY
;
}
static
int
__init
elsa_qs1000_probe
(
struct
IsdnCardState
*
cs
,
struct
IsdnCard
*
card
)
{
cs
->
subtyp
=
ELSA_QS1000
;
return
elsa_qs_probe
(
cs
,
card
);
}
static
int
__init
elsa_qs3000_probe
(
struct
IsdnCardState
*
cs
,
struct
IsdnCard
*
card
)
{
cs
->
subtyp
=
ELSA_QS3000
;
return
elsa_qs_probe
(
cs
,
card
);
}
static
int
__init
elsa_pcmcia_probe
(
struct
IsdnCardState
*
cs
,
struct
IsdnCard
*
card
)
{
u8
val
;
cs
->
irq
=
card
->
para
[
0
];
cs
->
hw
.
elsa
.
base
=
card
->
para
[
1
];
cs
->
hw
.
elsa
.
ale
=
cs
->
hw
.
elsa
.
base
+
0
;
val
=
readreg
(
cs
,
cs
->
hw
.
elsa
.
base
+
2
,
IPAC_ID
);
if
((
val
==
1
)
||
(
val
==
2
))
{
/* IPAC version 1.1/1.2 */
cs
->
subtyp
=
ELSA_PCMCIA_IPAC
;
cs
->
hw
.
elsa
.
isac
=
cs
->
hw
.
elsa
.
base
+
2
;
}
else
{
cs
->
subtyp
=
ELSA_PCMCIA
;
cs
->
hw
.
elsa
.
ale
=
cs
->
hw
.
elsa
.
base
+
ELSA_ALE_PCM
;
cs
->
hw
.
elsa
.
isac
=
cs
->
hw
.
elsa
.
base
+
ELSA_ISAC_PCM
;
cs
->
hw
.
elsa
.
hscx
=
cs
->
hw
.
elsa
.
base
+
ELSA_HSCX
;
}
cs
->
hw
.
elsa
.
timer
=
0
;
cs
->
hw
.
elsa
.
trig
=
0
;
cs
->
hw
.
elsa
.
ctrl
=
0
;
printk
(
KERN_INFO
"Elsa: %s defined at %#lx IRQ %d
\n
"
,
Elsa_Types
[
cs
->
subtyp
],
cs
->
hw
.
elsa
.
base
,
cs
->
irq
);
elsa_arcofi_init
(
cs
);
elsa_reset
(
cs
);
if
(
cs
->
subtyp
==
ELSA_PCMCIA_IPAC
)
{
cs
->
card_ops
=
&
elsa_ipac_ops
;
if
(
ipac_setup
(
cs
,
&
ipac_dc_ops
,
&
ipac_bc_ops
))
goto
err
;
}
else
{
cs
->
card_ops
=
&
elsa_ops
;
if
(
hscxisac_setup
(
cs
,
&
isac_ops
,
&
hscx_ops
))
goto
err
;
}
return
0
;
err:
elsa_release
(
cs
);
return
-
EBUSY
;
}
static
int
__init
elsa_qs_pci_probe
(
struct
IsdnCardState
*
cs
,
struct
pci_dev
*
pdev
,
int
subtyp
)
{
int
bytecnt
=
2
;
u8
pci_rev
;
if
(
pci_enable_device
(
pdev
))
goto
err
;
cs
->
subtyp
=
subtyp
;
cs
->
irq
=
pdev
->
irq
;
cs
->
irq_flags
|=
SA_SHIRQ
;
cs
->
hw
.
elsa
.
cfg
=
pci_resource_start
(
pdev
,
1
);
cs
->
hw
.
elsa
.
base
=
pci_resource_start
(
pdev
,
3
);
pci_read_config_byte
(
pdev
,
PCI_REVISION_ID
,
&
pci_rev
);
if
(
cs
->
hw
.
elsa
.
cfg
&
0x80
&&
pci_rev
==
1
)
{
printk
(
KERN_INFO
"Elsa: PLX9050 rev1 workaround activated
\n
"
);
__set_bit
(
FLG_BUGGY_PLX9050
,
&
cs
->
HW_Flags
);
}
cs
->
hw
.
elsa
.
ale
=
cs
->
hw
.
elsa
.
base
;
cs
->
hw
.
elsa
.
isac
=
cs
->
hw
.
elsa
.
base
+
1
;
cs
->
hw
.
elsa
.
hscx
=
cs
->
hw
.
elsa
.
base
+
1
;
printk
(
KERN_INFO
"Elsa: %s defined at %#lx/%#x IRQ %d
\n
"
,
Elsa_Types
[
cs
->
subtyp
],
cs
->
hw
.
elsa
.
base
,
cs
->
hw
.
elsa
.
cfg
,
cs
->
irq
);
switch
(
cs
->
subtyp
)
{
case
ELSA_QS3000PCI
:
bytecnt
=
16
;
break
;
}
if
(
!
request_io
(
&
cs
->
rs
,
cs
->
hw
.
elsa
.
base
,
bytecnt
,
"elsa isdn"
))
goto
err
;
if
(
!
request_io
(
&
cs
->
rs
,
cs
->
hw
.
elsa
.
cfg
,
0x80
,
"elsa isdn pci"
))
goto
err
;
elsa_arcofi_init
(
cs
);
elsa_timer_init
(
cs
);
elsa_reset
(
cs
);
cs
->
card_ops
=
&
elsa_ipac_ops
;
if
(
ipac_setup
(
cs
,
&
ipac_dc_ops
,
&
ipac_bc_ops
))
goto
err
;
return
0
;
err:
elsa_release
(
cs
);
return
-
EBUSY
;
}
static
struct
pci_dev
*
dev_qs1000
__devinitdata
=
NULL
;
...
...
@@ -771,83 +1019,21 @@ static struct pnp_card *pnp_c __devinitdata = NULL;
int
__devinit
setup_elsa
(
struct
IsdnCard
*
card
)
{
int
bytecnt
;
u8
val
,
pci_rev
;
struct
IsdnCardState
*
cs
=
card
->
cs
;
char
tmp
[
64
];
strcpy
(
tmp
,
Elsa_revision
);
printk
(
KERN_INFO
"HiSax: Elsa driver Rev. %s
\n
"
,
HiSax_getrev
(
tmp
));
cs
->
hw
.
elsa
.
ctrl_reg
=
0
;
cs
->
hw
.
elsa
.
status
=
0
;
cs
->
hw
.
elsa
.
MFlag
=
0
;
cs
->
subtyp
=
0
;
if
(
cs
->
typ
==
ISDN_CTYPE_ELSA
)
{
cs
->
hw
.
elsa
.
base
=
card
->
para
[
0
];
printk
(
KERN_INFO
"Elsa: Microlink IO probing
\n
"
);
if
(
cs
->
hw
.
elsa
.
base
)
{
if
(
!
(
cs
->
subtyp
=
probe_elsa_adr
(
cs
->
hw
.
elsa
.
base
,
cs
->
typ
)))
{
printk
(
KERN_WARNING
"Elsa: no Elsa Microlink at %#lx
\n
"
,
cs
->
hw
.
elsa
.
base
);
return
(
0
);
}
}
else
cs
->
hw
.
elsa
.
base
=
probe_elsa
(
cs
);
if
(
cs
->
hw
.
elsa
.
base
)
{
cs
->
hw
.
elsa
.
cfg
=
cs
->
hw
.
elsa
.
base
+
ELSA_CONFIG
;
cs
->
hw
.
elsa
.
ctrl
=
cs
->
hw
.
elsa
.
base
+
ELSA_CONTROL
;
cs
->
hw
.
elsa
.
ale
=
cs
->
hw
.
elsa
.
base
+
ELSA_ALE
;
cs
->
hw
.
elsa
.
isac
=
cs
->
hw
.
elsa
.
base
+
ELSA_ISAC
;
cs
->
hw
.
elsa
.
itac
=
cs
->
hw
.
elsa
.
base
+
ELSA_ITAC
;
cs
->
hw
.
elsa
.
hscx
=
cs
->
hw
.
elsa
.
base
+
ELSA_HSCX
;
cs
->
hw
.
elsa
.
trig
=
cs
->
hw
.
elsa
.
base
+
ELSA_TRIG_IRQ
;
cs
->
hw
.
elsa
.
timer
=
cs
->
hw
.
elsa
.
base
+
ELSA_START_TIMER
;
val
=
bytein
(
cs
->
hw
.
elsa
.
cfg
);
if
(
cs
->
subtyp
==
ELSA_PC
)
{
const
u8
CARD_IrqTab
[
8
]
=
{
7
,
3
,
5
,
9
,
0
,
0
,
0
,
0
};
cs
->
irq
=
CARD_IrqTab
[(
val
&
ELSA_IRQ_IDX_PC
)
>>
2
];
}
else
if
(
cs
->
subtyp
==
ELSA_PCC8
)
{
const
u8
CARD_IrqTab
[
8
]
=
{
7
,
3
,
5
,
9
,
0
,
0
,
0
,
0
};
cs
->
irq
=
CARD_IrqTab
[(
val
&
ELSA_IRQ_IDX_PCC8
)
>>
4
];
}
else
{
const
u8
CARD_IrqTab
[
8
]
=
{
15
,
10
,
15
,
3
,
11
,
5
,
11
,
9
};
cs
->
irq
=
CARD_IrqTab
[(
val
&
ELSA_IRQ_IDX
)
>>
3
];
}
val
=
bytein
(
cs
->
hw
.
elsa
.
ale
)
&
ELSA_HW_RELEASE
;
if
(
val
<
3
)
val
|=
8
;
val
+=
'A'
-
3
;
if
(
val
==
'B'
||
val
==
'C'
)
val
^=
1
;
if
((
cs
->
subtyp
==
ELSA_PCFPRO
)
&&
(
val
=
'G'
))
val
=
'C'
;
printk
(
KERN_INFO
"Elsa: %s found at %#lx Rev.:%c IRQ %d
\n
"
,
Elsa_Types
[
cs
->
subtyp
],
cs
->
hw
.
elsa
.
base
,
val
,
cs
->
irq
);
val
=
bytein
(
cs
->
hw
.
elsa
.
ale
)
&
ELSA_S0_POWER_BAD
;
if
(
val
)
{
printk
(
KERN_WARNING
"Elsa: Microlink S0 bus power bad
\n
"
);
cs
->
hw
.
elsa
.
status
|=
ELSA_BAD_PWR
;
}
}
else
{
printk
(
KERN_WARNING
"No Elsa Microlink found
\n
"
);
return
(
0
);
}
}
else
if
(
cs
->
typ
==
ISDN_CTYPE_ELSA_PNP
)
{
if
(
card
->
typ
==
ISDN_CTYPE_ELSA
)
{
if
(
elsa_probe
(
card
->
cs
,
card
))
return
0
;
return
1
;
}
else
if
(
card
->
typ
==
ISDN_CTYPE_ELSA_PNP
)
{
#ifdef __ISAPNP__
if
(
!
card
->
para
[
1
]
&&
isapnp_present
())
{
struct
pnp_card
*
pb
;
struct
pnp_dev
*
pd
;
while
(
pdev
->
card_vendor
)
{
if
((
pb
=
pnp_find_card
(
pdev
->
card_vendor
,
pdev
->
card_device
,
...
...
@@ -878,10 +1064,15 @@ setup_elsa(struct IsdnCard *card)
}
card
->
para
[
1
]
=
pnp_port_start
(
pd
,
0
);
card
->
para
[
0
]
=
pnp_irq
(
pd
,
0
);
if
(
pdev
->
function
==
ISAPNP_FUNCTION
(
0x133
))
cs
->
subtyp
=
ELSA_QS1000
;
else
cs
->
subtyp
=
ELSA_QS3000
;
if
(
pdev
->
function
==
ISAPNP_FUNCTION
(
0x133
))
{
if
(
elsa_qs1000_probe
(
card
->
cs
,
card
))
return
0
;
return
1
;
}
else
{
if
(
elsa_qs3000_probe
(
card
->
cs
,
card
))
return
0
;
return
1
;
}
break
;
}
else
{
printk
(
KERN_ERR
"Elsa PnP: PnP error card found, no device
\n
"
);
...
...
@@ -897,184 +1088,33 @@ setup_elsa(struct IsdnCard *card)
}
}
#endif
if
(
card
->
para
[
1
]
&&
card
->
para
[
0
])
{
cs
->
hw
.
elsa
.
base
=
card
->
para
[
1
];
cs
->
irq
=
card
->
para
[
0
];
if
(
!
cs
->
subtyp
)
cs
->
subtyp
=
ELSA_QS1000
;
}
else
{
printk
(
KERN_ERR
"Elsa PnP: no parameter
\n
"
);
}
cs
->
hw
.
elsa
.
cfg
=
cs
->
hw
.
elsa
.
base
+
ELSA_CONFIG
;
cs
->
hw
.
elsa
.
ale
=
cs
->
hw
.
elsa
.
base
+
ELSA_ALE
;
cs
->
hw
.
elsa
.
isac
=
cs
->
hw
.
elsa
.
base
+
ELSA_ISAC
;
cs
->
hw
.
elsa
.
hscx
=
cs
->
hw
.
elsa
.
base
+
ELSA_HSCX
;
cs
->
hw
.
elsa
.
trig
=
cs
->
hw
.
elsa
.
base
+
ELSA_TRIG_IRQ
;
cs
->
hw
.
elsa
.
timer
=
cs
->
hw
.
elsa
.
base
+
ELSA_START_TIMER
;
cs
->
hw
.
elsa
.
ctrl
=
cs
->
hw
.
elsa
.
base
+
ELSA_CONTROL
;
printk
(
KERN_INFO
"Elsa: %s defined at %#lx IRQ %d
\n
"
,
Elsa_Types
[
cs
->
subtyp
],
cs
->
hw
.
elsa
.
base
,
cs
->
irq
);
}
else
if
(
cs
->
typ
==
ISDN_CTYPE_ELSA_PCMCIA
)
{
cs
->
hw
.
elsa
.
base
=
card
->
para
[
1
];
cs
->
irq
=
card
->
para
[
0
];
cs
->
hw
.
elsa
.
ale
=
cs
->
hw
.
elsa
.
base
+
0
;
val
=
readreg
(
cs
,
cs
->
hw
.
elsa
.
base
+
2
,
IPAC_ID
);
if
((
val
==
1
)
||
(
val
==
2
))
{
/* IPAC version 1.1/1.2 */
cs
->
subtyp
=
ELSA_PCMCIA_IPAC
;
cs
->
hw
.
elsa
.
isac
=
cs
->
hw
.
elsa
.
base
+
2
;
cs
->
hw
.
elsa
.
hscx
=
cs
->
hw
.
elsa
.
base
+
2
;
}
else
{
cs
->
subtyp
=
ELSA_PCMCIA
;
cs
->
hw
.
elsa
.
ale
=
cs
->
hw
.
elsa
.
base
+
ELSA_ALE_PCM
;
cs
->
hw
.
elsa
.
isac
=
cs
->
hw
.
elsa
.
base
+
ELSA_ISAC_PCM
;
cs
->
hw
.
elsa
.
hscx
=
cs
->
hw
.
elsa
.
base
+
ELSA_HSCX
;
}
cs
->
hw
.
elsa
.
timer
=
0
;
cs
->
hw
.
elsa
.
trig
=
0
;
cs
->
hw
.
elsa
.
ctrl
=
0
;
printk
(
KERN_INFO
"Elsa: %s defined at %#lx IRQ %d
\n
"
,
Elsa_Types
[
cs
->
subtyp
],
cs
->
hw
.
elsa
.
base
,
cs
->
irq
);
}
else
if
(
cs
->
typ
==
ISDN_CTYPE_ELSA_PCI
)
{
if
(
elsa_qs1000_probe
(
card
->
cs
,
card
))
return
0
;
return
1
;
}
else
if
(
card
->
typ
==
ISDN_CTYPE_ELSA_PCMCIA
)
{
if
(
elsa_pcmcia_probe
(
card
->
cs
,
card
))
return
0
;
return
1
;
}
else
if
(
card
->
typ
==
ISDN_CTYPE_ELSA_PCI
)
{
#if CONFIG_PCI
cs
->
subtyp
=
0
;
if
((
dev_qs1000
=
pci_find_device
(
PCI_VENDOR_ID_ELSA
,
PCI_DEVICE_ID_ELSA_MICROLINK
,
dev_qs1000
)))
{
if
(
pci_enable_device
(
dev_qs1000
))
return
(
0
);
cs
->
subtyp
=
ELSA_QS1000PCI
;
cs
->
irq
=
dev_qs1000
->
irq
;
cs
->
hw
.
elsa
.
cfg
=
pci_resource_start
(
dev_qs1000
,
1
);
cs
->
hw
.
elsa
.
base
=
pci_resource_start
(
dev_qs1000
,
3
);
pci_read_config_byte
(
dev_qs1000
,
PCI_REVISION_ID
,
&
pci_rev
);
if
(
elsa_qs_pci_probe
(
card
->
cs
,
dev_qs1000
,
ELSA_QS1000PCI
))
return
0
;
return
1
;
}
else
if
((
dev_qs3000
=
pci_find_device
(
PCI_VENDOR_ID_ELSA
,
PCI_DEVICE_ID_ELSA_QS3000
,
dev_qs3000
)))
{
if
(
pci_enable_device
(
dev_qs3000
))
return
(
0
);
cs
->
subtyp
=
ELSA_QS3000PCI
;
cs
->
irq
=
dev_qs3000
->
irq
;
cs
->
hw
.
elsa
.
cfg
=
pci_resource_start
(
dev_qs3000
,
1
);
cs
->
hw
.
elsa
.
base
=
pci_resource_start
(
dev_qs3000
,
3
);
pci_read_config_byte
(
dev_qs1000
,
PCI_REVISION_ID
,
&
pci_rev
);
if
(
elsa_qs_pci_probe
(
card
->
cs
,
dev_qs3000
,
ELSA_QS3000PCI
))
return
0
;
return
1
;
}
else
{
printk
(
KERN_WARNING
"Elsa: No PCI card found
\n
"
);
return
(
0
);
}
if
(
!
cs
->
irq
)
{
printk
(
KERN_WARNING
"Elsa: No IRQ for PCI card found
\n
"
);
return
(
0
);
return
0
;
}
if
(
!
(
cs
->
hw
.
elsa
.
base
&&
cs
->
hw
.
elsa
.
cfg
))
{
printk
(
KERN_WARNING
"Elsa: No IO-Adr for PCI card found
\n
"
);
return
(
0
);
}
if
(
cs
->
hw
.
elsa
.
cfg
&
0x80
&&
pci_rev
==
1
)
{
printk
(
KERN_INFO
"Elsa: PLX9050 rev1 workaround activated
\n
"
);
set_bit
(
FLG_BUGGY_PLX9050
,
&
cs
->
HW_Flags
);
}
cs
->
hw
.
elsa
.
ale
=
cs
->
hw
.
elsa
.
base
;
cs
->
hw
.
elsa
.
isac
=
cs
->
hw
.
elsa
.
base
+
1
;
cs
->
hw
.
elsa
.
hscx
=
cs
->
hw
.
elsa
.
base
+
1
;
cs
->
hw
.
elsa
.
timer
=
0
;
cs
->
hw
.
elsa
.
trig
=
0
;
cs
->
irq_flags
|=
SA_SHIRQ
;
printk
(
KERN_INFO
"Elsa: %s defined at %#lx/0x%x IRQ %d
\n
"
,
Elsa_Types
[
cs
->
subtyp
],
cs
->
hw
.
elsa
.
base
,
cs
->
hw
.
elsa
.
cfg
,
cs
->
irq
);
#endif
/* CONFIG_PCI */
}
else
return
(
0
);
switch
(
cs
->
subtyp
)
{
case
ELSA_PC
:
case
ELSA_PCC8
:
case
ELSA_PCC16
:
case
ELSA_QS1000
:
case
ELSA_PCMCIA
:
case
ELSA_PCMCIA_IPAC
:
bytecnt
=
8
;
break
;
case
ELSA_PCFPRO
:
case
ELSA_PCF
:
case
ELSA_QS3000
:
case
ELSA_QS3000PCI
:
bytecnt
=
16
;
break
;
case
ELSA_QS1000PCI
:
bytecnt
=
2
;
break
;
default:
printk
(
KERN_WARNING
"Unknown ELSA subtype %d
\n
"
,
cs
->
subtyp
);
return
(
0
);
}
/* In case of the elsa pcmcia card, this region is in use,
reserved for us by the card manager. So we do not check it
here, it would fail. */
if
(
cs
->
typ
!=
ISDN_CTYPE_ELSA_PCMCIA
)
if
(
!
request_io
(
&
cs
->
rs
,
cs
->
hw
.
elsa
.
base
,
bytecnt
,
"elsa isdn"
))
goto
err
;
if
((
cs
->
subtyp
==
ELSA_QS1000PCI
)
||
(
cs
->
subtyp
==
ELSA_QS3000PCI
))
if
(
!
request_io
(
&
cs
->
rs
,
cs
->
hw
.
elsa
.
cfg
,
0x80
,
"elsa isdn pci"
))
goto
err
;
#if ARCOFI_USE
init_arcofi
(
cs
);
#endif
cs
->
hw
.
elsa
.
tl
.
function
=
(
void
*
)
elsa_led_handler
;
cs
->
hw
.
elsa
.
tl
.
data
=
(
long
)
cs
;
init_timer
(
&
cs
->
hw
.
elsa
.
tl
);
/* Teste Timer */
if
(
cs
->
hw
.
elsa
.
timer
)
{
byteout
(
cs
->
hw
.
elsa
.
trig
,
0xff
);
byteout
(
cs
->
hw
.
elsa
.
timer
,
0
);
if
(
!
TimerRun
(
cs
))
{
byteout
(
cs
->
hw
.
elsa
.
timer
,
0
);
/* 2. Versuch */
if
(
!
TimerRun
(
cs
))
{
printk
(
KERN_WARNING
"Elsa: timer do not start
\n
"
);
goto
err
;
}
}
HZDELAY
(
1
);
/* wait >=10 ms */
if
(
TimerRun
(
cs
))
{
printk
(
KERN_WARNING
"Elsa: timer do not run down
\n
"
);
goto
err
;
}
printk
(
KERN_INFO
"Elsa: timer OK; resetting card
\n
"
);
}
elsa_reset
(
cs
);
if
((
cs
->
subtyp
==
ELSA_QS1000PCI
)
||
(
cs
->
subtyp
==
ELSA_QS3000PCI
)
||
(
cs
->
subtyp
==
ELSA_PCMCIA_IPAC
))
{
cs
->
card_ops
=
&
elsa_ipac_ops
;
if
(
ipac_setup
(
cs
,
&
ipac_dc_ops
,
&
ipac_bc_ops
))
goto
err
;
}
else
{
cs
->
card_ops
=
&
elsa_ops
;
if
(
hscxisac_setup
(
cs
,
&
isac_ops
,
&
hscx_ops
))
goto
err
;
}
if
(
cs
->
subtyp
==
ELSA_PC
)
{
val
=
readitac
(
cs
,
ITAC_SYS
);
printk
(
KERN_INFO
"Elsa: ITAC version %s
\n
"
,
ITACVer
[
val
&
7
]);
writeitac
(
cs
,
ITAC_ISEN
,
0
);
writeitac
(
cs
,
ITAC_RFIE
,
0
);
writeitac
(
cs
,
ITAC_XFIE
,
0
);
writeitac
(
cs
,
ITAC_SCIE
,
0
);
writeitac
(
cs
,
ITAC_STIE
,
0
);
}
return
1
;
err:
elsa_release
(
cs
);
return
0
;
}
drivers/isdn/hisax/enternow_pci.c
View file @
c747c791
...
...
@@ -263,13 +263,65 @@ static struct card_ops enpci_ops = {
.
irq_func
=
enpci_interrupt
,
};
static
int
__init
enpci_probe
(
struct
IsdnCardState
*
cs
,
struct
pci_dev
*
pdev
)
{
if
(
pci_enable_device
(
pdev
))
goto
err
;
cs
->
irq
=
pdev
->
irq
;
cs
->
irq_flags
|=
SA_SHIRQ
;
cs
->
hw
.
njet
.
base
=
pci_resource_start
(
pdev
,
0
);
if
(
!
request_io
(
&
cs
->
rs
,
cs
->
hw
.
njet
.
base
,
0x100
,
"Fn_ISDN"
))
goto
err
;
cs
->
hw
.
njet
.
auxa
=
cs
->
hw
.
njet
.
base
+
NETJET_AUXDATA
;
cs
->
hw
.
njet
.
isac
=
cs
->
hw
.
njet
.
base
+
0xC0
;
// Fenster zum AMD
/* Reset an */
cs
->
hw
.
njet
.
ctrl_reg
=
0x07
;
// gendert von 0xff
OutByte
(
cs
->
hw
.
njet
.
base
+
NETJET_CTRL
,
cs
->
hw
.
njet
.
ctrl_reg
);
set_current_state
(
TASK_UNINTERRUPTIBLE
);
/* 50 ms Pause */
schedule_timeout
((
50
*
HZ
)
/
1000
);
cs
->
hw
.
njet
.
ctrl_reg
=
0x30
;
/* Reset Off and status read clear */
OutByte
(
cs
->
hw
.
njet
.
base
+
NETJET_CTRL
,
cs
->
hw
.
njet
.
ctrl_reg
);
set_current_state
(
TASK_UNINTERRUPTIBLE
);
schedule_timeout
((
10
*
HZ
)
/
1000
);
/* Timeout 10ms */
cs
->
hw
.
njet
.
auxd
=
0x00
;
// war 0xc0
cs
->
hw
.
njet
.
dmactrl
=
0
;
OutByte
(
cs
->
hw
.
njet
.
base
+
NETJET_AUXCTRL
,
~
TJ_AMD_IRQ
);
OutByte
(
cs
->
hw
.
njet
.
base
+
NETJET_IRQMASK1
,
TJ_AMD_IRQ
);
OutByte
(
cs
->
hw
.
njet
.
auxa
,
cs
->
hw
.
njet
.
auxd
);
printk
(
KERN_INFO
"enter:now PCI: PCI card configured at 0x%lx IRQ %d
\n
"
,
cs
->
hw
.
njet
.
base
,
cs
->
irq
);
reset_enpci
(
cs
);
cs
->
hw
.
njet
.
last_is0
=
0
;
cs
->
hw
.
njet
.
bc_activate
=
enpci_bc_activate
;
cs
->
hw
.
njet
.
bc_deactivate
=
enpci_bc_deactivate
;
amd7930_setup
(
cs
,
&
amd7930_ops
,
&
enpci_setIrqMask
);
cs
->
card_ops
=
&
enpci_ops
;
return
0
;
err:
hisax_release_resources
(
cs
);
return
-
EBUSY
;
}
static
struct
pci_dev
*
dev_netjet
__initdata
=
NULL
;
/* called by config.c */
int
__init
setup_enternow_pci
(
struct
IsdnCard
*
card
)
{
struct
IsdnCardState
*
cs
=
card
->
cs
;
char
tmp
[
64
];
#ifdef __BIG_ENDIAN
...
...
@@ -278,72 +330,22 @@ setup_enternow_pci(struct IsdnCard *card)
strcpy
(
tmp
,
enternow_pci_rev
);
printk
(
KERN_INFO
"HiSax: Formula-n Europe AG enter:now ISDN PCI driver Rev. %s
\n
"
,
HiSax_getrev
(
tmp
));
for
(
;;
)
{
if
((
dev_netjet
=
pci_find_device
(
PCI_VENDOR_ID_TIGERJET
,
PCI_DEVICE_ID_TIGERJET_300
,
dev_netjet
)))
{
if
(
pci_enable_device
(
dev_netjet
))
return
(
0
);
cs
->
irq
=
dev_netjet
->
irq
;
if
(
!
cs
->
irq
)
{
printk
(
KERN_WARNING
"enter:now PCI: No IRQ for PCI card found
\n
"
);
return
(
0
);
}
cs
->
hw
.
njet
.
base
=
pci_resource_start
(
dev_netjet
,
0
);
if
(
!
cs
->
hw
.
njet
.
base
)
{
printk
(
KERN_WARNING
"enter:now PCI: No IO-Adr for PCI card found
\n
"
);
return
(
0
);
}
/* checks Sub-Vendor ID because system crashes with Traverse-Card */
if
((
dev_netjet
->
subsystem_vendor
!=
0x55
)
||
(
dev_netjet
->
subsystem_device
!=
0x02
))
{
printk
(
KERN_WARNING
"enter:now: You tried to load this driver with an incompatible TigerJet-card
\n
"
);
printk
(
KERN_WARNING
"Use type=20 for Traverse NetJet PCI Card.
\n
"
);
return
(
0
);
}
}
else
{
printk
(
KERN_WARNING
"enter:now PCI: No PCI card found
\n
"
);
return
(
0
);
dev_netjet
=
pci_find_device
(
PCI_VENDOR_ID_TIGERJET
,
PCI_DEVICE_ID_TIGERJET_300
,
dev_netjet
);
if
(
dev_netjet
)
{
if
(
dev_netjet
->
subsystem_vendor
!=
0x55
||
dev_netjet
->
subsystem_device
!=
0x02
)
{
printk
(
KERN_WARNING
"enter:now: You tried to load "
"this driver with an incompatible "
"TigerJet-card
\n
"
);
printk
(
KERN_WARNING
"Use type=20 for Traverse "
"NetJet PCI Card.
\n
"
);
return
0
;
}
cs
->
hw
.
njet
.
auxa
=
cs
->
hw
.
njet
.
base
+
NETJET_AUXDATA
;
cs
->
hw
.
njet
.
isac
=
cs
->
hw
.
njet
.
base
+
0xC0
;
// Fenster zum AMD
/* Reset an */
cs
->
hw
.
njet
.
ctrl_reg
=
0x07
;
// gendert von 0xff
OutByte
(
cs
->
hw
.
njet
.
base
+
NETJET_CTRL
,
cs
->
hw
.
njet
.
ctrl_reg
);
set_current_state
(
TASK_UNINTERRUPTIBLE
);
/* 50 ms Pause */
schedule_timeout
((
50
*
HZ
)
/
1000
);
cs
->
hw
.
njet
.
ctrl_reg
=
0x30
;
/* Reset Off and status read clear */
OutByte
(
cs
->
hw
.
njet
.
base
+
NETJET_CTRL
,
cs
->
hw
.
njet
.
ctrl_reg
);
set_current_state
(
TASK_UNINTERRUPTIBLE
);
schedule_timeout
((
10
*
HZ
)
/
1000
);
/* Timeout 10ms */
cs
->
hw
.
njet
.
auxd
=
0x00
;
// war 0xc0
cs
->
hw
.
njet
.
dmactrl
=
0
;
OutByte
(
cs
->
hw
.
njet
.
base
+
NETJET_AUXCTRL
,
~
TJ_AMD_IRQ
);
OutByte
(
cs
->
hw
.
njet
.
base
+
NETJET_IRQMASK1
,
TJ_AMD_IRQ
);
OutByte
(
cs
->
hw
.
njet
.
auxa
,
cs
->
hw
.
njet
.
auxd
);
break
;
}
printk
(
KERN_INFO
"enter:now PCI: PCI card configured at 0x%lx IRQ %d
\n
"
,
cs
->
hw
.
njet
.
base
,
cs
->
irq
);
if
(
!
request_io
(
&
cs
->
rs
,
cs
->
hw
.
njet
.
base
,
0x100
,
"Fn_ISDN"
))
if
(
enpci_probe
(
card
->
cs
,
dev_netjet
))
return
1
;
return
0
;
reset_enpci
(
cs
);
cs
->
hw
.
njet
.
last_is0
=
0
;
cs
->
hw
.
njet
.
bc_activate
=
enpci_bc_activate
;
cs
->
hw
.
njet
.
bc_deactivate
=
enpci_bc_deactivate
;
amd7930_setup
(
cs
,
&
amd7930_ops
,
&
enpci_setIrqMask
);
cs
->
irq_flags
|=
SA_SHIRQ
;
cs
->
card_ops
=
&
enpci_ops
;
return
1
;
}
printk
(
KERN_WARNING
"enter:now PCI: No PCI card found
\n
"
);
return
0
;
}
drivers/isdn/hisax/gazel.c
View file @
c747c791
...
...
@@ -294,60 +294,6 @@ gazel_init(struct IsdnCardState *cs)
inithscxisac
(
cs
);
}
static
int
r647_reserve_regions
(
struct
IsdnCardState
*
cs
)
{
int
i
,
base
=
cs
->
hw
.
gazel
.
hscx
[
0
];
for
(
i
=
0
;
i
<
0xc000
;
i
+=
0x1000
)
{
if
(
!
request_io
(
&
cs
->
rs
,
i
+
base
,
16
,
"gazel"
))
goto
err
;
}
if
(
!
request_io
(
&
cs
->
rs
,
0xc000
+
base
,
1
,
"gazel"
))
goto
err
;
return
0
;
err:
hisax_release_resources
(
cs
);
return
-
EBUSY
;
}
static
int
r685_reserve_regions
(
struct
IsdnCardState
*
cs
)
{
if
(
!
request_io
(
&
cs
->
rs
,
cs
->
hw
.
gazel
.
hscx
[
0
],
0x100
,
"gazel"
))
goto
err
;
if
(
!
request_io
(
&
cs
->
rs
,
cs
->
hw
.
gazel
.
cfg_reg
,
0x80
,
"gazel"
))
goto
err
;
return
0
;
err:
hisax_release_resources
(
cs
);
return
-
EBUSY
;
}
static
int
r742_reserve_regions
(
struct
IsdnCardState
*
cs
)
{
if
(
!
request_io
(
&
cs
->
rs
,
cs
->
hw
.
gazel
.
ipac
,
0x8
,
"gazel"
))
goto
err
;
return
0
;
err:
hisax_release_resources
(
cs
);
return
-
EBUSY
;
}
static
int
r753_reserve_regions
(
struct
IsdnCardState
*
cs
)
{
if
(
!
request_io
(
&
cs
->
rs
,
cs
->
hw
.
gazel
.
ipac
,
0x8
,
"gazel"
))
goto
err
;
if
(
!
request_io
(
&
cs
->
rs
,
cs
->
hw
.
gazel
.
cfg_reg
,
0x80
,
"gazel"
))
goto
err
;
return
0
;
err:
hisax_release_resources
(
cs
);
return
-
EBUSY
;
}
static
struct
card_ops
r647_ops
=
{
.
init
=
gazel_init
,
.
reset
=
r647_reset
,
...
...
@@ -377,194 +323,213 @@ static struct card_ops r753_ops = {
};
static
int
__init
setup_gazelisa
(
struct
IsdnCard
*
card
,
struct
IsdnCardState
*
cs
)
gazel647_probe
(
struct
IsdnCardState
*
cs
,
struct
IsdnCard
*
card
)
{
printk
(
KERN_INFO
"Gazel: ISA PnP card automatic recognition
\n
"
);
// we got an irq parameter, assume it is an ISA card
// R742 decodes address even in not started...
// R647 returns FF if not present or not started
// eventually needs improvment
cs
->
hw
.
gazel
.
ipac
=
card
->
para
[
1
];
if
(
ipac_read
(
cs
,
IPAC_ID
)
==
1
)
cs
->
subtyp
=
R742
;
else
cs
->
subtyp
=
R647
;
int
i
,
base
;
cs
->
subtyp
=
R647
;
cs
->
irq
=
card
->
para
[
0
];
cs
->
hw
.
gazel
.
cfg_reg
=
card
->
para
[
1
]
+
0xC000
;
printk
(
KERN_INFO
"Gazel: Card ISA R647/R648 found
\n
"
);
cs
->
dc
.
isac
.
adf2
=
0x87
;
printk
(
KERN_INFO
"Gazel: config irq:%d isac:0x%X cfg:0x%X
\n
"
,
cs
->
irq
,
cs
->
hw
.
gazel
.
isac
,
cs
->
hw
.
gazel
.
cfg_reg
);
printk
(
KERN_INFO
"Gazel: hscx A:0x%X hscx B:0x%X
\n
"
,
cs
->
hw
.
gazel
.
hscx
[
0
],
cs
->
hw
.
gazel
.
hscx
[
1
]);
cs
->
hw
.
gazel
.
isac
=
card
->
para
[
1
]
+
0x8000
;
cs
->
hw
.
gazel
.
hscx
[
0
]
=
card
->
para
[
1
];
cs
->
hw
.
gazel
.
hscx
[
1
]
=
card
->
para
[
1
]
+
0x4000
;
cs
->
irq
=
card
->
para
[
0
];
cs
->
hw
.
gazel
.
isacfifo
=
cs
->
hw
.
gazel
.
isac
;
cs
->
hw
.
gazel
.
hscxfifo
[
0
]
=
cs
->
hw
.
gazel
.
hscx
[
0
];
cs
->
hw
.
gazel
.
hscxfifo
[
1
]
=
cs
->
hw
.
gazel
.
hscx
[
1
];
switch
(
cs
->
subtyp
)
{
case
R647
:
printk
(
KERN_INFO
"Gazel: Card ISA R647/R648 found
\n
"
);
cs
->
dc
.
isac
.
adf2
=
0x87
;
printk
(
KERN_INFO
"Gazel: config irq:%d isac:0x%X cfg:0x%X
\n
"
,
cs
->
irq
,
cs
->
hw
.
gazel
.
isac
,
cs
->
hw
.
gazel
.
cfg_reg
);
printk
(
KERN_INFO
"Gazel: hscx A:0x%X hscx B:0x%X
\n
"
,
cs
->
hw
.
gazel
.
hscx
[
0
],
cs
->
hw
.
gazel
.
hscx
[
1
]);
return
r647_reserve_regions
(
cs
);
case
R742
:
printk
(
KERN_INFO
"Gazel: Card ISA R742 found
\n
"
);
printk
(
KERN_INFO
"Gazel: config irq:%d ipac:0x%X
\n
"
,
cs
->
irq
,
cs
->
hw
.
gazel
.
ipac
);
return
r742_reserve_regions
(
cs
);
base
=
cs
->
hw
.
gazel
.
hscx
[
0
];
for
(
i
=
0
;
i
<
0xc000
;
i
+=
0x1000
)
{
if
(
!
request_io
(
&
cs
->
rs
,
base
+
i
,
16
,
"gazel"
))
goto
err
;
}
if
(
!
request_io
(
&
cs
->
rs
,
0xc000
+
base
,
1
,
"gazel"
))
goto
err
;
cs
->
card_ops
=
&
r647_ops
;
if
(
hscxisac_setup
(
cs
,
&
r647_isac_ops
,
&
r647_hscx_ops
))
goto
err
;
cs
->
card_ops
->
reset
(
cs
);
return
0
;
err:
hisax_release_resources
(
cs
);
return
-
EBUSY
;
}
static
struct
pci_dev
*
dev_tel
__initdata
=
NULL
;
static
int
__init
setup_gazelpci
(
struct
IsdnCardState
*
cs
)
gazel742_probe
(
struct
IsdnCardState
*
cs
,
struct
IsdnCard
*
card
)
{
u_int
pci_ioaddr0
=
0
,
pci_ioaddr1
=
0
;
u8
pci_irq
=
0
,
found
;
u_int
nbseek
,
seekcard
;
u8
pci_rev
;
cs
->
subtyp
=
R742
;
cs
->
irq
=
card
->
para
[
0
];
cs
->
hw
.
gazel
.
cfg_reg
=
card
->
para
[
1
]
+
0xC000
;
printk
(
KERN_WARNING
"Gazel: PCI card automatic recognition
\n
"
);
printk
(
KERN_INFO
"Gazel: Card ISA R742 found
\n
"
);
printk
(
KERN_INFO
"Gazel: config irq:%d ipac:0x%X
\n
"
,
cs
->
irq
,
cs
->
hw
.
gazel
.
ipac
);
found
=
0
;
if
(
!
pci_present
())
{
printk
(
KERN_WARNING
"Gazel: No PCI bus present
\n
"
);
return
1
;
}
seekcard
=
PCI_DEVICE_ID_PLX_R685
;
for
(
nbseek
=
0
;
nbseek
<
3
;
nbseek
++
)
{
if
((
dev_tel
=
pci_find_device
(
PCI_VENDOR_ID_PLX
,
seekcard
,
dev_tel
)))
{
if
(
pci_enable_device
(
dev_tel
))
return
1
;
pci_irq
=
dev_tel
->
irq
;
pci_ioaddr0
=
pci_resource_start
(
dev_tel
,
1
);
pci_ioaddr1
=
pci_resource_start
(
dev_tel
,
2
);
found
=
1
;
}
if
(
found
)
break
;
else
{
switch
(
seekcard
)
{
case
PCI_DEVICE_ID_PLX_R685
:
seekcard
=
PCI_DEVICE_ID_PLX_R753
;
break
;
case
PCI_DEVICE_ID_PLX_R753
:
seekcard
=
PCI_DEVICE_ID_PLX_DJINN_ITOO
;
break
;
}
}
}
if
(
!
found
)
{
printk
(
KERN_WARNING
"Gazel: No PCI card found
\n
"
);
return
-
ENODEV
;
}
if
(
!
pci_irq
)
{
printk
(
KERN_WARNING
"Gazel: No IRQ for PCI card found
\n
"
);
return
-
ENODEV
;
}
cs
->
hw
.
gazel
.
pciaddr
[
0
]
=
pci_ioaddr0
;
cs
->
hw
.
gazel
.
pciaddr
[
1
]
=
pci_ioaddr1
;
pci_ioaddr1
&=
0xfffe
;
cs
->
hw
.
gazel
.
cfg_reg
=
pci_ioaddr0
&
0xfffe
;
cs
->
hw
.
gazel
.
ipac
=
pci_ioaddr1
;
cs
->
hw
.
gazel
.
isac
=
pci_ioaddr1
+
0x80
;
cs
->
hw
.
gazel
.
hscx
[
0
]
=
pci_ioaddr1
;
cs
->
hw
.
gazel
.
hscx
[
1
]
=
pci_ioaddr1
+
0x40
;
cs
->
hw
.
gazel
.
isacfifo
=
cs
->
hw
.
gazel
.
isac
;
if
(
!
request_io
(
&
cs
->
rs
,
cs
->
hw
.
gazel
.
ipac
,
0x8
,
"gazel"
))
goto
err
;
cs
->
card_ops
=
&
r742_ops
;
if
(
ipac_setup
(
cs
,
&
ipac_dc_ops
,
&
ipac_bc_ops
))
goto
err
;
cs
->
card_ops
->
reset
(
cs
);
return
0
;
err:
hisax_release_resources
(
cs
);
return
-
EBUSY
;
}
static
int
__init
gazel685_probe
(
struct
IsdnCardState
*
cs
,
struct
pci_dev
*
pdev
)
{
if
(
pci_enable_device
(
pdev
))
goto
err
;
cs
->
subtyp
=
R685
;
cs
->
irq
=
pdev
->
irq
;
cs
->
irq_flags
|=
SA_SHIRQ
;
cs
->
hw
.
gazel
.
cfg_reg
=
pci_resource_start
(
pdev
,
1
);
cs
->
hw
.
gazel
.
isac
=
pci_resource_start
(
pdev
,
2
)
+
0x80
;
cs
->
hw
.
gazel
.
hscx
[
0
]
=
pci_resource_start
(
pdev
,
2
);
cs
->
hw
.
gazel
.
hscx
[
1
]
=
pci_resource_start
(
pdev
,
2
)
+
0x40
;
cs
->
hw
.
gazel
.
isacfifo
=
cs
->
hw
.
gazel
.
isac
;
cs
->
hw
.
gazel
.
hscxfifo
[
0
]
=
cs
->
hw
.
gazel
.
hscx
[
0
];
cs
->
hw
.
gazel
.
hscxfifo
[
1
]
=
cs
->
hw
.
gazel
.
hscx
[
1
];
cs
->
irq
=
pci_irq
;
cs
->
irq_flags
|=
SA_SHIRQ
;
switch
(
seekcard
)
{
case
PCI_DEVICE_ID_PLX_R685
:
printk
(
KERN_INFO
"Gazel: Card PCI R685 found
\n
"
);
cs
->
subtyp
=
R685
;
cs
->
dc
.
isac
.
adf2
=
0x87
;
printk
(
KERN_INFO
"Gazel: config irq:%d isac:0x%X cfg:0x%X
\n
"
,
cs
->
irq
,
cs
->
hw
.
gazel
.
isac
,
cs
->
hw
.
gazel
.
cfg_reg
);
printk
(
KERN_INFO
"Gazel: hscx A:0x%X hscx B:0x%X
\n
"
,
cs
->
hw
.
gazel
.
hscx
[
0
],
cs
->
hw
.
gazel
.
hscx
[
1
]);
return
r685_reserve_regions
(
cs
);
case
PCI_DEVICE_ID_PLX_R753
:
case
PCI_DEVICE_ID_PLX_DJINN_ITOO
:
printk
(
KERN_INFO
"Gazel: Card PCI R753 found
\n
"
);
cs
->
subtyp
=
R753
;
printk
(
KERN_INFO
"Gazel: config irq:%d ipac:0x%X cfg:0x%X
\n
"
,
cs
->
irq
,
cs
->
hw
.
gazel
.
ipac
,
cs
->
hw
.
gazel
.
cfg_reg
);
/*
* Erratum for PLX9050, revision 1:
* If bit 7 of BAR 0/1 is set, local config registers
* can not be read (write is okay)
*/
if
(
cs
->
hw
.
gazel
.
cfg_reg
&
0x80
)
{
pci_read_config_byte
(
dev_tel
,
PCI_REVISION_ID
,
&
pci_rev
);
if
(
pci_rev
==
1
)
{
printk
(
KERN_INFO
"Gazel: PLX9050 rev1 workaround activated
\n
"
);
set_bit
(
FLG_BUGGY_PLX9050
,
&
cs
->
HW_Flags
);
}
cs
->
dc
.
isac
.
adf2
=
0x87
;
if
(
!
request_io
(
&
cs
->
rs
,
cs
->
hw
.
gazel
.
hscx
[
0
],
0x100
,
"gazel"
))
goto
err
;
if
(
!
request_io
(
&
cs
->
rs
,
cs
->
hw
.
gazel
.
cfg_reg
,
0x80
,
"gazel"
))
goto
err
;
printk
(
KERN_INFO
"Gazel: Card PCI R685 found
\n
"
);
printk
(
KERN_INFO
"Gazel: config irq:%d isac:0x%X cfg:0x%X
\n
"
,
cs
->
irq
,
cs
->
hw
.
gazel
.
isac
,
cs
->
hw
.
gazel
.
cfg_reg
);
printk
(
KERN_INFO
"Gazel: hscx A:0x%X hscx B:0x%X
\n
"
,
cs
->
hw
.
gazel
.
hscx
[
0
],
cs
->
hw
.
gazel
.
hscx
[
1
]);
cs
->
card_ops
=
&
r685_ops
;
if
(
hscxisac_setup
(
cs
,
&
r685_isac_ops
,
&
r685_hscx_ops
))
goto
err
;
cs
->
card_ops
->
reset
(
cs
);
return
0
;
err:
hisax_release_resources
(
cs
);
return
-
EBUSY
;
}
static
int
__init
gazel753_probe
(
struct
IsdnCardState
*
cs
,
struct
pci_dev
*
pdev
)
{
u8
pci_rev
;
if
(
pci_enable_device
(
pdev
))
goto
err
;
cs
->
subtyp
=
R753
;
cs
->
irq
=
pdev
->
irq
;
cs
->
irq_flags
|=
SA_SHIRQ
;
cs
->
hw
.
gazel
.
cfg_reg
=
pci_resource_start
(
pdev
,
1
);
cs
->
hw
.
gazel
.
ipac
=
pci_resource_start
(
pdev
,
2
);
if
(
!
request_io
(
&
cs
->
rs
,
cs
->
hw
.
gazel
.
ipac
,
0x8
,
"gazel"
))
goto
err
;
if
(
!
request_io
(
&
cs
->
rs
,
cs
->
hw
.
gazel
.
cfg_reg
,
0x80
,
"gazel"
))
goto
err
;
printk
(
KERN_INFO
"Gazel: Card PCI R753 found
\n
"
);
printk
(
KERN_INFO
"Gazel: config irq:%d ipac:0x%X cfg:0x%X
\n
"
,
cs
->
irq
,
cs
->
hw
.
gazel
.
ipac
,
cs
->
hw
.
gazel
.
cfg_reg
);
/*
* Erratum for PLX9050, revision 1:
* If bit 7 of BAR 0/1 is set, local config registers
* can not be read (write is okay)
*/
if
(
cs
->
hw
.
gazel
.
cfg_reg
&
0x80
)
{
pci_read_config_byte
(
pdev
,
PCI_REVISION_ID
,
&
pci_rev
);
if
(
pci_rev
==
1
)
{
printk
(
KERN_INFO
"Gazel: PLX9050 rev1 workaround "
"activated
\n
"
);
__set_bit
(
FLG_BUGGY_PLX9050
,
&
cs
->
HW_Flags
);
}
return
r753_reserve_regions
(
cs
);
}
cs
->
card_ops
=
&
r753_ops
;
if
(
ipac_setup
(
cs
,
&
ipac_dc_ops
,
&
ipac_bc_ops
))
goto
err
;
cs
->
card_ops
->
reset
(
cs
);
return
0
;
err:
hisax_release_resources
(
cs
);
return
-
EBUSY
;
}
static
struct
pci_dev
*
dev_tel
__initdata
=
NULL
;
static
u16
__initdata
dev_id
=
PCI_DEVICE_ID_PLX_R685
;
int
__init
setup_gazel
(
struct
IsdnCard
*
card
)
{
struct
IsdnCardState
*
cs
=
card
->
cs
;
char
tmp
[
64
];
strcpy
(
tmp
,
gazel_revision
);
printk
(
KERN_INFO
"Gazel: Driver Revision %s
\n
"
,
HiSax_getrev
(
tmp
));
if
(
card
->
para
[
0
])
{
if
(
setup_gazelisa
(
card
,
cs
))
return
(
0
);
}
else
{
if
(
setup_gazelpci
(
cs
))
return
(
0
);
printk
(
KERN_INFO
"Gazel: ISA card automatic recognition
\n
"
);
// we got an irq parameter, assume it is an ISA card
// R742 decodes address even in not started...
// R647 returns FF if not present or not started
// eventually needs improvment
card
->
cs
->
hw
.
gazel
.
ipac
=
card
->
para
[
1
];
if
(
ipac_read
(
card
->
cs
,
IPAC_ID
)
==
1
)
{
if
(
gazel742_probe
(
card
->
cs
,
card
))
return
0
;
}
else
{
if
(
gazel647_probe
(
card
->
cs
,
card
))
return
0
;
}
return
1
;
}
switch
(
cs
->
subtyp
)
{
case
R647
:
case
R685
:
if
(
cs
->
subtyp
==
R647
)
{
cs
->
card_ops
=
&
r647_ops
;
if
(
hscxisac_setup
(
cs
,
&
r647_isac_ops
,
&
r647_hscx_ops
))
goto
err
;
}
else
{
cs
->
card_ops
=
&
r685_ops
;
if
(
hscxisac_setup
(
cs
,
&
r685_isac_ops
,
&
r685_hscx_ops
))
goto
err
;
for
(;;)
{
dev_tel
=
pci_find_device
(
PCI_VENDOR_ID_PLX
,
dev_id
,
dev_tel
);
if
(
dev_tel
)
{
switch
(
dev_id
)
{
case
PCI_DEVICE_ID_PLX_R685
:
if
(
gazel685_probe
(
card
->
cs
,
dev_tel
))
return
0
;
return
1
;
case
PCI_DEVICE_ID_PLX_R753
:
case
PCI_DEVICE_ID_PLX_DJINN_ITOO
:
if
(
gazel753_probe
(
card
->
cs
,
dev_tel
))
return
0
;
return
1
;
}
}
cs
->
card_ops
->
reset
(
cs
);
break
;
case
R742
:
case
R753
:
if
(
cs
->
subtyp
==
R742
)
{
cs
->
card_ops
=
&
r742_ops
;
}
else
{
cs
->
card_ops
=
&
r753_ops
;
switch
(
dev_id
)
{
case
PCI_DEVICE_ID_PLX_R685
:
dev_id
=
PCI_DEVICE_ID_PLX_R753
;
case
PCI_DEVICE_ID_PLX_R753
:
dev_id
=
PCI_DEVICE_ID_PLX_DJINN_ITOO
;
default:
break
;
}
if
(
ipac_setup
(
cs
,
&
ipac_dc_ops
,
&
ipac_bc_ops
))
goto
err
;
cs
->
card_ops
->
reset
(
cs
);
break
;
}
return
1
;
err:
hisax_release_resources
(
cs
);
printk
(
KERN_WARNING
"Gazel: No PCI card found
\n
"
);
return
0
;
}
drivers/isdn/hisax/hfc_pci.c
View file @
c747c791
...
...
@@ -1382,72 +1382,41 @@ static struct card_ops hfcpci_ops = {
};
/* this variable is used as card index when more than one cards are present */
static
struct
pci_dev
*
dev_hfcpci
__initdata
=
NULL
;
int
__init
setup_hfcpci
(
struct
IsdnCard
*
card
)
static
int
__init
niccy_pci_probe
(
struct
IsdnCardState
*
cs
,
struct
pci_dev
*
pdev
,
int
i
)
{
struct
IsdnCardState
*
cs
=
card
->
cs
;
char
tmp
[
64
];
int
i
;
struct
pci_dev
*
tmp_hfcpci
=
NULL
;
int
rc
;
strcpy
(
tmp
,
hfcpci_revision
);
printk
(
KERN_INFO
"HiSax: HFC-PCI driver Rev. %s
\n
"
,
HiSax_getrev
(
tmp
));
cs
->
hw
.
hfcpci
.
int_s1
=
0
;
cs
->
dc
.
hfcpci
.
ph_state
=
0
;
cs
->
hw
.
hfcpci
.
fifo
=
255
;
rc
=
-
EBUSY
;
if
(
pci_enable_device
(
pdev
))
goto
err
;
i
=
0
;
while
(
id_list
[
i
].
vendor_id
)
{
tmp_hfcpci
=
pci_find_device
(
id_list
[
i
].
vendor_id
,
id_list
[
i
].
device_id
,
dev_hfcpci
);
i
++
;
if
(
tmp_hfcpci
)
{
if
(
pci_enable_device
(
tmp_hfcpci
))
continue
;
pci_set_master
(
tmp_hfcpci
);
if
((
card
->
para
[
0
])
&&
(
card
->
para
[
0
]
!=
(
tmp_hfcpci
->
resource
[
0
].
start
&
PCI_BASE_ADDRESS_IO_MASK
)))
continue
;
else
break
;
}
}
pci_set_master
(
pdev
);
cs
->
irq
=
pdev
->
irq
;
cs
->
irq_flags
|=
SA_SHIRQ
;
cs
->
hw
.
hfcpci
.
pdev
=
pdev
;
cs
->
hw
.
hfcpci
.
pci_io
=
request_mmio
(
&
cs
->
rs
,
pci_resource_start
(
pdev
,
1
),
128
,
"hfc_pci"
);
if
(
!
cs
->
hw
.
hfcpci
.
pci_io
)
goto
err
;
if
(
tmp_hfcpci
)
{
i
--
;
dev_hfcpci
=
tmp_hfcpci
;
/* old device */
cs
->
irq
=
dev_hfcpci
->
irq
;
cs
->
hw
.
hfcpci
.
pdev
=
tmp_hfcpci
;
if
(
!
cs
->
irq
)
{
printk
(
KERN_WARNING
"HFC-PCI: No IRQ for PCI card found
\n
"
);
return
(
0
);
}
printk
(
KERN_INFO
"HiSax: HFC-PCI card manufacturer: %s card name: %s
\n
"
,
id_list
[
i
].
vendor_name
,
id_list
[
i
].
card_name
);
}
else
{
printk
(
KERN_WARNING
"HFC-PCI: No PCI card found
\n
"
);
return
(
0
);
}
/* Allocate memory for FIFOS */
cs
->
hw
.
hfcpci
.
fifos
=
pci_alloc_consistent
(
tmp_hfcpci
,
32768
,
&
cs
->
hw
.
hfcpci
.
fifos_dma
);
if
(
!
cs
->
hw
.
hfcpci
.
fifos
)
{
printk
(
KERN_WARNING
"HFC-PCI: Error allocating memory for FIFO!
\n
"
);
return
0
;
}
rc
=
-
ENOMEM
;
cs
->
hw
.
hfcpci
.
fifos
=
pci_alloc_consistent
(
pdev
,
32768
,
&
cs
->
hw
.
hfcpci
.
fifos_dma
);
if
(
!
cs
->
hw
.
hfcpci
.
fifos
)
goto
err
;
pci_write_config_dword
(
cs
->
hw
.
hfcpci
.
pdev
,
0x80
,
(
u_int
)
cs
->
hw
.
hfcpci
.
fifos_dma
);
cs
->
hw
.
hfcpci
.
pci_io
=
request_mmio
(
&
cs
->
rs
,
dev_hfcpci
->
resource
[
1
].
start
,
256
,
"hfc_pci"
);
if
(
!
cs
->
hw
.
hfcpci
.
pci_io
)
goto
err
;
printk
(
KERN_INFO
"HFC-PCI: defined at mem %#x fifo %#x(%#x) IRQ %d HZ %d
\n
"
,
(
u_int
)
cs
->
hw
.
hfcpci
.
pci_io
,
(
u_int
)
cs
->
hw
.
hfcpci
.
fifos
,
(
u_int
)
cs
->
hw
.
hfcpci
.
fifos_dma
,
cs
->
irq
,
HZ
);
printk
(
KERN_INFO
"HiSax: HFC-PCI card manufacturer: %s name: %s
\n
"
,
id_list
[
i
].
vendor_name
,
id_list
[
i
].
card_name
);
printk
(
KERN_INFO
"HFC-PCI: defined at mem %#x fifo %#x(%#x) IRQ %d
\n
"
,
(
u_int
)
cs
->
hw
.
hfcpci
.
pci_io
,
(
u_int
)
cs
->
hw
.
hfcpci
.
fifos
,
(
u_int
)
cs
->
hw
.
hfcpci
.
fifos_dma
,
cs
->
irq
);
printk
(
"ChipID: %x
\n
"
,
Read_hfc
(
cs
,
HFCPCI_CHIP_ID
));
cs
->
hw
.
hfcpci
.
int_m2
=
0
;
/* disable alle interrupts */
cs
->
hw
.
hfcpci
.
int_m1
=
0
;
...
...
@@ -1456,17 +1425,46 @@ setup_hfcpci(struct IsdnCard *card)
/* At this point the needed PCI config is done */
/* fifos are still not enabled */
cs
->
irq_flags
|=
SA_SHIRQ
;
init_timer
(
&
cs
->
hw
.
hfcpci
.
timer
);
cs
->
hw
.
hfcpci
.
timer
.
function
=
(
void
*
)
hfcpci_Timer
;
cs
->
hw
.
hfcpci
.
timer
.
data
=
(
long
)
cs
;
init_timer
(
&
cs
->
hw
.
hfcpci
.
timer
);
hfcpci_reset
(
cs
);
cs
->
auxcmd
=
&
hfcpci_auxcmd
;
cs
->
card_ops
=
&
hfcpci_ops
;
return
1
;
return
0
;
err:
hisax_release_resources
(
cs
);
return
-
EBUSY
;
}
/* this variable is used as card index when more than one cards are present */
static
struct
pci_dev
*
dev_hfcpci
__initdata
=
NULL
;
int
__init
setup_hfcpci
(
struct
IsdnCard
*
card
)
{
struct
IsdnCardState
*
cs
=
card
->
cs
;
char
tmp
[
64
];
int
i
;
struct
pci_dev
*
tmp_hfcpci
=
NULL
;
strcpy
(
tmp
,
hfcpci_revision
);
printk
(
KERN_INFO
"HiSax: HFC-PCI driver Rev. %s
\n
"
,
HiSax_getrev
(
tmp
));
cs
->
hw
.
hfcpci
.
int_s1
=
0
;
cs
->
dc
.
hfcpci
.
ph_state
=
0
;
cs
->
hw
.
hfcpci
.
fifo
=
255
;
for
(
i
=
0
;
id_list
[
i
].
vendor_id
;
i
++
)
{
tmp_hfcpci
=
pci_find_device
(
id_list
[
i
].
vendor_id
,
id_list
[
i
].
device_id
,
dev_hfcpci
);
if
(
!
tmp_hfcpci
)
continue
;
if
(
niccy_pci_probe
(
card
->
cs
,
tmp_hfcpci
,
i
)
<
0
)
return
0
;
return
1
;
}
return
0
;
}
drivers/isdn/hisax/hfc_sx.c
View file @
c747c791
...
...
@@ -1159,6 +1159,74 @@ static struct card_ops hfcsx_ops = {
.
irq_func
=
hfcsx_interrupt
,
};
static
int
__init
hfcsx_probe
(
struct
IsdnCardState
*
cs
,
struct
IsdnCard
*
card
)
{
int
rc
;
char
c
;
cs
->
irq
=
card
->
para
[
0
];
cs
->
hw
.
hfcsx
.
base
=
card
->
para
[
1
]
&
0xfffe
;
cs
->
hw
.
hfcsx
.
fifo
=
255
;
cs
->
hw
.
hfcsx
.
int_s1
=
0
;
cs
->
dc
.
hfcsx
.
ph_state
=
0
;
rc
=
-
EBUSY
;
if
(
!
request_io
(
&
cs
->
rs
,
cs
->
hw
.
hfcsx
.
base
,
2
,
"HFCSX isdn"
))
goto
err
;
rc
=
-
ENODEV
;
byteout
(
cs
->
hw
.
hfcsx
.
base
,
cs
->
hw
.
hfcsx
.
base
&
0xFF
);
byteout
(
cs
->
hw
.
hfcsx
.
base
+
1
,
((
cs
->
hw
.
hfcsx
.
base
>>
8
)
&
3
)
|
0x54
);
udelay
(
10
);
cs
->
hw
.
hfcsx
.
chip
=
Read_hfc
(
cs
,
HFCSX_CHIP_ID
);
switch
(
cs
->
hw
.
hfcsx
.
chip
>>
4
)
{
case
1
:
c
=
'+'
;
break
;
case
9
:
c
=
'P'
;
break
;
default:
printk
(
KERN_WARNING
"HFC-SX: invalid chip id 0x%x
\n
"
,
cs
->
hw
.
hfcsx
.
chip
>>
4
);
goto
err
;
}
if
(
!
ccd_sp_irqtab
[
cs
->
irq
&
0xF
])
{
printk
(
KERN_WARNING
"HFC_SX: invalid irq %d specified
\n
"
,
cs
->
irq
&
0xF
);
goto
err
;
}
rc
=
-
ENOMEM
;
cs
->
hw
.
hfcsx
.
extra
=
kmalloc
(
sizeof
(
struct
hfcsx_extra
),
GFP_ATOMIC
);
if
(
!
cs
->
hw
.
hfcsx
.
extra
)
{
printk
(
KERN_WARNING
"HFC-SX: unable to allocate memory
\n
"
);
goto
err
;
}
printk
(
KERN_INFO
"HFC-S%c chip detected at base 0x%x IRQ %d
\n
"
,
c
,
(
u_int
)
cs
->
hw
.
hfcsx
.
base
,
cs
->
irq
);
cs
->
hw
.
hfcsx
.
int_m2
=
0
;
/* disable alle interrupts */
cs
->
hw
.
hfcsx
.
int_m1
=
0
;
Write_hfc
(
cs
,
HFCSX_INT_M1
,
cs
->
hw
.
hfcsx
.
int_m1
);
Write_hfc
(
cs
,
HFCSX_INT_M2
,
cs
->
hw
.
hfcsx
.
int_m2
);
init_timer
(
&
cs
->
hw
.
hfcsx
.
timer
);
cs
->
hw
.
hfcsx
.
timer
.
function
=
(
void
*
)
hfcsx_Timer
;
cs
->
hw
.
hfcsx
.
timer
.
data
=
(
long
)
cs
;
cs
->
hw
.
hfcsx
.
b_fifo_size
=
0
;
/* fifo size still unknown */
cs
->
hw
.
hfcsx
.
cirm
=
ccd_sp_irqtab
[
cs
->
irq
&
0xF
];
/* RAM not eval. */
hfcsx_reset
(
cs
);
cs
->
auxcmd
=
&
hfcsx_auxcmd
;
cs
->
card_ops
=
&
hfcsx_ops
;
return
0
;
err:
hisax_release_resources
(
cs
);
return
rc
;
}
#ifdef __ISAPNP__
static
struct
isapnp_device_id
hfc_ids
[]
__initdata
=
{
{
ISAPNP_VENDOR
(
'T'
,
'A'
,
'G'
),
ISAPNP_FUNCTION
(
0x2620
),
...
...
@@ -1174,7 +1242,6 @@ static struct pnp_card *pnp_c __devinitdata = NULL;
int
__devinit
setup_hfcsx
(
struct
IsdnCard
*
card
)
{
struct
IsdnCardState
*
cs
=
card
->
cs
;
char
tmp
[
64
];
strcpy
(
tmp
,
hfcsx_revision
);
...
...
@@ -1227,62 +1294,7 @@ setup_hfcsx(struct IsdnCard *card)
}
}
#endif
cs
->
hw
.
hfcsx
.
base
=
card
->
para
[
1
]
&
0xfffe
;
cs
->
irq
=
card
->
para
[
0
];
cs
->
hw
.
hfcsx
.
int_s1
=
0
;
cs
->
dc
.
hfcsx
.
ph_state
=
0
;
cs
->
hw
.
hfcsx
.
fifo
=
255
;
if
(
!
request_io
(
&
cs
->
rs
,
cs
->
hw
.
hfcsx
.
base
,
2
,
"HFCSX isdn"
))
if
(
hfcsx_probe
(
card
->
cs
,
card
)
<
0
)
return
0
;
byteout
(
cs
->
hw
.
hfcsx
.
base
,
cs
->
hw
.
hfcsx
.
base
&
0xFF
);
byteout
(
cs
->
hw
.
hfcsx
.
base
+
1
,
((
cs
->
hw
.
hfcsx
.
base
>>
8
)
&
3
)
|
0x54
);
udelay
(
10
);
cs
->
hw
.
hfcsx
.
chip
=
Read_hfc
(
cs
,
HFCSX_CHIP_ID
);
switch
(
cs
->
hw
.
hfcsx
.
chip
>>
4
)
{
case
1
:
tmp
[
0
]
=
'+'
;
break
;
case
9
:
tmp
[
0
]
=
'P'
;
break
;
default:
printk
(
KERN_WARNING
"HFC-SX: invalid chip id 0x%x
\n
"
,
cs
->
hw
.
hfcsx
.
chip
>>
4
);
hisax_release_resources
(
cs
);
return
0
;
}
if
(
!
ccd_sp_irqtab
[
cs
->
irq
&
0xF
])
{
printk
(
KERN_WARNING
"HFC_SX: invalid irq %d specified
\n
"
,
cs
->
irq
&
0xF
);
hisax_release_resources
(
cs
);
return
0
;
}
cs
->
hw
.
hfcsx
.
extra
=
kmalloc
(
sizeof
(
struct
hfcsx_extra
),
GFP_ATOMIC
);
if
(
!
cs
->
hw
.
hfcsx
.
extra
)
{
hisax_release_resources
(
cs
);
printk
(
KERN_WARNING
"HFC-SX: unable to allocate memory
\n
"
);
return
0
;
}
printk
(
KERN_INFO
"HFC-S%c chip detected at base 0x%x IRQ %d HZ %d
\n
"
,
tmp
[
0
],
(
u_int
)
cs
->
hw
.
hfcsx
.
base
,
cs
->
irq
,
HZ
);
cs
->
hw
.
hfcsx
.
int_m2
=
0
;
/* disable alle interrupts */
cs
->
hw
.
hfcsx
.
int_m1
=
0
;
Write_hfc
(
cs
,
HFCSX_INT_M1
,
cs
->
hw
.
hfcsx
.
int_m1
);
Write_hfc
(
cs
,
HFCSX_INT_M2
,
cs
->
hw
.
hfcsx
.
int_m2
);
cs
->
hw
.
hfcsx
.
timer
.
function
=
(
void
*
)
hfcsx_Timer
;
cs
->
hw
.
hfcsx
.
timer
.
data
=
(
long
)
cs
;
cs
->
hw
.
hfcsx
.
b_fifo_size
=
0
;
/* fifo size still unknown */
cs
->
hw
.
hfcsx
.
cirm
=
ccd_sp_irqtab
[
cs
->
irq
&
0xF
];
/* RAM not evaluated */
init_timer
(
&
cs
->
hw
.
hfcsx
.
timer
);
hfcsx_reset
(
cs
);
cs
->
auxcmd
=
&
hfcsx_auxcmd
;
cs
->
card_ops
=
&
hfcsx_ops
;
return
1
;
}
drivers/isdn/hisax/hfcscard.c
View file @
c747c791
...
...
@@ -133,6 +133,50 @@ static struct card_ops hfcs_ops = {
.
irq_func
=
hfcs_interrupt
,
};
static
int
__init
hfcs_probe
(
struct
IsdnCardState
*
cs
,
struct
IsdnCard
*
card
)
{
cs
->
irq
=
card
->
para
[
0
];
cs
->
hw
.
hfcD
.
addr
=
card
->
para
[
1
];
if
(
!
request_io
(
&
cs
->
rs
,
cs
->
hw
.
hfcD
.
addr
,
2
,
"HFCS isdn"
))
goto
err
;
printk
(
KERN_INFO
"HFCS: defined at 0x%x IRQ %d
\n
"
,
cs
->
hw
.
hfcD
.
addr
,
cs
->
irq
);
cs
->
hw
.
hfcD
.
cip
=
0
;
cs
->
hw
.
hfcD
.
int_s1
=
0
;
cs
->
hw
.
hfcD
.
send
=
NULL
;
cs
->
bcs
[
0
].
hw
.
hfc
.
send
=
NULL
;
cs
->
bcs
[
1
].
hw
.
hfc
.
send
=
NULL
;
cs
->
hw
.
hfcD
.
dfifosize
=
512
;
cs
->
dc
.
hfcd
.
ph_state
=
0
;
cs
->
hw
.
hfcD
.
fifo
=
255
;
if
(
cs
->
typ
==
ISDN_CTYPE_TELES3C
)
{
cs
->
hw
.
hfcD
.
bfifosize
=
1024
+
512
;
/* Teles 16.3c IO ADR is 0x200 | YY0U (YY Bit 15/14 address) */
outb
(
0x00
,
cs
->
hw
.
hfcD
.
addr
);
outb
(
0x56
,
cs
->
hw
.
hfcD
.
addr
|
1
);
}
else
if
(
cs
->
typ
==
ISDN_CTYPE_ACERP10
)
{
cs
->
hw
.
hfcD
.
bfifosize
=
7
*
1024
+
512
;
/* Acer P10 IO ADR is 0x300 */
outb
(
0x00
,
cs
->
hw
.
hfcD
.
addr
);
outb
(
0x57
,
cs
->
hw
.
hfcD
.
addr
|
1
);
}
set_cs_func
(
cs
);
init_timer
(
&
cs
->
hw
.
hfcD
.
timer
);
cs
->
hw
.
hfcD
.
timer
.
function
=
(
void
*
)
hfcs_Timer
;
cs
->
hw
.
hfcD
.
timer
.
data
=
(
long
)
cs
;
hfcs_reset
(
cs
);
cs
->
card_ops
=
&
hfcs_ops
;
return
0
;
err:
hisax_release_resources
(
cs
);
return
-
EBUSY
;
}
#ifdef __ISAPNP__
static
struct
isapnp_device_id
hfc_ids
[]
__initdata
=
{
{
ISAPNP_VENDOR
(
'A'
,
'N'
,
'X'
),
ISAPNP_FUNCTION
(
0x1114
),
...
...
@@ -166,7 +210,6 @@ static struct pnp_card *pnp_c __devinitdata = NULL;
int
__init
setup_hfcs
(
struct
IsdnCard
*
card
)
{
struct
IsdnCardState
*
cs
=
card
->
cs
;
char
tmp
[
64
];
strcpy
(
tmp
,
hfcs_revision
);
...
...
@@ -220,42 +263,8 @@ setup_hfcs(struct IsdnCard *card)
}
}
#endif
cs
->
hw
.
hfcD
.
addr
=
card
->
para
[
1
]
&
0xfffe
;
cs
->
irq
=
card
->
para
[
0
];
cs
->
hw
.
hfcD
.
cip
=
0
;
cs
->
hw
.
hfcD
.
int_s1
=
0
;
cs
->
hw
.
hfcD
.
send
=
NULL
;
cs
->
bcs
[
0
].
hw
.
hfc
.
send
=
NULL
;
cs
->
bcs
[
1
].
hw
.
hfc
.
send
=
NULL
;
cs
->
hw
.
hfcD
.
dfifosize
=
512
;
cs
->
dc
.
hfcd
.
ph_state
=
0
;
cs
->
hw
.
hfcD
.
fifo
=
255
;
if
(
cs
->
typ
==
ISDN_CTYPE_TELES3C
)
{
cs
->
hw
.
hfcD
.
bfifosize
=
1024
+
512
;
}
else
if
(
cs
->
typ
==
ISDN_CTYPE_ACERP10
)
{
cs
->
hw
.
hfcD
.
bfifosize
=
7
*
1024
+
512
;
}
else
return
(
0
);
if
(
!
request_io
(
&
cs
->
rs
,
cs
->
hw
.
hfcD
.
addr
,
2
,
"HFCS isdn"
))
if
(
hfcs_probe
(
card
->
cs
,
card
)
<
0
)
return
0
;
printk
(
KERN_INFO
"HFCS: defined at 0x%x IRQ %d HZ %d
\n
"
,
cs
->
hw
.
hfcD
.
addr
,
cs
->
irq
,
HZ
);
if
(
cs
->
typ
==
ISDN_CTYPE_TELES3C
)
{
/* Teles 16.3c IO ADR is 0x200 | YY0U (YY Bit 15/14 address) */
outb
(
0x00
,
cs
->
hw
.
hfcD
.
addr
);
outb
(
0x56
,
cs
->
hw
.
hfcD
.
addr
|
1
);
}
else
if
(
cs
->
typ
==
ISDN_CTYPE_ACERP10
)
{
/* Acer P10 IO ADR is 0x300 */
outb
(
0x00
,
cs
->
hw
.
hfcD
.
addr
);
outb
(
0x57
,
cs
->
hw
.
hfcD
.
addr
|
1
);
}
set_cs_func
(
cs
);
cs
->
hw
.
hfcD
.
timer
.
function
=
(
void
*
)
hfcs_Timer
;
cs
->
hw
.
hfcD
.
timer
.
data
=
(
long
)
cs
;
init_timer
(
&
cs
->
hw
.
hfcD
.
timer
);
hfcs_reset
(
cs
);
cs
->
card_ops
=
&
hfcs_ops
;
return
(
1
);
return
1
;
}
drivers/isdn/hisax/hisax.h
View file @
c747c791
...
...
@@ -782,7 +782,6 @@ struct bkm_hw {
struct
gazel_hw
{
unsigned
int
cfg_reg
;
unsigned
int
pciaddr
[
2
];
signed
int
ipac
;
signed
int
isac
;
signed
int
hscx
[
2
];
...
...
@@ -1073,264 +1072,17 @@ hisax_release_resources(struct IsdnCardState *cs);
#define ISDN_CTYPE_COUNT 41
#ifdef ISDN_CHIP_ISAC
#undef ISDN_CHIP_ISAC
#endif
#ifdef CONFIG_HISAX_16_0
#define CARD_TELES0 1
#ifndef ISDN_CHIP_ISAC
#define ISDN_CHIP_ISAC 1
#endif
#else
#define CARD_TELES0 0
#endif
#ifdef CONFIG_HISAX_16_3
#define CARD_TELES3 1
#ifndef ISDN_CHIP_ISAC
#define ISDN_CHIP_ISAC 1
#endif
#else
#define CARD_TELES3 0
#endif
#ifdef CONFIG_HISAX_TELESPCI
#define CARD_TELESPCI 1
#ifndef ISDN_CHIP_ISAC
#define ISDN_CHIP_ISAC 1
#endif
#else
#define CARD_TELESPCI 0
#endif
#ifdef CONFIG_HISAX_AVM_A1
#define CARD_AVM_A1 1
#ifndef ISDN_CHIP_ISAC
#define ISDN_CHIP_ISAC 1
#endif
#else
#define CARD_AVM_A1 0
#endif
#ifdef CONFIG_HISAX_AVM_A1_PCMCIA
#define CARD_AVM_A1_PCMCIA 1
#ifndef ISDN_CHIP_ISAC
#define ISDN_CHIP_ISAC 1
#endif
#else
#define CARD_AVM_A1_PCMCIA 0
#endif
#ifdef CONFIG_HISAX_FRITZPCI
#define CARD_FRITZPCI 1
#ifndef ISDN_CHIP_ISAC
#define ISDN_CHIP_ISAC 1
#endif
#else
#define CARD_FRITZPCI 0
#endif
#ifdef CONFIG_HISAX_ELSA
#define CARD_ELSA 1
#ifndef ISDN_CHIP_ISAC
#define ISDN_CHIP_ISAC 1
#endif
#else
#define CARD_ELSA 0
#endif
#ifdef CONFIG_HISAX_IX1MICROR2
#define CARD_IX1MICROR2 1
#ifndef ISDN_CHIP_ISAC
#define ISDN_CHIP_ISAC 1
#endif
#else
#define CARD_IX1MICROR2 0
#endif
#ifdef CONFIG_HISAX_DIEHLDIVA
#define CARD_DIEHLDIVA 1
#ifndef ISDN_CHIP_ISAC
#define ISDN_CHIP_ISAC 1
#endif
#else
#define CARD_DIEHLDIVA 0
#endif
#ifdef CONFIG_HISAX_ASUSCOM
#define CARD_ASUSCOM 1
#ifndef ISDN_CHIP_ISAC
#define ISDN_CHIP_ISAC 1
#endif
#else
#define CARD_ASUSCOM 0
#endif
#ifdef CONFIG_HISAX_TELEINT
#define CARD_TELEINT 1
#ifndef ISDN_CHIP_ISAC
#define ISDN_CHIP_ISAC 1
#endif
#else
#define CARD_TELEINT 0
#endif
#ifdef CONFIG_HISAX_SEDLBAUER
#define CARD_SEDLBAUER 1
#ifndef ISDN_CHIP_ISAC
#define ISDN_CHIP_ISAC 1
#endif
#else
#define CARD_SEDLBAUER 0
#endif
#ifdef CONFIG_HISAX_SPORTSTER
#define CARD_SPORTSTER 1
#ifndef ISDN_CHIP_ISAC
#define ISDN_CHIP_ISAC 1
#endif
#else
#define CARD_SPORTSTER 0
#endif
#ifdef CONFIG_HISAX_MIC
#define CARD_MIC 1
#ifndef ISDN_CHIP_ISAC
#define ISDN_CHIP_ISAC 1
#endif
#else
#define CARD_MIC 0
#endif
#ifdef CONFIG_HISAX_NETJET
#define CARD_NETJET_S 1
#ifndef ISDN_CHIP_ISAC
#define ISDN_CHIP_ISAC 1
#endif
#else
#define CARD_NETJET_S 0
#endif
#ifdef CONFIG_HISAX_HFCS
#define CARD_HFCS 1
#else
#define CARD_HFCS 0
#endif
#ifdef CONFIG_HISAX_HFC_PCI
#define CARD_HFC_PCI 1
#else
#define CARD_HFC_PCI 0
#endif
#ifdef CONFIG_HISAX_HFC_SX
#define CARD_HFC_SX 1
#else
#define CARD_HFC_SX 0
#endif
#ifdef CONFIG_HISAX_AMD7930
#define CARD_AMD7930 1
#else
#define CARD_AMD7930 0
#endif
#ifdef CONFIG_HISAX_NICCY
#define CARD_NICCY 1
#ifndef ISDN_CHIP_ISAC
#define ISDN_CHIP_ISAC 1
#endif
#else
#define CARD_NICCY 0
#endif
#ifdef CONFIG_HISAX_ISURF
#define CARD_ISURF 1
#ifndef ISDN_CHIP_ISAC
#define ISDN_CHIP_ISAC 1
#endif
#else
#define CARD_ISURF 0
#endif
#ifdef CONFIG_HISAX_S0BOX
#define CARD_S0BOX 1
#ifndef ISDN_CHIP_ISAC
#define ISDN_CHIP_ISAC 1
#endif
#else
#define CARD_S0BOX 0
#endif
#ifdef CONFIG_HISAX_HSTSAPHIR
#define CARD_HSTSAPHIR 1
#ifndef ISDN_CHIP_ISAC
#define ISDN_CHIP_ISAC 1
#endif
#else
#define CARD_HSTSAPHIR 0
#endif
#ifdef CONFIG_HISAX_TESTEMU
#define CARD_TESTEMU 1
#define ISDN_CTYPE_TESTEMU 99
#undef ISDN_CTYPE_COUNT
#define ISDN_CTYPE_COUNT ISDN_CTYPE_TESTEMU
#else
#define CARD_TESTEMU 0
#endif
#ifdef CONFIG_HISAX_BKM_A4T
#define CARD_BKM_A4T 1
#ifndef ISDN_CHIP_ISAC
#define ISDN_CHIP_ISAC 1
#endif
#else
#define CARD_BKM_A4T 0
#endif
#ifdef CONFIG_HISAX_SCT_QUADRO
#define CARD_SCT_QUADRO 1
#ifndef ISDN_CHIP_ISAC
#define ISDN_CHIP_ISAC 1
#endif
#else
#define CARD_SCT_QUADRO 0
#endif
#ifdef CONFIG_HISAX_GAZEL
#define CARD_GAZEL 1
#ifndef ISDN_CHIP_ISAC
#define ISDN_CHIP_ISAC 1
#endif
#else
#define CARD_GAZEL 0
#endif
#ifdef CONFIG_HISAX_W6692
#define CARD_W6692 1
#ifndef ISDN_CHIP_W6692
#define ISDN_CHIP_W6692 1
#endif
#else
#define CARD_W6692 0
#endif
#ifdef CONFIG_HISAX_NETJET_U
#define CARD_NETJET_U 1
#ifndef ISDN_CHIP_ICC
#define ISDN_CHIP_ICC 1
#endif
#ifndef HISAX_UINTERFACE
#define HISAX_UINTERFACE 1
#endif
#else
#define CARD_NETJET_U 0
#endif
#ifdef CONFIG_HISAX_ENTERNOW_PCI
#define CARD_FN_ENTERNOW_PCI 1
#endif
#define TEI_PER_CARD 1
...
...
@@ -1402,7 +1154,7 @@ int jiftime(char *s, long mark);
int
HiSax_command
(
isdn_ctrl
*
ic
);
int
HiSax_writebuf_skb
(
int
id
,
int
chan
,
int
ack
,
struct
sk_buff
*
skb
);
void
HiSax_putstatus
(
struct
IsdnCardState
*
cs
,
char
*
head
,
char
*
fmt
,
...);
void
VHiSax_putstatus
(
struct
IsdnCardState
*
cs
,
char
*
head
,
char
*
fmt
,
va_list
args
);
void
VHiSax_putstatus
(
struct
IsdnCardState
*
cs
,
char
*
head
,
c
onst
c
har
*
fmt
,
va_list
args
);
void
HiSax_reportcard
(
int
cardnr
,
int
sel
);
int
QuickHex
(
char
*
txt
,
u8
*
p
,
int
cnt
);
void
LogFrame
(
struct
IsdnCardState
*
cs
,
u8
*
p
,
int
size
);
...
...
drivers/isdn/hisax/hisax_fcclassic.c
View file @
c747c791
...
...
@@ -231,7 +231,7 @@ fcclassic_setup(struct fritz_adapter *adapter)
adapter
->
isac
.
write_isac
=
&
fcclassic_write_isac
;
adapter
->
isac
.
read_isac_fifo
=
&
fcclassic_read_isac_fifo
;
adapter
->
isac
.
write_isac_fifo
=
&
fcclassic_write_isac_fifo
;
isac_setup
(
&
adapter
->
isac
);
hisax_
isac_setup
(
&
adapter
->
isac
);
for
(
i
=
0
;
i
<
2
;
i
++
)
{
hscx_init
(
&
adapter
->
hscx
[
i
]);
adapter
->
hscx
[
i
].
priv
=
adapter
;
...
...
drivers/isdn/hisax/hisax_fcpcipnp.c
View file @
c747c791
...
...
@@ -46,24 +46,22 @@ MODULE_PARM(debug, "i");
MODULE_AUTHOR
(
"Kai Germaschewski <kai.germaschewski@gmx.de>/Karsten Keil <kkeil@suse.de>"
);
MODULE_DESCRIPTION
(
"AVM Fritz!PCI/PnP ISDN driver"
);
// FIXME temporary hack until I sort out the new PnP stuff
#define __ISAPNP__
static
struct
pci_device_id
fcpci_ids
[]
__devinitdata
=
{
{
PCI_VENDOR_ID_AVM
,
PCI_DEVICE_ID_AVM_A1
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
(
unsigned
long
)
"Fritz!Card PCI"
},
{
PCI_VENDOR_ID_AVM
,
PCI_DEVICE_ID_AVM_A1_V2
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
(
unsigned
long
)
"Fritz!Card PCI v2"
},
{
}
{
.
vendor
=
PCI_VENDOR_ID_AVM
,
.
device
=
PCI_DEVICE_ID_AVM_A1
,
.
subvendor
=
PCI_ANY_ID
,
.
subdevice
=
PCI_ANY_ID
,
.
driver_data
=
(
unsigned
long
)
"Fritz!Card PCI"
,
},
{
.
vendor
=
PCI_VENDOR_ID_AVM
,
.
device
=
PCI_DEVICE_ID_AVM_A1_V2
,
.
subvendor
=
PCI_ANY_ID
,
.
subdevice
=
PCI_ANY_ID
,
.
driver_data
=
(
unsigned
long
)
"Fritz!Card PCI v2"
},
{}
};
MODULE_DEVICE_TABLE
(
pci
,
fcpci_ids
);
static
struct
pnp_card_device_id
fcpnp_ids
[]
__devinitdata
=
{
{
.
id
=
"AVM0900"
,
.
driver_data
=
(
unsigned
long
)
"Fritz!Card PnP"
,
.
devs
=
{
{
"AVM0900"
}
}
}
};
MODULE_DEVICE_TABLE
(
pnp_card
,
fcpnp_ids
);
MODULE_DEVICE_TABLE
(
pci
,
fcpci_ids
);
static
int
protocol
=
2
;
/* EURO-ISDN Default */
MODULE_PARM
(
protocol
,
"i"
);
...
...
@@ -782,7 +780,7 @@ static int __devinit fcpcipnp_setup(struct fritz_adapter *adapter)
case
AVM_FRITZ_PCI
:
case
AVM_FRITZ_PNP
:
fcpci_init
(
adapter
);
isac_setup
(
&
adapter
->
isac
);
hisax_
isac_setup
(
&
adapter
->
isac
);
break
;
}
val
=
adapter
->
read_hdlc_status
(
adapter
,
0
);
...
...
@@ -908,10 +906,10 @@ static struct pci_driver fcpci_driver = {
.
id_table
=
fcpci_ids
,
};
#ifdef
__ISAPNP__
#ifdef
CONFIG_PNP_CARD
static
int
__devinit
fcpnp_probe
(
struct
pnp_card
*
card
,
const
struct
pnp_card_
device_
id
*
card_id
)
const
struct
pnp_card_id
*
card_id
)
{
struct
fritz_adapter
*
adapter
;
struct
pnp_dev
*
pnp_dev
;
...
...
@@ -957,6 +955,14 @@ static void __devexit fcpnp_remove(struct pnp_card *pcard)
delete_adapter
(
adapter
);
}
static
struct
pnp_card_id
fcpnp_ids
[]
__devinitdata
=
{
{
.
id
=
"AVM0900"
,
.
driver_data
=
(
unsigned
long
)
"Fritz!Card PnP"
,
.
devs
=
{
{
"AVM0900"
}
},
},
{}
};
static
struct
pnpc_driver
fcpnp_driver
=
{
.
name
=
"fcpnp"
,
.
probe
=
fcpnp_probe
,
...
...
@@ -968,7 +974,7 @@ static struct pnpc_driver fcpnp_driver = {
static
int
__init
hisax_fcpcipnp_init
(
void
)
{
int
retval
,
pci_nr_found
;
int
retval
=
0
,
pci_nr_found
;
printk
(
KERN_INFO
"hisax_fcpcipnp: Fritz!Card PCI/PCIv2/PnP ISDN driver v0.0.1
\n
"
);
...
...
@@ -977,10 +983,8 @@ static int __init hisax_fcpcipnp_init(void)
goto
out
;
pci_nr_found
=
retval
;
#ifdef
__ISAPNP__
#ifdef
CONFIG_PNP_CARD
retval
=
pnpc_register_driver
(
&
fcpnp_driver
);
#else
retval
=
0
;
#endif
if
(
retval
<
0
)
goto
out_unregister_pci
;
...
...
@@ -988,14 +992,14 @@ static int __init hisax_fcpcipnp_init(void)
#if !defined(CONFIG_HOTPLUG) || defined(MODULE)
if
(
pci_nr_found
+
retval
==
0
)
{
retval
=
-
ENODEV
;
goto
out_unregister_
isa
pnp
;
goto
out_unregister_pnp
;
}
#endif
return
0
;
#if !defined(CONFIG_HOTPLUG) || defined(MODULE)
out_unregister_
isa
pnp:
#ifdef
__ISAPNP__
out_unregister_pnp:
#ifdef
CONFIG_PNP_CARD
pnpc_unregister_driver
(
&
fcpnp_driver
);
#endif
#endif
...
...
@@ -1007,7 +1011,7 @@ static int __init hisax_fcpcipnp_init(void)
static
void
__exit
hisax_fcpcipnp_exit
(
void
)
{
#ifdef
__ISAPNP__
#ifdef
CONFIG_PNP_CARD
pnpc_unregister_driver
(
&
fcpnp_driver
);
#endif
pci_unregister_driver
(
&
fcpci_driver
);
...
...
drivers/isdn/hisax/hisax_isac.c
View file @
c747c791
...
...
@@ -770,7 +770,7 @@ void isac_init(struct isac *isac)
FsmInitTimer
(
&
isac
->
l1m
,
&
isac
->
timer
);
}
void
isac_setup
(
struct
isac
*
isac
)
void
hisax_
isac_setup
(
struct
isac
*
isac
)
{
int
val
,
eval
;
...
...
@@ -890,7 +890,7 @@ EXPORT_SYMBOL(isac_d_l2l1);
EXPORT_SYMBOL
(
isacsx_setup
);
EXPORT_SYMBOL
(
isacsx_irq
);
EXPORT_SYMBOL
(
isac_setup
);
EXPORT_SYMBOL
(
hisax_
isac_setup
);
EXPORT_SYMBOL
(
isac_irq
);
module_init
(
hisax_isac_init
);
...
...
drivers/isdn/hisax/hisax_isac.h
View file @
c747c791
...
...
@@ -36,7 +36,7 @@ struct isac {
void
isac_init
(
struct
isac
*
isac
);
void
isac_d_l2l1
(
struct
hisax_if
*
hisax_d_if
,
int
pr
,
void
*
arg
);
void
isac_setup
(
struct
isac
*
isac
);
void
hisax_
isac_setup
(
struct
isac
*
isac
);
void
isac_irq
(
struct
isac
*
isac
);
void
isacsx_setup
(
struct
isac
*
isac
);
...
...
drivers/isdn/hisax/isdnl1.c
View file @
c747c791
...
...
@@ -126,7 +126,7 @@ static char *strL1Event[] =
};
void
debugl1
(
struct
IsdnCardState
*
cs
,
char
*
fmt
,
...)
debugl1
(
struct
IsdnCardState
*
cs
,
c
onst
c
har
*
fmt
,
...)
{
va_list
args
;
char
tmp
[
8
];
...
...
drivers/isdn/hisax/isdnl1.h
View file @
c747c791
...
...
@@ -28,7 +28,7 @@
#define B_LL_CONNECT 9
#define B_LL_OK 10
extern
void
debugl1
(
struct
IsdnCardState
*
cs
,
char
*
fmt
,
...);
extern
void
debugl1
(
struct
IsdnCardState
*
cs
,
c
onst
c
har
*
fmt
,
...);
extern
void
DChannel_proc_xmt
(
struct
IsdnCardState
*
cs
);
extern
void
DChannel_proc_rcv
(
struct
IsdnCardState
*
cs
);
extern
void
l1_msg
(
struct
IsdnCardState
*
cs
,
int
pr
,
void
*
arg
);
...
...
drivers/isdn/hisax/isurf.c
View file @
c747c791
...
...
@@ -187,95 +187,92 @@ static struct card_ops isurf_ops = {
static
struct
pnp_card
*
pnp_surf
__devinitdata
=
NULL
;
#endif
int
__init
setup_isurf
(
struct
IsdnCard
*
card
)
static
int
__init
isurf_probe
(
struct
IsdnCardState
*
cs
,
struct
IsdnCard
*
card
)
{
struct
IsdnCardState
*
cs
=
card
->
cs
;
unsigned
long
phymem
;
char
tmp
[
64
];
strcpy
(
tmp
,
ISurf_revision
);
printk
(
KERN_INFO
"HiSax: ISurf driver Rev. %s
\n
"
,
HiSax_getrev
(
tmp
));
if
(
card
->
para
[
1
]
&&
card
->
para
[
2
])
{
cs
->
hw
.
isurf
.
reset
=
card
->
para
[
1
];
phymem
=
card
->
para
[
2
];
cs
->
irq
=
card
->
para
[
0
];
}
else
{
#ifdef __ISAPNP__
struct
pnp_card
*
pb
;
struct
pnp_dev
*
pd
;
phymem
=
card
->
para
[
2
];
cs
->
hw
.
isurf
.
reset
=
card
->
para
[
1
];
cs
->
irq
=
card
->
para
[
0
];
if
(
isapnp_present
())
{
cs
->
subtyp
=
0
;
if
((
pb
=
pnp_find_card
(
ISAPNP_VENDOR
(
'S'
,
'I'
,
'E'
),
ISAPNP_FUNCTION
(
0x0010
),
pnp_surf
)))
{
pnp_surf
=
pb
;
pd
=
NULL
;
if
(
!
(
pd
=
pnp_find_dev
(
pnp_surf
,
ISAPNP_VENDOR
(
'S'
,
'I'
,
'E'
),
ISAPNP_FUNCTION
(
0x0010
),
pd
)))
{
printk
(
KERN_ERR
"ISurfPnP: PnP error card found, no device
\n
"
);
return
(
0
);
}
if
(
pnp_device_attach
(
pd
)
<
0
)
{
printk
(
KERN_ERR
"ISurfPnP: attach failed
\n
"
);
return
0
;
}
if
(
pnp_activate_dev
(
pd
)
<
0
)
{
printk
(
KERN_ERR
"ISurfPnP: activate failed
\n
"
);
pnp_device_detach
(
pd
);
return
0
;
}
if
(
!
pnp_irq_valid
(
pd
,
0
)
||
!
pnp_port_valid
(
pd
,
0
)
||
!
pnp_port_valid
(
pd
,
1
))
{
printk
(
KERN_ERR
"ISurfPnP:some resources are missing %ld/%lx/%lx
\n
"
,
pnp_irq
(
pd
,
0
),
pnp_port_start
(
pd
,
0
),
pnp_port_start
(
pd
,
1
));
pnp_device_detach
(
pd
);
return
(
0
);
}
cs
->
hw
.
isurf
.
reset
=
pnp_port_start
(
pd
,
0
);
phymem
=
pnp_port_start
(
pd
,
1
);
cs
->
irq
=
pnp_irq
(
pd
,
0
);
}
else
{
printk
(
KERN_INFO
"ISurfPnP: no ISAPnP card found
\n
"
);
return
(
0
);
}
}
else
{
printk
(
KERN_INFO
"ISurfPnP: no ISAPnP bus found
\n
"
);
return
(
0
);
}
#else
printk
(
KERN_WARNING
"HiSax: %s port/mem not set
\n
"
,
CardType
[
card
->
typ
]);
return
(
0
);
#endif
}
if
(
!
request_io
(
&
cs
->
rs
,
cs
->
hw
.
isurf
.
reset
,
1
,
"isurf isdn"
))
goto
err
;
cs
->
hw
.
isurf
.
isar
=
request_mmio
(
&
cs
->
rs
,
phymem
,
ISURF_IOMEM_SIZE
,
"isurf iomem"
);
cs
->
hw
.
isurf
.
isar
=
request_mmio
(
&
cs
->
rs
,
phymem
,
ISURF_IOMEM_SIZE
,
"isurf iomem"
);
if
(
!
cs
->
hw
.
isurf
.
isar
)
goto
err
;
cs
->
hw
.
isurf
.
isac
=
cs
->
hw
.
isurf
.
isar
+
ISURF_ISAC_OFFSET
;
printk
(
KERN_INFO
"ISurf: defined at 0x%x 0x%lx IRQ %d
\n
"
,
cs
->
hw
.
isurf
.
reset
,
card
->
para
[
2
],
cs
->
irq
);
printk
(
KERN_INFO
"ISurf: defined at 0x%x 0x%lx IRQ %d
\n
"
,
cs
->
hw
.
isurf
.
reset
,
phymem
,
cs
->
irq
);
cs
->
auxcmd
=
&
isurf_auxcmd
;
cs
->
card_ops
=
&
isurf_ops
;
cs
->
bcs
[
0
].
hw
.
isar
.
reg
=
&
cs
->
hw
.
isurf
.
isar_r
;
cs
->
bcs
[
1
].
hw
.
isar
.
reg
=
&
cs
->
hw
.
isurf
.
isar_r
;
reset_isurf
(
cs
,
ISURF_RESET
);
test_and
_set_bit
(
HW_ISAR
,
&
cs
->
HW_Flags
);
_
_set_bit
(
HW_ISAR
,
&
cs
->
HW_Flags
);
isac_setup
(
cs
,
&
isac_ops
);
if
(
isar_setup
(
cs
,
&
isar_ops
))
goto
err
;
return
1
;
return
0
;
err:
hisax_release_resources
(
cs
);
return
0
;
return
-
EBUSY
;
}
int
__init
setup_isurf
(
struct
IsdnCard
*
card
)
{
char
tmp
[
64
];
strcpy
(
tmp
,
ISurf_revision
);
printk
(
KERN_INFO
"HiSax: ISurf driver Rev. %s
\n
"
,
HiSax_getrev
(
tmp
));
#ifdef __ISAPNP__
if
(
!
card
->
para
[
1
]
||
!
card
->
para
[
2
])
{
struct
pnp_card
*
pb
;
struct
pnp_dev
*
pd
;
cs
->
subtyp
=
0
;
if
((
pb
=
pnp_find_card
(
ISAPNP_VENDOR
(
'S'
,
'I'
,
'E'
),
ISAPNP_FUNCTION
(
0x0010
),
pnp_surf
)))
{
pnp_surf
=
pb
;
pd
=
NULL
;
if
(
!
(
pd
=
pnp_find_dev
(
pnp_surf
,
ISAPNP_VENDOR
(
'S'
,
'I'
,
'E'
),
ISAPNP_FUNCTION
(
0x0010
),
pd
)))
{
printk
(
KERN_ERR
"ISurfPnP: PnP error card found, no device
\n
"
);
return
(
0
);
}
if
(
pnp_device_attach
(
pd
)
<
0
)
{
printk
(
KERN_ERR
"ISurfPnP: attach failed
\n
"
);
return
0
;
}
if
(
pnp_activate_dev
(
pd
)
<
0
)
{
printk
(
KERN_ERR
"ISurfPnP: activate failed
\n
"
);
pnp_device_detach
(
pd
);
return
0
;
}
if
(
!
pnp_irq_valid
(
pd
,
0
)
||
!
pnp_port_valid
(
pd
,
0
)
||
!
pnp_port_valid
(
pd
,
1
))
{
printk
(
KERN_ERR
"ISurfPnP:some resources are missing %ld/%lx/%lx
\n
"
,
pnp_irq
(
pd
,
0
),
pnp_port_start
(
pd
,
0
),
pnp_port_start
(
pd
,
1
));
pnp_device_detach
(
pd
);
return
(
0
);
}
card
->
para
[
1
]
=
pnp_port_start
(
pd
,
0
);
card
->
para
[
2
]
=
pnp_port_start
(
pd
,
1
);
card
->
para
[
0
]
=
pnp_irq
(
pd
,
0
);
}
else
{
printk
(
KERN_INFO
"ISurfPnP: no ISAPnP card found
\n
"
);
return
0
;
}
}
#endif
if
(
isurf_probe
(
card
->
cs
,
card
)
<
0
)
return
0
;
return
1
;
}
drivers/isdn/hisax/ix1_micro.c
View file @
c747c791
...
...
@@ -162,6 +162,29 @@ static struct card_ops ix1_ops = {
.
irq_func
=
hscxisac_irq
,
};
static
int
__init
ix1_probe
(
struct
IsdnCardState
*
cs
,
struct
IsdnCard
*
card
)
{
cs
->
irq
=
card
->
para
[
0
];
cs
->
hw
.
ix1
.
isac_ale
=
card
->
para
[
1
]
+
ISAC_COMMAND_OFFSET
;
cs
->
hw
.
ix1
.
isac
=
card
->
para
[
1
]
+
ISAC_DATA_OFFSET
;
cs
->
hw
.
ix1
.
hscx
=
card
->
para
[
1
]
+
HSCX_DATA_OFFSET
;
cs
->
hw
.
ix1
.
cfg_reg
=
card
->
para
[
1
];
if
(
!
request_io
(
&
cs
->
rs
,
cs
->
hw
.
ix1
.
cfg_reg
,
4
,
"ix1micro cfg"
))
goto
err
;
printk
(
KERN_INFO
"HiSax: %s config irq:%d io:0x%X
\n
"
,
CardType
[
cs
->
typ
],
cs
->
irq
,
cs
->
hw
.
ix1
.
cfg_reg
);
ix1_reset
(
cs
);
cs
->
card_ops
=
&
ix1_ops
;
if
(
hscxisac_setup
(
cs
,
&
isac_ops
,
&
hscx_ops
))
goto
err
;
return
0
;
err:
hisax_release_resources
(
cs
);
return
-
EBUSY
;
}
#ifdef __ISAPNP__
static
struct
isapnp_device_id
itk_ids
[]
__initdata
=
{
{
ISAPNP_VENDOR
(
'I'
,
'T'
,
'K'
),
ISAPNP_FUNCTION
(
0x25
),
...
...
@@ -181,14 +204,18 @@ static struct pnp_card *pnp_c __devinitdata = NULL;
int
__init
setup_ix1micro
(
struct
IsdnCard
*
card
)
{
struct
IsdnCardState
*
cs
=
card
->
cs
;
char
tmp
[
64
];
strcpy
(
tmp
,
ix1_revision
);
printk
(
KERN_INFO
"HiSax: ITK IX1 driver Rev. %s
\n
"
,
HiSax_getrev
(
tmp
));
if
(
card
->
para
[
1
])
{
if
(
ix1_probe
(
card
->
cs
,
card
))
return
0
;
return
1
;
}
#ifdef __ISAPNP__
if
(
!
card
->
para
[
1
]
&&
isapnp_present
())
{
if
(
isapnp_present
())
{
struct
pnp_card
*
pb
;
struct
pnp_dev
*
pd
;
...
...
@@ -221,7 +248,9 @@ setup_ix1micro(struct IsdnCard *card)
}
card
->
para
[
1
]
=
pnp_port_start
(
pd
,
0
);
card
->
para
[
0
]
=
pnp_irq
(
pd
,
0
);
break
;
if
(
ix1_probe
(
card
->
cs
,
card
))
return
0
;
return
1
;
}
else
{
printk
(
KERN_ERR
"ITK PnP: PnP error card found, no device
\n
"
);
}
...
...
@@ -231,27 +260,8 @@ setup_ix1micro(struct IsdnCard *card)
}
if
(
!
idev
->
card_vendor
)
{
printk
(
KERN_INFO
"ITK PnP: no ISAPnP card found
\n
"
);
return
(
0
);
}
}
#endif
/* IO-Ports */
cs
->
hw
.
ix1
.
isac_ale
=
card
->
para
[
1
]
+
ISAC_COMMAND_OFFSET
;
cs
->
hw
.
ix1
.
isac
=
card
->
para
[
1
]
+
ISAC_DATA_OFFSET
;
cs
->
hw
.
ix1
.
hscx
=
card
->
para
[
1
]
+
HSCX_DATA_OFFSET
;
cs
->
hw
.
ix1
.
cfg_reg
=
card
->
para
[
1
];
cs
->
irq
=
card
->
para
[
0
];
if
(
!
request_io
(
&
cs
->
rs
,
cs
->
hw
.
ix1
.
cfg_reg
,
4
,
"ix1micro cfg"
))
goto
err
;
printk
(
KERN_INFO
"HiSax: %s config irq:%d io:0x%X
\n
"
,
CardType
[
cs
->
typ
],
cs
->
irq
,
cs
->
hw
.
ix1
.
cfg_reg
);
ix1_reset
(
cs
);
cs
->
card_ops
=
&
ix1_ops
;
if
(
hscxisac_setup
(
cs
,
&
isac_ops
,
&
hscx_ops
))
goto
err
;
return
1
;
err:
hisax_release_resources
(
cs
);
return
0
;
}
drivers/isdn/hisax/mic.c
View file @
c747c791
...
...
@@ -138,17 +138,11 @@ static struct card_ops mic_ops = {
.
irq_func
=
hscxisac_irq
,
};
int
__init
setup_mic
(
struct
IsdnCard
*
card
)
static
int
__init
mic_probe
(
struct
IsdnCardState
*
cs
,
struct
IsdnCard
*
card
)
{
struct
IsdnCardState
*
cs
=
card
->
cs
;
char
tmp
[
64
];
strcpy
(
tmp
,
mic_revision
);
printk
(
KERN_INFO
"HiSax: mic driver Rev. %s
\n
"
,
HiSax_getrev
(
tmp
));
cs
->
hw
.
mic
.
cfg_reg
=
card
->
para
[
1
];
cs
->
irq
=
card
->
para
[
0
];
cs
->
hw
.
mic
.
cfg_reg
=
card
->
para
[
1
];
cs
->
hw
.
mic
.
adr
=
cs
->
hw
.
mic
.
cfg_reg
+
MIC_ADR
;
cs
->
hw
.
mic
.
isac
=
cs
->
hw
.
mic
.
cfg_reg
+
MIC_ISAC
;
cs
->
hw
.
mic
.
hscx
=
cs
->
hw
.
mic
.
cfg_reg
+
MIC_HSCX
;
...
...
@@ -158,11 +152,25 @@ setup_mic(struct IsdnCard *card)
printk
(
KERN_INFO
"mic: defined at 0x%x IRQ %d
\n
"
,
cs
->
hw
.
mic
.
cfg_reg
,
cs
->
irq
);
cs
->
card_ops
=
&
mic_ops
;
if
(
hscxisac_setup
(
cs
,
&
isac_ops
,
&
hscx_ops
))
goto
err
;
return
1
;
return
0
;
err:
hisax_release_resources
(
cs
);
return
0
;
return
-
EBUSY
;
}
int
__init
setup_mic
(
struct
IsdnCard
*
card
)
{
char
tmp
[
64
];
strcpy
(
tmp
,
mic_revision
);
printk
(
KERN_INFO
"HiSax: mic driver Rev. %s
\n
"
,
HiSax_getrev
(
tmp
));
if
(
mic_probe
(
card
->
cs
,
card
)
<
0
)
return
0
;
return
1
;
}
drivers/isdn/hisax/niccy.c
View file @
c747c791
...
...
@@ -199,6 +199,70 @@ static struct card_ops niccy_ops = {
.
irq_func
=
niccy_interrupt
,
};
static
int
__init
niccy_probe
(
struct
IsdnCardState
*
cs
)
{
printk
(
KERN_INFO
"HiSax: %s %s config irq:%d data:0x%X ale:0x%X
\n
"
,
CardType
[
cs
->
typ
],
(
cs
->
subtyp
==
1
)
?
"PnP"
:
"PCI"
,
cs
->
irq
,
cs
->
hw
.
niccy
.
isac
,
cs
->
hw
.
niccy
.
isac_ale
);
cs
->
card_ops
=
&
niccy_ops
;
if
(
hscxisac_setup
(
cs
,
&
isac_ops
,
&
hscx_ops
))
return
-
EBUSY
;
return
0
;
}
static
int
__init
niccy_pnp_probe
(
struct
IsdnCardState
*
cs
,
struct
IsdnCard
*
card
)
{
cs
->
subtyp
=
NICCY_PNP
;
cs
->
irq
=
card
->
para
[
0
];
cs
->
hw
.
niccy
.
isac
=
card
->
para
[
1
]
+
ISAC_PNP
;
cs
->
hw
.
niccy
.
hscx
=
card
->
para
[
1
]
+
HSCX_PNP
;
cs
->
hw
.
niccy
.
isac_ale
=
card
->
para
[
2
]
+
ISAC_PNP
;
cs
->
hw
.
niccy
.
hscx_ale
=
card
->
para
[
2
]
+
HSCX_PNP
;
cs
->
hw
.
niccy
.
cfg_reg
=
0
;
if
(
!
request_io
(
&
cs
->
rs
,
cs
->
hw
.
niccy
.
isac
,
2
,
"niccy data"
))
goto
err
;
if
(
!
request_io
(
&
cs
->
rs
,
cs
->
hw
.
niccy
.
isac_ale
,
2
,
"niccy addr"
))
goto
err
;
if
(
niccy_probe
(
cs
)
<
0
)
goto
err
;
return
0
;
err:
hisax_release_resources
(
cs
);
return
-
EBUSY
;
}
static
int
__init
niccy_pci_probe
(
struct
IsdnCardState
*
cs
,
struct
pci_dev
*
pdev
)
{
u32
pci_ioaddr
;
if
(
pci_enable_device
(
pdev
))
goto
err
;
cs
->
subtyp
=
NICCY_PCI
;
cs
->
irq
=
pdev
->
irq
;
cs
->
irq_flags
|=
SA_SHIRQ
;
cs
->
hw
.
niccy
.
cfg_reg
=
pci_resource_start
(
pdev
,
0
);
pci_ioaddr
=
pci_resource_start
(
pdev
,
1
);
cs
->
hw
.
niccy
.
isac
=
pci_ioaddr
+
ISAC_PCI_DATA
;
cs
->
hw
.
niccy
.
isac_ale
=
pci_ioaddr
+
ISAC_PCI_ADDR
;
cs
->
hw
.
niccy
.
hscx
=
pci_ioaddr
+
HSCX_PCI_DATA
;
cs
->
hw
.
niccy
.
hscx_ale
=
pci_ioaddr
+
HSCX_PCI_ADDR
;
if
(
!
request_io
(
&
cs
->
rs
,
cs
->
hw
.
niccy
.
isac
,
4
,
"niccy"
))
goto
err
;
if
(
!
request_io
(
&
cs
->
rs
,
cs
->
hw
.
niccy
.
cfg_reg
,
0x40
,
"niccy pci"
))
goto
err
;
if
(
niccy_probe
(
cs
)
<
0
)
goto
err
;
return
0
;
err:
hisax_release_resources
(
cs
);
return
-
EBUSY
;
}
static
struct
pci_dev
*
niccy_dev
__initdata
=
NULL
;
#ifdef __ISAPNP__
static
struct
pnp_card
*
pnp_c
__devinitdata
=
NULL
;
...
...
@@ -207,7 +271,6 @@ static struct pnp_card *pnp_c __devinitdata = NULL;
int
__init
setup_niccy
(
struct
IsdnCard
*
card
)
{
struct
IsdnCardState
*
cs
=
card
->
cs
;
char
tmp
[
64
];
strcpy
(
tmp
,
niccy_revision
);
...
...
@@ -252,66 +315,18 @@ setup_niccy(struct IsdnCard *card)
}
#endif
if
(
card
->
para
[
1
])
{
cs
->
hw
.
niccy
.
isac
=
card
->
para
[
1
]
+
ISAC_PNP
;
cs
->
hw
.
niccy
.
hscx
=
card
->
para
[
1
]
+
HSCX_PNP
;
cs
->
hw
.
niccy
.
isac_ale
=
card
->
para
[
2
]
+
ISAC_PNP
;
cs
->
hw
.
niccy
.
hscx_ale
=
card
->
para
[
2
]
+
HSCX_PNP
;
cs
->
hw
.
niccy
.
cfg_reg
=
0
;
cs
->
subtyp
=
NICCY_PNP
;
cs
->
irq
=
card
->
para
[
0
];
if
(
!
request_io
(
&
cs
->
rs
,
cs
->
hw
.
niccy
.
isac
,
2
,
"niccy data"
))
goto
err
;
if
(
!
request_io
(
&
cs
->
rs
,
cs
->
hw
.
niccy
.
isac_ale
,
2
,
"niccy addr"
))
goto
err
;
if
(
niccy_pnp_probe
(
card
->
cs
,
card
)
<
0
)
return
0
;
return
1
;
}
else
{
#if CONFIG_PCI
u_int
pci_ioaddr
;
cs
->
subtyp
=
0
;
if
((
niccy_dev
=
pci_find_device
(
PCI_VENDOR_ID_SATSAGEM
,
PCI_DEVICE_ID_SATSAGEM_NICCY
,
niccy_dev
)))
{
if
(
pci_enable_device
(
niccy_dev
))
return
(
0
);
/* get IRQ */
if
(
!
niccy_dev
->
irq
)
{
printk
(
KERN_WARNING
"Niccy: No IRQ for PCI card found
\n
"
);
return
(
0
);
}
cs
->
irq
=
niccy_dev
->
irq
;
cs
->
hw
.
niccy
.
cfg_reg
=
pci_resource_start
(
niccy_dev
,
0
);
if
(
!
cs
->
hw
.
niccy
.
cfg_reg
)
{
printk
(
KERN_WARNING
"Niccy: No IO-Adr for PCI cfg found
\n
"
);
return
(
0
);
}
pci_ioaddr
=
pci_resource_start
(
niccy_dev
,
1
);
if
(
!
pci_ioaddr
)
{
printk
(
KERN_WARNING
"Niccy: No IO-Adr for PCI card found
\n
"
);
return
(
0
);
}
cs
->
subtyp
=
NICCY_PCI
;
}
else
{
printk
(
KERN_WARNING
"Niccy: No PCI card found
\n
"
);
return
(
0
);
if
(
niccy_pci_probe
(
card
->
cs
,
niccy_dev
)
<
0
)
return
0
;
return
1
;
}
cs
->
irq_flags
|=
SA_SHIRQ
;
cs
->
hw
.
niccy
.
isac
=
pci_ioaddr
+
ISAC_PCI_DATA
;
cs
->
hw
.
niccy
.
isac_ale
=
pci_ioaddr
+
ISAC_PCI_ADDR
;
cs
->
hw
.
niccy
.
hscx
=
pci_ioaddr
+
HSCX_PCI_DATA
;
cs
->
hw
.
niccy
.
hscx_ale
=
pci_ioaddr
+
HSCX_PCI_ADDR
;
if
(
!
request_io
(
&
cs
->
rs
,
cs
->
hw
.
niccy
.
isac
,
4
,
"niccy"
))
goto
err
;
if
(
!
request_io
(
&
cs
->
rs
,
cs
->
hw
.
niccy
.
cfg_reg
,
0x40
,
"niccy pci"
))
goto
err
;
#endif
/* CONFIG_PCI */
}
printk
(
KERN_INFO
"HiSax: %s %s config irq:%d data:0x%X ale:0x%X
\n
"
,
CardType
[
cs
->
typ
],
(
cs
->
subtyp
==
1
)
?
"PnP"
:
"PCI"
,
cs
->
irq
,
cs
->
hw
.
niccy
.
isac
,
cs
->
hw
.
niccy
.
isac_ale
);
cs
->
card_ops
=
&
niccy_ops
;
if
(
hscxisac_setup
(
cs
,
&
isac_ops
,
&
hscx_ops
))
goto
err
;
return
1
;
err:
niccy_release
(
cs
);
return
0
;
}
drivers/isdn/hisax/nj_s.c
View file @
c747c791
...
...
@@ -106,96 +106,99 @@ static struct card_ops nj_s_ops = {
.
irq_func
=
nj_s_interrupt
,
};
static
struct
pci_dev
*
dev_netjet
__initdata
=
NULL
;
int
__init
setup_netjet_s
(
struct
IsdnCard
*
card
)
static
int
__init
nj_s_probe
(
struct
IsdnCardState
*
cs
,
struct
pci_dev
*
pdev
)
{
struct
IsdnCardState
*
cs
=
card
->
cs
;
char
tmp
[
64
];
#ifdef __BIG_ENDIAN
#error "not running on big endian machines now"
#endif
strcpy
(
tmp
,
NETjet_S_revision
);
printk
(
KERN_INFO
"HiSax: Traverse Tech. NETjet-S driver Rev. %s
\n
"
,
HiSax_getrev
(
tmp
));
for
(
;;
)
{
if
((
dev_netjet
=
pci_find_device
(
PCI_VENDOR_ID_TIGERJET
,
PCI_DEVICE_ID_TIGERJET_300
,
dev_netjet
)))
{
if
(
pci_enable_device
(
dev_netjet
))
return
(
0
);
pci_set_master
(
dev_netjet
);
cs
->
irq
=
dev_netjet
->
irq
;
if
(
!
cs
->
irq
)
{
printk
(
KERN_WARNING
"NETjet-S: No IRQ for PCI card found
\n
"
);
return
(
0
);
}
cs
->
hw
.
njet
.
base
=
pci_resource_start
(
dev_netjet
,
0
);
if
(
!
cs
->
hw
.
njet
.
base
)
{
printk
(
KERN_WARNING
"NETjet-S: No IO-Adr for PCI card found
\n
"
);
return
(
0
);
}
/* 2001/10/04 Christoph Ersfeld, Formula-n Europe AG www.formula-n.com */
if
((
dev_netjet
->
subsystem_vendor
==
0x55
)
&&
(
dev_netjet
->
subsystem_device
==
0x02
))
{
printk
(
KERN_WARNING
"Netjet: You tried to load this driver with an incompatible TigerJet-card
\n
"
);
printk
(
KERN_WARNING
"Use type=41 for Formula-n enter:now ISDN PCI and compatible
\n
"
);
return
(
0
);
}
/* end new code */
cs
->
hw
.
njet
.
pdev
=
dev_netjet
;
}
else
{
printk
(
KERN_WARNING
"NETjet-S: No PCI card found
\n
"
);
return
(
0
);
}
cs
->
hw
.
njet
.
auxa
=
cs
->
hw
.
njet
.
base
+
NETJET_AUXDATA
;
cs
->
hw
.
njet
.
isac
=
cs
->
hw
.
njet
.
base
|
NETJET_ISAC_OFF
;
cs
->
hw
.
njet
.
ctrl_reg
=
0xff
;
/* Reset On */
byteout
(
cs
->
hw
.
njet
.
base
+
NETJET_CTRL
,
cs
->
hw
.
njet
.
ctrl_reg
);
set_current_state
(
TASK_UNINTERRUPTIBLE
);
schedule_timeout
((
10
*
HZ
)
/
1000
);
/* Timeout 10ms */
cs
->
hw
.
njet
.
ctrl_reg
=
0x00
;
/* Reset Off and status read clear */
byteout
(
cs
->
hw
.
njet
.
base
+
NETJET_CTRL
,
cs
->
hw
.
njet
.
ctrl_reg
);
if
(
pci_enable_device
(
pdev
))
goto
err
;
pci_set_master
(
pdev
);
set_current_state
(
TASK_UNINTERRUPTIBLE
);
schedule_timeout
((
10
*
HZ
)
/
1000
);
/* Timeout 10ms */
cs
->
hw
.
njet
.
auxd
=
0xC0
;
cs
->
hw
.
njet
.
dmactrl
=
0
;
byteout
(
cs
->
hw
.
njet
.
base
+
NETJET_AUXCTRL
,
~
NETJET_ISACIRQ
);
byteout
(
cs
->
hw
.
njet
.
base
+
NETJET_IRQMASK1
,
NETJET_ISACIRQ
);
byteout
(
cs
->
hw
.
njet
.
auxa
,
cs
->
hw
.
njet
.
auxd
);
switch
(
(
(
NETjet_ReadIC
(
cs
,
ISAC_RBCH
)
>>
5
)
&
3
)
)
{
case
0
:
break
;
cs
->
irq
=
pdev
->
irq
;
cs
->
irq_flags
|=
SA_SHIRQ
;
cs
->
hw
.
njet
.
pdev
=
pdev
;
cs
->
hw
.
njet
.
base
=
pci_resource_start
(
pdev
,
0
);
if
(
!
request_io
(
&
cs
->
rs
,
cs
->
hw
.
njet
.
base
,
0x100
,
"netjet-s isdn"
))
return
0
;
cs
->
hw
.
njet
.
auxa
=
cs
->
hw
.
njet
.
base
+
NETJET_AUXDATA
;
cs
->
hw
.
njet
.
isac
=
cs
->
hw
.
njet
.
base
|
NETJET_ISAC_OFF
;
cs
->
hw
.
njet
.
ctrl_reg
=
0xff
;
/* Reset On */
byteout
(
cs
->
hw
.
njet
.
base
+
NETJET_CTRL
,
cs
->
hw
.
njet
.
ctrl_reg
);
case
3
:
printk
(
KERN_WARNING
"NETjet-S: NETspider-U PCI card found
\n
"
);
continue
;
set_current_state
(
TASK_UNINTERRUPTIBLE
);
schedule_timeout
((
10
*
HZ
)
/
1000
);
/* Timeout 10ms */
cs
->
hw
.
njet
.
ctrl_reg
=
0x00
;
/* Reset Off and status read clear */
byteout
(
cs
->
hw
.
njet
.
base
+
NETJET_CTRL
,
cs
->
hw
.
njet
.
ctrl_reg
);
set_current_state
(
TASK_UNINTERRUPTIBLE
);
schedule_timeout
((
10
*
HZ
)
/
1000
);
/* Timeout 10ms */
cs
->
hw
.
njet
.
auxd
=
0xC0
;
cs
->
hw
.
njet
.
dmactrl
=
0
;
byteout
(
cs
->
hw
.
njet
.
auxa
,
0
);
byteout
(
cs
->
hw
.
njet
.
base
+
NETJET_AUXCTRL
,
~
NETJET_ISACIRQ
);
byteout
(
cs
->
hw
.
njet
.
base
+
NETJET_IRQMASK1
,
NETJET_ISACIRQ
);
byteout
(
cs
->
hw
.
njet
.
auxa
,
cs
->
hw
.
njet
.
auxd
);
default
:
printk
(
KERN_WARNING
"NETjet-S: No PCI card found
\n
"
);
return
0
;
}
break
;
switch
((
NETjet_ReadIC
(
cs
,
ISAC_RBCH
)
>>
5
)
&
3
)
{
case
0
:
break
;
case
3
:
printk
(
KERN_WARNING
"NETjet-S: NETspider-U PCI card found
\n
"
);
goto
err
;
default
:
printk
(
KERN_WARNING
"NETjet-S: No PCI card found
\n
"
);
goto
err
;
}
printk
(
KERN_INFO
"NETjet-S: PCI card configured at %#lx IRQ %d
\n
"
,
cs
->
hw
.
njet
.
base
,
cs
->
irq
);
if
(
!
request_io
(
&
cs
->
rs
,
cs
->
hw
.
njet
.
base
,
0x100
,
"netjet-s isdn"
))
return
0
;
nj_s_reset
(
cs
);
cs
->
irq_flags
|=
SA_SHIRQ
;
cs
->
card_ops
=
&
nj_s_ops
;
isac_setup
(
cs
,
&
netjet_dc_ops
);
return
1
;
return
0
;
err:
hisax_release_resources
(
cs
);
return
-
EBUSY
;
}
static
struct
pci_dev
*
dev_netjet
__initdata
=
NULL
;
int
__init
setup_netjet_s
(
struct
IsdnCard
*
card
)
{
char
tmp
[
64
];
#ifdef __BIG_ENDIAN
#error "not running on big endian machines now"
#endif
strcpy
(
tmp
,
NETjet_S_revision
);
printk
(
KERN_INFO
"HiSax: Traverse Tech. NETjet-S driver Rev. %s
\n
"
,
HiSax_getrev
(
tmp
));
dev_netjet
=
pci_find_device
(
PCI_VENDOR_ID_TIGERJET
,
PCI_DEVICE_ID_TIGERJET_300
,
dev_netjet
);
if
(
dev_netjet
)
{
/* 2001/10/04 Christoph Ersfeld, Formula-n Europe AG www.formula-n.com */
if
(
dev_netjet
->
subsystem_vendor
==
0x55
&&
dev_netjet
->
subsystem_device
==
0x02
)
{
printk
(
KERN_WARNING
"Netjet: You tried to load this "
"driver with an incompatible TigerJet-card
\n
"
);
printk
(
KERN_WARNING
"Use type=41 for Formula-n "
"enter:now ISDN PCI and compatible
\n
"
);
return
0
;
}
if
(
nj_s_probe
(
card
->
cs
,
dev_netjet
))
return
1
;
return
0
;
}
printk
(
KERN_WARNING
"NETjet-S: No PCI card found
\n
"
);
return
0
;
}
drivers/isdn/hisax/nj_u.c
View file @
c747c791
...
...
@@ -110,88 +110,85 @@ static struct card_ops nj_u_ops = {
.
irq_func
=
nj_u_interrupt
,
};
static
int
__init
nj_u_probe
(
struct
IsdnCardState
*
cs
,
struct
pci_dev
*
pdev
)
{
if
(
pci_enable_device
(
pdev
))
goto
err
;
pci_set_master
(
pdev
);
cs
->
irq
=
pdev
->
irq
;
cs
->
irq_flags
|=
SA_SHIRQ
;
cs
->
hw
.
njet
.
pdev
=
pdev
;
cs
->
hw
.
njet
.
base
=
pci_resource_start
(
pdev
,
0
);
if
(
!
request_io
(
&
cs
->
rs
,
cs
->
hw
.
njet
.
base
,
0x100
,
"netspider-u isdn"
))
goto
err
;
cs
->
hw
.
njet
.
auxa
=
cs
->
hw
.
njet
.
base
+
NETJET_AUXDATA
;
cs
->
hw
.
njet
.
isac
=
cs
->
hw
.
njet
.
base
|
NETJET_ISAC_OFF
;
cs
->
hw
.
njet
.
ctrl_reg
=
0xff
;
/* Reset On */
byteout
(
cs
->
hw
.
njet
.
base
+
NETJET_CTRL
,
cs
->
hw
.
njet
.
ctrl_reg
);
set_current_state
(
TASK_UNINTERRUPTIBLE
);
schedule_timeout
((
10
*
HZ
)
/
1000
);
/* Timeout 10ms */
cs
->
hw
.
njet
.
ctrl_reg
=
0x00
;
/* Reset Off and status read clear */
byteout
(
cs
->
hw
.
njet
.
base
+
NETJET_CTRL
,
cs
->
hw
.
njet
.
ctrl_reg
);
set_current_state
(
TASK_UNINTERRUPTIBLE
);
schedule_timeout
((
10
*
HZ
)
/
1000
);
/* Timeout 10ms */
cs
->
hw
.
njet
.
auxd
=
0xC0
;
cs
->
hw
.
njet
.
dmactrl
=
0
;
byteout
(
cs
->
hw
.
njet
.
base
+
NETJET_AUXCTRL
,
~
NETJET_ISACIRQ
);
byteout
(
cs
->
hw
.
njet
.
base
+
NETJET_IRQMASK1
,
NETJET_ISACIRQ
);
byteout
(
cs
->
hw
.
njet
.
auxa
,
cs
->
hw
.
njet
.
auxd
);
switch
((
NETjet_ReadIC
(
cs
,
ICC_RBCH
)
>>
5
)
&
3
)
{
case
3
:
break
;
case
0
:
printk
(
KERN_WARNING
"NETspider-U: NETjet-S PCI card found
\n
"
);
goto
err
;
default:
printk
(
KERN_WARNING
"NETspider-U: No PCI card found
\n
"
);
goto
err
;
}
printk
(
KERN_INFO
"NETspider-U: PCI card configured at %#lx IRQ %d
\n
"
,
cs
->
hw
.
njet
.
base
,
cs
->
irq
);
nj_u_reset
(
cs
);
cs
->
card_ops
=
&
nj_u_ops
;
icc_setup
(
cs
,
&
netjet_dc_ops
);
return
0
;
err:
hisax_release_resources
(
cs
);
return
-
EBUSY
;
}
static
struct
pci_dev
*
dev_netjet
__initdata
=
NULL
;
int
__init
setup_netjet_u
(
struct
IsdnCard
*
card
)
{
struct
IsdnCardState
*
cs
=
card
->
cs
;
char
tmp
[
64
];
#ifdef __BIG_ENDIAN
#error "not running on big endian machines now"
#endif
strcpy
(
tmp
,
NETjet_U_revision
);
printk
(
KERN_INFO
"HiSax: Traverse Tech. NETspider-U driver Rev. %s
\n
"
,
HiSax_getrev
(
tmp
));
for
(
;;
)
{
if
((
dev_netjet
=
pci_find_device
(
PCI_VENDOR_ID_TIGERJET
,
PCI_DEVICE_ID_TIGERJET_300
,
dev_netjet
)))
{
if
(
pci_enable_device
(
dev_netjet
))
return
(
0
);
pci_set_master
(
dev_netjet
);
cs
->
irq
=
dev_netjet
->
irq
;
if
(
!
cs
->
irq
)
{
printk
(
KERN_WARNING
"NETspider-U: No IRQ for PCI card found
\n
"
);
return
(
0
);
}
cs
->
hw
.
njet
.
base
=
pci_resource_start
(
dev_netjet
,
0
);
if
(
!
cs
->
hw
.
njet
.
base
)
{
printk
(
KERN_WARNING
"NETspider-U: No IO-Adr for PCI card found
\n
"
);
return
(
0
);
}
cs
->
hw
.
njet
.
pdev
=
dev_netjet
;
}
else
{
printk
(
KERN_WARNING
"NETspider-U: No PCI card found
\n
"
);
return
(
0
);
}
cs
->
hw
.
njet
.
auxa
=
cs
->
hw
.
njet
.
base
+
NETJET_AUXDATA
;
cs
->
hw
.
njet
.
isac
=
cs
->
hw
.
njet
.
base
|
NETJET_ISAC_OFF
;
cs
->
hw
.
njet
.
ctrl_reg
=
0xff
;
/* Reset On */
byteout
(
cs
->
hw
.
njet
.
base
+
NETJET_CTRL
,
cs
->
hw
.
njet
.
ctrl_reg
);
set_current_state
(
TASK_UNINTERRUPTIBLE
);
schedule_timeout
((
10
*
HZ
)
/
1000
);
/* Timeout 10ms */
cs
->
hw
.
njet
.
ctrl_reg
=
0x00
;
/* Reset Off and status read clear */
byteout
(
cs
->
hw
.
njet
.
base
+
NETJET_CTRL
,
cs
->
hw
.
njet
.
ctrl_reg
);
set_current_state
(
TASK_UNINTERRUPTIBLE
);
schedule_timeout
((
10
*
HZ
)
/
1000
);
/* Timeout 10ms */
cs
->
hw
.
njet
.
auxd
=
0xC0
;
cs
->
hw
.
njet
.
dmactrl
=
0
;
byteout
(
cs
->
hw
.
njet
.
auxa
,
0
);
byteout
(
cs
->
hw
.
njet
.
base
+
NETJET_AUXCTRL
,
~
NETJET_ISACIRQ
);
byteout
(
cs
->
hw
.
njet
.
base
+
NETJET_IRQMASK1
,
NETJET_ISACIRQ
);
byteout
(
cs
->
hw
.
njet
.
auxa
,
cs
->
hw
.
njet
.
auxd
);
switch
(
(
(
NETjet_ReadIC
(
cs
,
ICC_RBCH
)
>>
5
)
&
3
)
)
{
case
3
:
break
;
case
0
:
printk
(
KERN_WARNING
"NETspider-U: NETjet-S PCI card found
\n
"
);
continue
;
default
:
printk
(
KERN_WARNING
"NETspider-U: No PCI card found
\n
"
);
return
0
;
}
break
;
}
printk
(
KERN_INFO
"NETspider-U: PCI card configured at %#lx IRQ %d
\n
"
,
cs
->
hw
.
njet
.
base
,
cs
->
irq
);
if
(
!
request_io
(
&
cs
->
rs
,
cs
->
hw
.
njet
.
base
,
0x100
,
"netjet-s isdn"
))
return
0
;
printk
(
KERN_INFO
"HiSax: Traverse Tech. NETspider-U driver Rev. %s
\n
"
,
HiSax_getrev
(
tmp
));
nj_u_reset
(
cs
);
cs
->
irq_flags
|=
SA_SHIRQ
;
cs
->
card_ops
=
&
nj_u_ops
;
icc_setup
(
cs
,
&
netjet_dc_ops
);
return
1
;
dev_netjet
=
pci_find_device
(
PCI_VENDOR_ID_TIGERJET
,
PCI_DEVICE_ID_TIGERJET_300
,
dev_netjet
);
if
(
dev_netjet
)
{
if
(
nj_u_probe
(
card
->
cs
,
dev_netjet
))
return
1
;
return
0
;
}
printk
(
KERN_WARNING
"NETspider-U: No PCI card found
\n
"
);
return
0
;
}
drivers/isdn/hisax/s0box.c
View file @
c747c791
...
...
@@ -172,14 +172,9 @@ static struct card_ops s0box_ops = {
.
irq_func
=
hscxisac_irq
,
};
int
__init
s
etup_s0box
(
struct
IsdnCard
*
card
)
static
int
__init
s
0box_probe
(
struct
IsdnCardState
*
cs
,
struct
IsdnCard
*
card
)
{
struct
IsdnCardState
*
cs
=
card
->
cs
;
char
tmp
[
64
];
strcpy
(
tmp
,
s0box_revision
);
printk
(
KERN_INFO
"HiSax: S0Box IO driver Rev. %s
\n
"
,
HiSax_getrev
(
tmp
));
cs
->
hw
.
teles3
.
cfg_reg
=
card
->
para
[
1
];
cs
->
hw
.
teles3
.
hscx
[
0
]
=
-
0x20
;
cs
->
hw
.
teles3
.
hscx
[
1
]
=
0x0
;
...
...
@@ -200,8 +195,20 @@ setup_s0box(struct IsdnCard *card)
cs
->
card_ops
=
&
s0box_ops
;
if
(
hscxisac_setup
(
cs
,
&
isac_ops
,
&
hscx_ops
))
goto
err
;
return
1
;
return
0
;
err:
hisax_release_resources
(
cs
);
return
0
;
return
-
EBUSY
;
}
int
__init
setup_s0box
(
struct
IsdnCard
*
card
)
{
char
tmp
[
64
];
strcpy
(
tmp
,
s0box_revision
);
printk
(
KERN_INFO
"HiSax: S0Box IO driver Rev. %s
\n
"
,
HiSax_getrev
(
tmp
));
if
(
s0box_probe
(
card
->
cs
,
card
))
return
0
;
return
1
;
}
drivers/isdn/hisax/saphir.c
View file @
c747c791
...
...
@@ -201,36 +201,21 @@ static struct card_ops saphir_ops = {
.
irq_func
=
saphir_interrupt
,
};
int
__init
s
etup_saphir
(
struct
IsdnCard
*
card
)
static
int
__init
s
aphir_probe
(
struct
IsdnCardState
*
cs
,
struct
IsdnCard
*
card
)
{
struct
IsdnCardState
*
cs
=
card
->
cs
;
char
tmp
[
64
];
strcpy
(
tmp
,
saphir_rev
);
printk
(
KERN_INFO
"HiSax: HST Saphir driver Rev. %s
\n
"
,
HiSax_getrev
(
tmp
));
if
(
cs
->
typ
!=
ISDN_CTYPE_HSTSAPHIR
)
return
(
0
);
init_timer
(
&
cs
->
hw
.
saphir
.
timer
);
/* IO-Ports */
cs
->
hw
.
saphir
.
cfg_reg
=
card
->
para
[
1
];
cs
->
hw
.
saphir
.
isac
=
card
->
para
[
1
]
+
ISAC_DATA
;
cs
->
hw
.
saphir
.
hscx
=
card
->
para
[
1
]
+
HSCX_DATA
;
cs
->
hw
.
saphir
.
ale
=
card
->
para
[
1
]
+
ADDRESS_REG
;
cs
->
irq
=
card
->
para
[
0
];
if
(
!
request_io
(
&
cs
->
rs
,
cs
->
hw
.
saphir
.
cfg_reg
,
6
,
"saphir"
))
goto
err
;
printk
(
KERN_INFO
"HiSax: %s config irq:%d io:0x%X
\n
"
,
CardType
[
cs
->
typ
],
cs
->
irq
,
cs
->
hw
.
saphir
.
cfg_reg
);
printk
(
KERN_INFO
"HiSax: %s config irq:%d io:0x%X
\n
"
,
CardType
[
cs
->
typ
],
cs
->
irq
,
cs
->
hw
.
saphir
.
cfg_reg
);
cs
->
hw
.
saphir
.
timer
.
function
=
(
void
*
)
SaphirWatchDog
;
cs
->
hw
.
saphir
.
timer
.
data
=
(
long
)
cs
;
cs
->
hw
.
saphir
.
timer
.
expires
=
jiffies
+
4
*
HZ
;
add_timer
(
&
cs
->
hw
.
saphir
.
timer
);
if
(
saphir_reset
(
cs
))
goto
err
;
...
...
@@ -238,8 +223,27 @@ setup_saphir(struct IsdnCard *card)
if
(
hscxisac_setup
(
cs
,
&
isac_ops
,
&
hscx_ops
))
goto
err
;
return
1
;
err:
saphir_release
(
cs
);
init_timer
(
&
cs
->
hw
.
saphir
.
timer
);
cs
->
hw
.
saphir
.
timer
.
function
=
(
void
*
)
SaphirWatchDog
;
cs
->
hw
.
saphir
.
timer
.
data
=
(
long
)
cs
;
cs
->
hw
.
saphir
.
timer
.
expires
=
jiffies
+
4
*
HZ
;
add_timer
(
&
cs
->
hw
.
saphir
.
timer
);
return
0
;
err:
hisax_release_resources
(
cs
);
return
-
EBUSY
;
}
int
__init
setup_saphir
(
struct
IsdnCard
*
card
)
{
char
tmp
[
64
];
strcpy
(
tmp
,
saphir_rev
);
printk
(
KERN_INFO
"HiSax: HST Saphir driver Rev. %s
\n
"
,
HiSax_getrev
(
tmp
));
if
(
saphir_probe
(
card
->
cs
,
card
)
<
0
)
return
0
;
return
1
;
}
drivers/isdn/hisax/sedlbauer.c
View file @
c747c791
...
...
@@ -73,7 +73,6 @@ const char *Sedlbauer_Types[] =
#define SEDL_SPEEDFAX_PYRAMID 7
#define SEDL_SPEEDFAX_PCI 8
#define SEDL_CHIP_TEST 0
#define SEDL_CHIP_ISAC_HSCX 1
#define SEDL_CHIP_ISAC_ISAR 2
#define SEDL_CHIP_IPAC 3
...
...
@@ -452,6 +451,241 @@ static struct card_ops sedlbauer_isar_ops = {
.
irq_func
=
sedlbauer_isar_interrupt
,
};
static
int
__init
sedl_ipac_probe
(
struct
IsdnCardState
*
cs
)
{
u8
val
;
cs
->
hw
.
sedl
.
adr
=
cs
->
hw
.
sedl
.
cfg_reg
+
SEDL_IPAC_ANY_ADR
;
val
=
readreg
(
cs
,
cs
->
hw
.
sedl
.
cfg_reg
+
SEDL_IPAC_ANY_IPAC
,
IPAC_ID
);
printk
(
KERN_DEBUG
"Sedlbauer: testing IPAC version %x
\n
"
,
val
);
return
(
val
==
1
||
val
==
2
);
}
static
int
__init
sedl_ipac_init
(
struct
IsdnCardState
*
cs
)
{
cs
->
card_ops
=
&
sedlbauer_ipac_ops
;
if
(
ipac_setup
(
cs
,
&
ipac_dc_ops
,
&
ipac_bc_ops
))
return
-
ENODEV
;
sedlbauer_reset
(
cs
);
return
0
;
}
static
int
__init
sedl_isac_isar_init
(
struct
IsdnCardState
*
cs
)
{
cs
->
bcs
[
0
].
hw
.
isar
.
reg
=
&
cs
->
hw
.
sedl
.
isar
;
cs
->
bcs
[
1
].
hw
.
isar
.
reg
=
&
cs
->
hw
.
sedl
.
isar
;
__set_bit
(
HW_ISAR
,
&
cs
->
HW_Flags
);
cs
->
card_ops
=
&
sedlbauer_isar_ops
;
cs
->
auxcmd
=
&
isar_auxcmd
;
isac_setup
(
cs
,
&
isac_ops
);
return
isar_setup
(
cs
,
&
isar_ops
);
}
static
int
__init
sedl_isac_hscx_init
(
struct
IsdnCardState
*
cs
)
{
cs
->
card_ops
=
&
sedlbauer_ops
;
if
(
hscxisac_setup
(
cs
,
&
isac_ops
,
&
hscx_ops
))
return
-
ENODEV
;
sedlbauer_reset
(
cs
);
return
0
;
}
static
int
__init
sedl_card_win_probe
(
struct
IsdnCardState
*
cs
,
struct
IsdnCard
*
card
)
{
cs
->
irq
=
card
->
para
[
0
];
cs
->
hw
.
sedl
.
cfg_reg
=
card
->
para
[
1
];
cs
->
hw
.
sedl
.
bus
=
SEDL_BUS_ISA
;
if
(
!
request_io
(
&
cs
->
rs
,
cs
->
hw
.
sedl
.
cfg_reg
,
8
,
"sedlbauer isdn"
))
goto
err
;
if
(
sedl_ipac_probe
(
cs
))
{
cs
->
subtyp
=
SEDL_SPEED_WIN2_PC104
;
cs
->
hw
.
sedl
.
chip
=
SEDL_CHIP_IPAC
;
cs
->
hw
.
sedl
.
adr
=
cs
->
hw
.
sedl
.
cfg_reg
+
SEDL_IPAC_ANY_ADR
;
cs
->
hw
.
sedl
.
isac
=
cs
->
hw
.
sedl
.
cfg_reg
+
SEDL_IPAC_ANY_IPAC
;
if
(
sedl_ipac_init
(
cs
))
goto
err
;
}
else
{
cs
->
subtyp
=
SEDL_SPEED_CARD_WIN
;
cs
->
hw
.
sedl
.
chip
=
SEDL_CHIP_ISAC_HSCX
;
cs
->
hw
.
sedl
.
adr
=
cs
->
hw
.
sedl
.
cfg_reg
+
SEDL_HSCX_ISA_ADR
;
cs
->
hw
.
sedl
.
isac
=
cs
->
hw
.
sedl
.
cfg_reg
+
SEDL_HSCX_ISA_ISAC
;
cs
->
hw
.
sedl
.
hscx
=
cs
->
hw
.
sedl
.
cfg_reg
+
SEDL_HSCX_ISA_HSCX
;
cs
->
hw
.
sedl
.
reset_on
=
cs
->
hw
.
sedl
.
cfg_reg
+
SEDL_HSCX_ISA_RESET_ON
;
cs
->
hw
.
sedl
.
reset_off
=
cs
->
hw
.
sedl
.
cfg_reg
+
SEDL_HSCX_ISA_RESET_OFF
;
if
(
sedl_isac_hscx_init
(
cs
))
goto
err
;
}
printk
(
KERN_INFO
"Sedlbauer %s: defined at 0x%x-0x%x IRQ %d
\n
"
,
Sedlbauer_Types
[
cs
->
subtyp
],
cs
->
hw
.
sedl
.
cfg_reg
,
cs
->
hw
.
sedl
.
cfg_reg
+
8
,
cs
->
irq
);
return
0
;
err:
hisax_release_resources
(
cs
);
return
-
EBUSY
;
}
static
int
__init
sedl_star_probe
(
struct
IsdnCardState
*
cs
,
struct
IsdnCard
*
card
)
{
cs
->
hw
.
sedl
.
bus
=
SEDL_BUS_PCMCIA
;
if
(
sedl_ipac_probe
(
cs
))
{
cs
->
subtyp
=
SEDL_SPEED_STAR2
;
cs
->
hw
.
sedl
.
chip
=
SEDL_CHIP_IPAC
;
cs
->
hw
.
sedl
.
adr
=
cs
->
hw
.
sedl
.
cfg_reg
+
SEDL_IPAC_ANY_ADR
;
cs
->
hw
.
sedl
.
isac
=
cs
->
hw
.
sedl
.
cfg_reg
+
SEDL_IPAC_ANY_IPAC
;
if
(
sedl_ipac_init
(
cs
))
goto
err
;
}
else
{
cs
->
subtyp
=
SEDL_SPEED_STAR
;
cs
->
hw
.
sedl
.
chip
=
SEDL_CHIP_ISAC_HSCX
;
cs
->
hw
.
sedl
.
adr
=
cs
->
hw
.
sedl
.
cfg_reg
+
SEDL_HSCX_PCMCIA_ADR
;
cs
->
hw
.
sedl
.
isac
=
cs
->
hw
.
sedl
.
cfg_reg
+
SEDL_HSCX_PCMCIA_ISAC
;
cs
->
hw
.
sedl
.
hscx
=
cs
->
hw
.
sedl
.
cfg_reg
+
SEDL_HSCX_PCMCIA_HSCX
;
cs
->
hw
.
sedl
.
reset_on
=
cs
->
hw
.
sedl
.
cfg_reg
+
SEDL_HSCX_PCMCIA_RESET
;
cs
->
hw
.
sedl
.
reset_off
=
cs
->
hw
.
sedl
.
cfg_reg
+
SEDL_HSCX_PCMCIA_RESET
;
if
(
sedl_isac_hscx_init
(
cs
))
goto
err
;
}
printk
(
KERN_INFO
"Sedlbauer %s: defined at 0x%x-0x%x IRQ %d
\n
"
,
Sedlbauer_Types
[
cs
->
subtyp
],
cs
->
hw
.
sedl
.
cfg_reg
,
cs
->
hw
.
sedl
.
cfg_reg
+
8
,
cs
->
irq
);
return
0
;
err:
hisax_release_resources
(
cs
);
return
-
EBUSY
;
}
static
int
__init
sedl_fax_probe
(
struct
IsdnCardState
*
cs
,
struct
IsdnCard
*
card
)
{
cs
->
subtyp
=
SEDL_SPEED_FAX
;
cs
->
hw
.
sedl
.
bus
=
SEDL_BUS_ISA
;
cs
->
hw
.
sedl
.
chip
=
SEDL_CHIP_ISAC_ISAR
;
if
(
!
request_io
(
&
cs
->
rs
,
cs
->
hw
.
sedl
.
cfg_reg
,
16
,
"sedlbauer isdn"
))
goto
err
;
printk
(
KERN_INFO
"Sedlbauer %s: defined at 0x%x-0x%x IRQ %d
\n
"
,
Sedlbauer_Types
[
cs
->
subtyp
],
cs
->
hw
.
sedl
.
cfg_reg
,
cs
->
hw
.
sedl
.
cfg_reg
+
16
,
cs
->
irq
);
cs
->
hw
.
sedl
.
adr
=
cs
->
hw
.
sedl
.
cfg_reg
+
SEDL_ISAR_ISA_ADR
;
cs
->
hw
.
sedl
.
isac
=
cs
->
hw
.
sedl
.
cfg_reg
+
SEDL_ISAR_ISA_ISAC
;
cs
->
hw
.
sedl
.
hscx
=
cs
->
hw
.
sedl
.
cfg_reg
+
SEDL_ISAR_ISA_ISAR
;
cs
->
hw
.
sedl
.
reset_on
=
cs
->
hw
.
sedl
.
cfg_reg
+
SEDL_ISAR_ISA_ISAR_RESET_ON
;
cs
->
hw
.
sedl
.
reset_off
=
cs
->
hw
.
sedl
.
cfg_reg
+
SEDL_ISAR_ISA_ISAR_RESET_OFF
;
if
(
sedl_isac_isar_init
(
cs
))
goto
err
;
return
0
;
err:
hisax_release_resources
(
cs
);
return
-
EBUSY
;
}
static
int
__init
sedl_pci_init
(
struct
IsdnCardState
*
cs
,
struct
pci_dev
*
pdev
)
{
cs
->
irq
=
pdev
->
irq
;
cs
->
irq_flags
|=
SA_SHIRQ
;
cs
->
hw
.
sedl
.
cfg_reg
=
pci_resource_start
(
pdev
,
0
);
cs
->
hw
.
sedl
.
bus
=
SEDL_BUS_PCI
;
if
(
!
request_io
(
&
cs
->
rs
,
cs
->
hw
.
sedl
.
cfg_reg
,
256
,
"sedlbauer isdn"
))
return
-
EBUSY
;
printk
(
KERN_INFO
"Sedlbauer %s: defined at 0x%x-0x%x IRQ %d
\n
"
,
Sedlbauer_Types
[
cs
->
subtyp
],
cs
->
hw
.
sedl
.
cfg_reg
,
cs
->
hw
.
sedl
.
cfg_reg
+
256
,
cs
->
irq
);
cs
->
hw
.
sedl
.
reset_on
=
SEDL_ISAR_PCI_ISAR_RESET_ON
;
cs
->
hw
.
sedl
.
reset_off
=
SEDL_ISAR_PCI_ISAR_RESET_OFF
;
byteout
(
cs
->
hw
.
sedl
.
cfg_reg
,
0xff
);
byteout
(
cs
->
hw
.
sedl
.
cfg_reg
,
0x00
);
byteout
(
cs
->
hw
.
sedl
.
cfg_reg
+
2
,
0xdd
);
byteout
(
cs
->
hw
.
sedl
.
cfg_reg
+
5
,
0x02
);
byteout
(
cs
->
hw
.
sedl
.
cfg_reg
+
3
,
cs
->
hw
.
sedl
.
reset_on
);
current
->
state
=
TASK_UNINTERRUPTIBLE
;
schedule_timeout
((
10
*
HZ
)
/
1000
);
byteout
(
cs
->
hw
.
sedl
.
cfg_reg
+
3
,
cs
->
hw
.
sedl
.
reset_off
);
return
0
;
}
static
int
__init
sedl_fax_pyramid_probe
(
struct
IsdnCardState
*
cs
,
struct
pci_dev
*
pdev
)
{
if
(
pci_enable_device
(
pdev
))
goto
err
;
cs
->
subtyp
=
SEDL_SPEEDFAX_PYRAMID
;
cs
->
hw
.
sedl
.
chip
=
SEDL_CHIP_ISAC_ISAR
;
if
(
sedl_pci_init
(
cs
,
pdev
))
goto
err
;
cs
->
hw
.
sedl
.
adr
=
cs
->
hw
.
sedl
.
cfg_reg
+
SEDL_ISAR_PCI_ADR
;
cs
->
hw
.
sedl
.
isac
=
cs
->
hw
.
sedl
.
cfg_reg
+
SEDL_ISAR_PCI_ISAC
;
cs
->
hw
.
sedl
.
hscx
=
cs
->
hw
.
sedl
.
cfg_reg
+
SEDL_ISAR_PCI_ISAR
;
if
(
sedl_isac_isar_init
(
cs
))
goto
err
;
return
0
;
err:
hisax_release_resources
(
cs
);
return
-
EBUSY
;
}
static
int
__init
sedl_fax_pci_probe
(
struct
IsdnCardState
*
cs
,
struct
pci_dev
*
pdev
)
{
if
(
pci_enable_device
(
pdev
))
goto
err
;
cs
->
subtyp
=
SEDL_SPEEDFAX_PCI
;
cs
->
hw
.
sedl
.
chip
=
SEDL_CHIP_ISAC_ISAR
;
if
(
sedl_pci_init
(
cs
,
pdev
))
goto
err
;
cs
->
hw
.
sedl
.
adr
=
cs
->
hw
.
sedl
.
cfg_reg
+
SEDL_ISAR_PCI_ADR
;
cs
->
hw
.
sedl
.
isac
=
cs
->
hw
.
sedl
.
cfg_reg
+
SEDL_ISAR_PCI_ISAC
;
cs
->
hw
.
sedl
.
hscx
=
cs
->
hw
.
sedl
.
cfg_reg
+
SEDL_ISAR_PCI_ISAR
;
if
(
sedl_isac_isar_init
(
cs
))
goto
err
;
return
0
;
err:
hisax_release_resources
(
cs
);
return
-
EBUSY
;
}
static
int
__init
sedl_pci_probe
(
struct
IsdnCardState
*
cs
,
struct
pci_dev
*
pdev
)
{
if
(
pci_enable_device
(
pdev
))
goto
err
;
cs
->
subtyp
=
SEDL_SPEED_PCI
;
cs
->
hw
.
sedl
.
chip
=
SEDL_CHIP_IPAC
;
if
(
sedl_pci_init
(
cs
,
pdev
))
goto
err
;
cs
->
hw
.
sedl
.
adr
=
cs
->
hw
.
sedl
.
cfg_reg
+
SEDL_IPAC_PCI_ADR
;
cs
->
hw
.
sedl
.
isac
=
cs
->
hw
.
sedl
.
cfg_reg
+
SEDL_IPAC_PCI_IPAC
;
if
(
sedl_ipac_init
(
cs
))
goto
err
;
return
0
;
err:
hisax_release_resources
(
cs
);
return
-
EBUSY
;
}
static
struct
pci_dev
*
dev_sedl
__devinitdata
=
NULL
;
#ifdef __ISAPNP__
...
...
@@ -472,265 +706,117 @@ static struct pnp_card *pnp_c __devinitdata = NULL;
int
__devinit
setup_sedlbauer
(
struct
IsdnCard
*
card
)
{
int
bytecnt
,
val
;
struct
IsdnCardState
*
cs
=
card
->
cs
;
char
tmp
[
64
];
u16
sub_vendor_id
,
sub_id
;
strcpy
(
tmp
,
Sedlbauer_revision
);
printk
(
KERN_INFO
"HiSax: Sedlbauer driver Rev. %s
\n
"
,
HiSax_getrev
(
tmp
));
printk
(
KERN_INFO
"HiSax: Sedlbauer driver Rev. %s
\n
"
,
HiSax_getrev
(
tmp
));
if
(
cs
->
typ
==
ISDN_CTYPE_SEDLBAUER
)
{
cs
->
subtyp
=
SEDL_SPEED_CARD_WIN
;
cs
->
hw
.
sedl
.
bus
=
SEDL_BUS_ISA
;
cs
->
hw
.
sedl
.
chip
=
SEDL_CHIP_TEST
;
}
else
if
(
cs
->
typ
==
ISDN_CTYPE_SEDLBAUER_PCMCIA
)
{
cs
->
subtyp
=
SEDL_SPEED_STAR
;
cs
->
hw
.
sedl
.
bus
=
SEDL_BUS_PCMCIA
;
cs
->
hw
.
sedl
.
chip
=
SEDL_CHIP_TEST
;
}
else
if
(
cs
->
typ
==
ISDN_CTYPE_SEDLBAUER_FAX
)
{
cs
->
subtyp
=
SEDL_SPEED_FAX
;
cs
->
hw
.
sedl
.
bus
=
SEDL_BUS_ISA
;
cs
->
hw
.
sedl
.
chip
=
SEDL_CHIP_ISAC_ISAR
;
}
else
return
(
0
);
bytecnt
=
8
;
if
(
card
->
para
[
1
])
{
cs
->
hw
.
sedl
.
cfg_reg
=
card
->
para
[
1
];
cs
->
irq
=
card
->
para
[
0
];
if
(
cs
->
hw
.
sedl
.
chip
==
SEDL_CHIP_ISAC_ISAR
)
{
bytecnt
=
16
;
if
(
cs
->
typ
==
ISDN_CTYPE_SEDLBAUER
)
{
if
(
sedl_card_win_probe
(
card
->
cs
,
card
)
<
0
)
return
0
;
return
1
;
}
else
if
(
cs
->
typ
==
ISDN_CTYPE_SEDLBAUER_PCMCIA
)
{
if
(
sedl_star_probe
(
card
->
cs
,
card
)
<
0
)
return
0
;
return
1
;
}
else
if
(
cs
->
typ
==
ISDN_CTYPE_SEDLBAUER_FAX
)
{
if
(
sedl_fax_probe
(
card
->
cs
,
card
)
<
0
)
return
0
;
return
1
;
}
}
else
{
}
#ifdef __ISAPNP__
if
(
isapnp_present
())
{
struct
pnp_card
*
pb
;
struct
pnp_dev
*
pd
;
while
(
pdev
->
card_vendor
)
{
if
((
pb
=
pnp_find_card
(
pdev
->
card_vendor
,
pdev
->
card_device
,
pnp_c
)))
{
pnp_c
=
pb
;
pd
=
NULL
;
if
((
pd
=
pnp_find_dev
(
pnp_c
,
pdev
->
vendor
,
pdev
->
function
,
pd
)))
{
printk
(
KERN_INFO
"HiSax: %s detected
\n
"
,
(
char
*
)
pdev
->
driver_data
);
if
(
pnp_device_attach
(
pd
)
<
0
)
{
printk
(
KERN_ERR
"Sedlbauer PnP: attach failed
\n
"
);
return
0
;
}
if
(
pnp_activate_dev
(
pd
)
<
0
)
{
printk
(
KERN_ERR
"Sedlbauer PnP: activate failed
\n
"
);
pnp_device_detach
(
pd
);
if
(
isapnp_present
())
{
struct
pnp_card
*
pb
;
struct
pnp_dev
*
pd
;
while
(
pdev
->
card_vendor
)
{
if
((
pb
=
pnp_find_card
(
pdev
->
card_vendor
,
pdev
->
card_device
,
pnp_c
)))
{
pnp_c
=
pb
;
pd
=
NULL
;
if
((
pd
=
pnp_find_dev
(
pnp_c
,
pdev
->
vendor
,
pdev
->
function
,
pd
)))
{
printk
(
KERN_INFO
"HiSax: %s detected
\n
"
,
(
char
*
)
pdev
->
driver_data
);
if
(
pnp_device_attach
(
pd
)
<
0
)
{
printk
(
KERN_ERR
"Sedlbauer PnP: attach failed
\n
"
);
return
0
;
}
if
(
pnp_activate_dev
(
pd
)
<
0
)
{
printk
(
KERN_ERR
"Sedlbauer PnP: activate failed
\n
"
);
pnp_device_detach
(
pd
);
return
0
;
}
if
(
!
pnp_irq_valid
(
pd
,
0
)
||
!
pnp_port_valid
(
pd
,
0
))
{
printk
(
KERN_ERR
"Sedlbauer PnP:some resources are missing %ld/%lx
\n
"
,
pnp_irq
(
pd
,
0
),
pnp_port_start
(
pd
,
0
));
pnp_device_detach
(
pd
);
goto
err
;
}
card
->
para
[
1
]
=
pnp_port_start
(
pd
,
0
);
card
->
para
[
0
]
=
pnp_irq
(
pd
,
0
);
cs
->
hw
.
sedl
.
cfg_reg
=
card
->
para
[
1
];
cs
->
irq
=
card
->
para
[
0
];
if
(
pdev
->
function
==
ISAPNP_FUNCTION
(
0x2
))
{
if
(
sedl_fax_probe
(
card
->
cs
,
card
))
return
0
;
}
if
(
!
pnp_irq_valid
(
pd
,
0
)
||
!
pnp_port_valid
(
pd
,
0
))
{
printk
(
KERN_ERR
"Sedlbauer PnP:some resources are missing %ld/%lx
\n
"
,
pnp_irq
(
pd
,
0
),
pnp_port_start
(
pd
,
0
));
pnp_device_detach
(
pd
);
goto
err
;
}
card
->
para
[
1
]
=
pnp_port_start
(
pd
,
0
);
card
->
para
[
0
]
=
pnp_irq
(
pd
,
0
);
cs
->
hw
.
sedl
.
cfg_reg
=
card
->
para
[
1
];
cs
->
irq
=
card
->
para
[
0
];
if
(
pdev
->
function
==
ISAPNP_FUNCTION
(
0x2
))
{
cs
->
subtyp
=
SEDL_SPEED_FAX
;
cs
->
hw
.
sedl
.
chip
=
SEDL_CHIP_ISAC_ISAR
;
bytecnt
=
16
;
}
else
{
cs
->
subtyp
=
SEDL_SPEED_CARD_WIN
;
cs
->
hw
.
sedl
.
chip
=
SEDL_CHIP_TEST
;
}
goto
ready
;
return
1
;
}
else
{
printk
(
KERN_ERR
"Sedlbauer PnP: PnP error card found, no device
\n
"
);
goto
err
;
if
(
sedl_card_win_probe
(
card
->
cs
,
card
))
return
0
;
return
1
;
}
}
else
{
printk
(
KERN_ERR
"Sedlbauer PnP: PnP error card found, no device
\n
"
);
goto
err
;
}
pdev
++
;
pnp_c
=
NULL
;
}
if
(
!
pdev
->
card_vendor
)
{
printk
(
KERN_INFO
"Sedlbauer PnP: no ISAPnP card found
\n
"
);
}
pdev
++
;
pnp_c
=
NULL
;
}
if
(
!
pdev
->
card_vendor
)
{
printk
(
KERN_INFO
"Sedlbauer PnP: no ISAPnP card found
\n
"
);
}
}
#endif
/* Probe for Sedlbauer speed pci */
#if CONFIG_PCI
if
((
dev_sedl
=
pci_find_device
(
PCI_VENDOR_ID_TIGERJET
,
PCI_DEVICE_ID_TIGERJET_100
,
dev_sedl
)))
{
if
(
pci_enable_device
(
dev_sedl
))
goto
err
;
cs
->
irq
=
dev_sedl
->
irq
;
if
(
!
cs
->
irq
)
{
printk
(
KERN_WARNING
"Sedlbauer: No IRQ for PCI card found
\n
"
);
goto
err
;
}
cs
->
hw
.
sedl
.
cfg_reg
=
pci_resource_start
(
dev_sedl
,
0
);
}
else
{
printk
(
KERN_WARNING
"Sedlbauer: No PCI card found
\n
"
);
goto
err
;
}
cs
->
irq_flags
|=
SA_SHIRQ
;
cs
->
hw
.
sedl
.
bus
=
SEDL_BUS_PCI
;
dev_sedl
=
pci_find_device
(
PCI_VENDOR_ID_TIGERJET
,
PCI_DEVICE_ID_TIGERJET_100
,
dev_sedl
);
if
(
dev_sedl
)
{
sub_vendor_id
=
dev_sedl
->
subsystem_vendor
;
sub_id
=
dev_sedl
->
subsystem_device
;
printk
(
KERN_INFO
"Sedlbauer: PCI subvendor:%x subid %x
\n
"
,
sub_vendor_id
,
sub_id
);
printk
(
KERN_INFO
"Sedlbauer: PCI base adr %#x
\n
"
,
cs
->
hw
.
sedl
.
cfg_reg
);
sub_vendor_id
,
sub_id
);
if
(
sub_id
!=
PCI_SUB_ID_SEDLBAUER
)
{
printk
(
KERN_ERR
"Sedlbauer: unknown sub id %#x
\n
"
,
sub_id
);
goto
err
;
return
0
;
}
if
(
sub_vendor_id
==
PCI_SUBVENDOR_SPEEDFAX_PYRAMID
)
{
cs
->
hw
.
sedl
.
chip
=
SEDL_CHIP_ISAC_ISAR
;
cs
->
subtyp
=
SEDL_SPEEDFAX_PYRAMID
;
if
(
sedl_fax_pyramid_probe
(
cs
,
dev_sedl
))
return
0
;
return
1
;
}
else
if
(
sub_vendor_id
==
PCI_SUBVENDOR_SPEEDFAX_PCI
)
{
cs
->
hw
.
sedl
.
chip
=
SEDL_CHIP_ISAC_ISAR
;
cs
->
subtyp
=
SEDL_SPEEDFAX_PCI
;
if
(
sedl_fax_pci_probe
(
cs
,
dev_sedl
))
return
0
;
return
1
;
}
else
if
(
sub_vendor_id
==
PCI_SUBVENDOR_SEDLBAUER_PCI
)
{
cs
->
hw
.
sedl
.
chip
=
SEDL_CHIP_IPAC
;
cs
->
subtyp
=
SEDL_SPEED_PCI
;
}
else
{
printk
(
KERN_ERR
"Sedlbauer: unknown sub vendor id %#x
\n
"
,
sub_vendor_id
);
goto
err
;
}
bytecnt
=
256
;
cs
->
hw
.
sedl
.
reset_on
=
SEDL_ISAR_PCI_ISAR_RESET_ON
;
cs
->
hw
.
sedl
.
reset_off
=
SEDL_ISAR_PCI_ISAR_RESET_OFF
;
byteout
(
cs
->
hw
.
sedl
.
cfg_reg
,
0xff
);
byteout
(
cs
->
hw
.
sedl
.
cfg_reg
,
0x00
);
byteout
(
cs
->
hw
.
sedl
.
cfg_reg
+
2
,
0xdd
);
byteout
(
cs
->
hw
.
sedl
.
cfg_reg
+
5
,
0x02
);
byteout
(
cs
->
hw
.
sedl
.
cfg_reg
+
3
,
cs
->
hw
.
sedl
.
reset_on
);
current
->
state
=
TASK_UNINTERRUPTIBLE
;
schedule_timeout
((
10
*
HZ
)
/
1000
);
byteout
(
cs
->
hw
.
sedl
.
cfg_reg
+
3
,
cs
->
hw
.
sedl
.
reset_off
);
#endif
/* CONFIG_PCI */
}
ready:
/* In case of the sedlbauer pcmcia card, this region is in use,
* reserved for us by the card manager. So we do not check it
* here, it would fail.
*/
if
(
cs
->
hw
.
sedl
.
bus
!=
SEDL_BUS_PCMCIA
)
{
if
(
!
request_io
(
&
cs
->
rs
,
cs
->
hw
.
sedl
.
cfg_reg
,
bytecnt
,
"sedlbauer isdn"
))
goto
err
;
}
printk
(
KERN_INFO
"Sedlbauer: defined at 0x%x-0x%x IRQ %d
\n
"
,
cs
->
hw
.
sedl
.
cfg_reg
,
cs
->
hw
.
sedl
.
cfg_reg
+
bytecnt
,
cs
->
irq
);
/*
* testing ISA and PCMCIA Cards for IPAC, default is ISAC
* do not test for PCI card, because ports are different
* and PCI card uses only IPAC (for the moment)
*/
if
(
cs
->
hw
.
sedl
.
bus
!=
SEDL_BUS_PCI
)
{
cs
->
hw
.
sedl
.
adr
=
cs
->
hw
.
sedl
.
cfg_reg
+
SEDL_IPAC_ANY_ADR
;
val
=
readreg
(
cs
,
cs
->
hw
.
sedl
.
cfg_reg
+
SEDL_IPAC_ANY_IPAC
,
IPAC_ID
);
printk
(
KERN_DEBUG
"Sedlbauer: testing IPAC version %x
\n
"
,
val
);
if
((
val
==
1
)
||
(
val
==
2
))
{
/* IPAC */
cs
->
subtyp
=
SEDL_SPEED_WIN2_PC104
;
if
(
cs
->
hw
.
sedl
.
bus
==
SEDL_BUS_PCMCIA
)
{
cs
->
subtyp
=
SEDL_SPEED_STAR2
;
}
cs
->
hw
.
sedl
.
chip
=
SEDL_CHIP_IPAC
;
}
else
{
/* ISAC_HSCX oder ISAC_ISAR */
if
(
cs
->
hw
.
sedl
.
chip
==
SEDL_CHIP_TEST
)
{
cs
->
hw
.
sedl
.
chip
=
SEDL_CHIP_ISAC_HSCX
;
}
}
}
/*
* hw.sedl.chip is now properly set
*/
printk
(
KERN_INFO
"Sedlbauer: %s detected
\n
"
,
Sedlbauer_Types
[
cs
->
subtyp
]);
if
(
cs
->
hw
.
sedl
.
chip
==
SEDL_CHIP_IPAC
)
{
if
(
cs
->
hw
.
sedl
.
bus
==
SEDL_BUS_PCI
)
{
cs
->
hw
.
sedl
.
adr
=
cs
->
hw
.
sedl
.
cfg_reg
+
SEDL_IPAC_PCI_ADR
;
cs
->
hw
.
sedl
.
isac
=
cs
->
hw
.
sedl
.
cfg_reg
+
SEDL_IPAC_PCI_IPAC
;
cs
->
hw
.
sedl
.
hscx
=
cs
->
hw
.
sedl
.
cfg_reg
+
SEDL_IPAC_PCI_IPAC
;
}
else
{
cs
->
hw
.
sedl
.
adr
=
cs
->
hw
.
sedl
.
cfg_reg
+
SEDL_IPAC_ANY_ADR
;
cs
->
hw
.
sedl
.
isac
=
cs
->
hw
.
sedl
.
cfg_reg
+
SEDL_IPAC_ANY_IPAC
;
cs
->
hw
.
sedl
.
hscx
=
cs
->
hw
.
sedl
.
cfg_reg
+
SEDL_IPAC_ANY_IPAC
;
}
cs
->
card_ops
=
&
sedlbauer_ipac_ops
;
if
(
ipac_setup
(
cs
,
&
ipac_dc_ops
,
&
ipac_bc_ops
))
goto
err
;
sedlbauer_reset
(
cs
);
}
else
{
/* ISAC_HSCX oder ISAC_ISAR */
if
(
cs
->
hw
.
sedl
.
chip
==
SEDL_CHIP_ISAC_ISAR
)
{
if
(
cs
->
hw
.
sedl
.
bus
==
SEDL_BUS_PCI
)
{
cs
->
hw
.
sedl
.
adr
=
cs
->
hw
.
sedl
.
cfg_reg
+
SEDL_ISAR_PCI_ADR
;
cs
->
hw
.
sedl
.
isac
=
cs
->
hw
.
sedl
.
cfg_reg
+
SEDL_ISAR_PCI_ISAC
;
cs
->
hw
.
sedl
.
hscx
=
cs
->
hw
.
sedl
.
cfg_reg
+
SEDL_ISAR_PCI_ISAR
;
}
else
{
cs
->
hw
.
sedl
.
adr
=
cs
->
hw
.
sedl
.
cfg_reg
+
SEDL_ISAR_ISA_ADR
;
cs
->
hw
.
sedl
.
isac
=
cs
->
hw
.
sedl
.
cfg_reg
+
SEDL_ISAR_ISA_ISAC
;
cs
->
hw
.
sedl
.
hscx
=
cs
->
hw
.
sedl
.
cfg_reg
+
SEDL_ISAR_ISA_ISAR
;
cs
->
hw
.
sedl
.
reset_on
=
cs
->
hw
.
sedl
.
cfg_reg
+
SEDL_ISAR_ISA_ISAR_RESET_ON
;
cs
->
hw
.
sedl
.
reset_off
=
cs
->
hw
.
sedl
.
cfg_reg
+
SEDL_ISAR_ISA_ISAR_RESET_OFF
;
}
cs
->
bcs
[
0
].
hw
.
isar
.
reg
=
&
cs
->
hw
.
sedl
.
isar
;
cs
->
bcs
[
1
].
hw
.
isar
.
reg
=
&
cs
->
hw
.
sedl
.
isar
;
test_and_set_bit
(
HW_ISAR
,
&
cs
->
HW_Flags
);
cs
->
card_ops
=
&
sedlbauer_isar_ops
;
cs
->
auxcmd
=
&
isar_auxcmd
;
isac_setup
(
cs
,
&
isac_ops
);
if
(
isar_setup
(
cs
,
&
isar_ops
))
goto
err
;
}
else
{
if
(
cs
->
hw
.
sedl
.
bus
==
SEDL_BUS_PCMCIA
)
{
cs
->
hw
.
sedl
.
adr
=
cs
->
hw
.
sedl
.
cfg_reg
+
SEDL_HSCX_PCMCIA_ADR
;
cs
->
hw
.
sedl
.
isac
=
cs
->
hw
.
sedl
.
cfg_reg
+
SEDL_HSCX_PCMCIA_ISAC
;
cs
->
hw
.
sedl
.
hscx
=
cs
->
hw
.
sedl
.
cfg_reg
+
SEDL_HSCX_PCMCIA_HSCX
;
cs
->
hw
.
sedl
.
reset_on
=
cs
->
hw
.
sedl
.
cfg_reg
+
SEDL_HSCX_PCMCIA_RESET
;
cs
->
hw
.
sedl
.
reset_off
=
cs
->
hw
.
sedl
.
cfg_reg
+
SEDL_HSCX_PCMCIA_RESET
;
}
else
{
cs
->
hw
.
sedl
.
adr
=
cs
->
hw
.
sedl
.
cfg_reg
+
SEDL_HSCX_ISA_ADR
;
cs
->
hw
.
sedl
.
isac
=
cs
->
hw
.
sedl
.
cfg_reg
+
SEDL_HSCX_ISA_ISAC
;
cs
->
hw
.
sedl
.
hscx
=
cs
->
hw
.
sedl
.
cfg_reg
+
SEDL_HSCX_ISA_HSCX
;
cs
->
hw
.
sedl
.
reset_on
=
cs
->
hw
.
sedl
.
cfg_reg
+
SEDL_HSCX_ISA_RESET_ON
;
cs
->
hw
.
sedl
.
reset_off
=
cs
->
hw
.
sedl
.
cfg_reg
+
SEDL_HSCX_ISA_RESET_OFF
;
}
cs
->
card_ops
=
&
sedlbauer_ops
;
if
(
hscxisac_setup
(
cs
,
&
isac_ops
,
&
hscx_ops
))
goto
err
;
sedlbauer_reset
(
cs
);
if
(
sedl_pci_probe
(
cs
,
dev_sedl
))
return
0
;
return
1
;
}
printk
(
KERN_ERR
"Sedlbauer: unknown sub vendor id %#x
\n
"
,
sub_vendor_id
);
return
0
;
}
return
1
;
err:
hisax_release_resources
(
cs
);
#endif
/* CONFIG_PCI */
return
0
;
}
drivers/isdn/hisax/sportster.c
View file @
c747c791
...
...
@@ -189,42 +189,29 @@ get_io_range(struct IsdnCardState *cs)
}
return
0
;
}
int
__init
setup_sportster
(
struct
IsdnCard
*
card
)
{
struct
IsdnCardState
*
cs
=
card
->
cs
;
char
tmp
[
64
];
strcpy
(
tmp
,
sportster_revision
);
printk
(
KERN_INFO
"HiSax: USR Sportster driver Rev. %s
\n
"
,
HiSax_getrev
(
tmp
));
cs
->
hw
.
spt
.
cfg_reg
=
card
->
para
[
1
];
static
int
__init
sportster_probe
(
struct
IsdnCardState
*
cs
,
struct
IsdnCard
*
card
)
{
cs
->
irq
=
card
->
para
[
0
];
cs
->
hw
.
spt
.
cfg_reg
=
card
->
para
[
1
];
if
(
!
get_io_range
(
cs
))
return
(
0
)
;
return
-
EBUSY
;
cs
->
hw
.
spt
.
isac
=
cs
->
hw
.
spt
.
cfg_reg
+
SPORTSTER_ISAC
;
cs
->
hw
.
spt
.
hscx
[
0
]
=
cs
->
hw
.
spt
.
cfg_reg
+
SPORTSTER_HSCXA
;
cs
->
hw
.
spt
.
hscx
[
1
]
=
cs
->
hw
.
spt
.
cfg_reg
+
SPORTSTER_HSCXB
;
switch
(
cs
->
irq
)
{
case
5
:
cs
->
hw
.
spt
.
res_irq
=
1
;
break
;
case
7
:
cs
->
hw
.
spt
.
res_irq
=
2
;
break
;
case
10
:
cs
->
hw
.
spt
.
res_irq
=
3
;
break
;
case
11
:
cs
->
hw
.
spt
.
res_irq
=
4
;
break
;
case
12
:
cs
->
hw
.
spt
.
res_irq
=
5
;
break
;
case
14
:
cs
->
hw
.
spt
.
res_irq
=
6
;
break
;
case
15
:
cs
->
hw
.
spt
.
res_irq
=
7
;
break
;
default:
sportster_release
(
cs
);
printk
(
KERN_WARNING
"Sportster: wrong IRQ
\n
"
);
return
(
0
);
case
5
:
cs
->
hw
.
spt
.
res_irq
=
1
;
break
;
case
7
:
cs
->
hw
.
spt
.
res_irq
=
2
;
break
;
case
10
:
cs
->
hw
.
spt
.
res_irq
=
3
;
break
;
case
11
:
cs
->
hw
.
spt
.
res_irq
=
4
;
break
;
case
12
:
cs
->
hw
.
spt
.
res_irq
=
5
;
break
;
case
14
:
cs
->
hw
.
spt
.
res_irq
=
6
;
break
;
case
15
:
cs
->
hw
.
spt
.
res_irq
=
7
;
break
;
default:
printk
(
KERN_WARNING
"Sportster: wrong IRQ
\n
"
);
goto
err
;
}
sportster_reset
(
cs
);
printk
(
KERN_INFO
"HiSax: %s config irq:%d cfg:0x%X
\n
"
,
...
...
@@ -234,8 +221,22 @@ setup_sportster(struct IsdnCard *card)
cs
->
card_ops
=
&
sportster_ops
;
if
(
hscxisac_setup
(
cs
,
&
isac_ops
,
&
hscx_ops
))
goto
err
;
return
1
;
err:
hisax_release_resources
(
cs
);
return
0
;
err:
sportster_release
(
cs
);
return
-
EBUSY
;
}
int
__init
setup_sportster
(
struct
IsdnCard
*
card
)
{
char
tmp
[
64
];
strcpy
(
tmp
,
sportster_revision
);
printk
(
KERN_INFO
"HiSax: USR Sportster driver Rev. %s
\n
"
,
HiSax_getrev
(
tmp
));
if
(
sportster_probe
(
card
->
cs
,
card
)
<
0
)
return
0
;
return
1
;
}
drivers/isdn/hisax/teleint.c
View file @
c747c791
...
...
@@ -256,15 +256,9 @@ static struct card_ops teleint_ops = {
.
irq_func
=
teleint_interrupt
,
};
int
__init
setup_TeleInt
(
struct
IsdnCard
*
card
)
static
int
__init
teleint_probe
(
struct
IsdnCardState
*
cs
,
struct
IsdnCard
*
card
)
{
struct
IsdnCardState
*
cs
=
card
->
cs
;
char
tmp
[
64
];
strcpy
(
tmp
,
TeleInt_revision
);
printk
(
KERN_INFO
"HiSax: TeleInt driver Rev. %s
\n
"
,
HiSax_getrev
(
tmp
));
cs
->
hw
.
hfc
.
addr
=
card
->
para
[
1
]
&
0x3fe
;
cs
->
irq
=
card
->
para
[
0
];
cs
->
hw
.
hfc
.
cirm
=
HFC_CIRM
;
...
...
@@ -284,42 +278,54 @@ setup_TeleInt(struct IsdnCard *card)
byteout
(
cs
->
hw
.
hfc
.
addr
,
cs
->
hw
.
hfc
.
addr
&
0xff
);
byteout
(
cs
->
hw
.
hfc
.
addr
|
1
,
((
cs
->
hw
.
hfc
.
addr
&
0x300
)
>>
8
)
|
0x54
);
switch
(
cs
->
irq
)
{
case
3
:
cs
->
hw
.
hfc
.
cirm
|=
HFC_INTA
;
break
;
case
4
:
cs
->
hw
.
hfc
.
cirm
|=
HFC_INTB
;
break
;
case
5
:
cs
->
hw
.
hfc
.
cirm
|=
HFC_INTC
;
break
;
case
7
:
cs
->
hw
.
hfc
.
cirm
|=
HFC_INTD
;
break
;
case
10
:
cs
->
hw
.
hfc
.
cirm
|=
HFC_INTE
;
break
;
case
11
:
cs
->
hw
.
hfc
.
cirm
|=
HFC_INTF
;
break
;
default:
printk
(
KERN_WARNING
"TeleInt: wrong IRQ
\n
"
);
goto
err
;
case
3
:
cs
->
hw
.
hfc
.
cirm
|=
HFC_INTA
;
break
;
case
4
:
cs
->
hw
.
hfc
.
cirm
|=
HFC_INTB
;
break
;
case
5
:
cs
->
hw
.
hfc
.
cirm
|=
HFC_INTC
;
break
;
case
7
:
cs
->
hw
.
hfc
.
cirm
|=
HFC_INTD
;
break
;
case
10
:
cs
->
hw
.
hfc
.
cirm
|=
HFC_INTE
;
break
;
case
11
:
cs
->
hw
.
hfc
.
cirm
|=
HFC_INTF
;
break
;
default:
printk
(
KERN_WARNING
"TeleInt: wrong IRQ
\n
"
);
goto
err
;
}
byteout
(
cs
->
hw
.
hfc
.
addr
|
1
,
cs
->
hw
.
hfc
.
cirm
);
byteout
(
cs
->
hw
.
hfc
.
addr
|
1
,
cs
->
hw
.
hfc
.
ctmt
);
printk
(
KERN_INFO
"TeleInt: defined at 0x%x IRQ %d
\n
"
,
cs
->
hw
.
hfc
.
addr
,
cs
->
irq
);
printk
(
KERN_INFO
"TeleInt: defined at 0x%x IRQ %d
\n
"
,
cs
->
hw
.
hfc
.
addr
,
cs
->
irq
);
cs
->
card_ops
=
&
teleint_ops
;
teleint_reset
(
cs
);
isac_setup
(
cs
,
&
isac_ops
);
hfc_setup
(
cs
,
&
hfc_ops
);
return
1
;
err:
teleint_release
(
cs
);
return
0
;
err:
hisax_release_resources
(
cs
);
return
-
EBUSY
;
}
int
__init
setup_TeleInt
(
struct
IsdnCard
*
card
)
{
char
tmp
[
64
];
strcpy
(
tmp
,
TeleInt_revision
);
printk
(
KERN_INFO
"HiSax: TeleInt driver Rev. %s
\n
"
,
HiSax_getrev
(
tmp
));
if
(
teleint_probe
(
card
->
cs
,
card
)
<
0
)
return
0
;
return
1
;
}
drivers/isdn/hisax/teles0.c
View file @
c747c791
...
...
@@ -165,72 +165,95 @@ static struct card_ops teles0_ops = {
.
irq_func
=
hscxisac_irq
,
};
int
__init
setup_teles0
(
struct
IsdnCard
*
card
)
static
int
__init
teles0_probe
(
struct
IsdnCardState
*
cs
,
struct
IsdnCard
*
card
)
{
u8
val
;
struct
IsdnCardState
*
cs
=
card
->
cs
;
char
tmp
[
64
];
strcpy
(
tmp
,
teles0_revision
);
printk
(
KERN_INFO
"HiSax: Teles 8.0/16.0 driver Rev. %s
\n
"
,
HiSax_getrev
(
tmp
));
if
(
cs
->
typ
==
ISDN_CTYPE_16_0
)
cs
->
hw
.
teles0
.
cfg_reg
=
card
->
para
[
2
];
else
/* 8.0 */
cs
->
hw
.
teles0
.
cfg_reg
=
0
;
if
(
card
->
para
[
1
]
<
0x10000
)
{
card
->
para
[
1
]
<<=
4
;
printk
(
KERN_INFO
"Teles0: membase configured DOSish, assuming 0x%lx
\n
"
,
(
unsigned
long
)
card
->
para
[
1
]);
}
cs
->
irq
=
card
->
para
[
0
];
if
(
cs
->
hw
.
teles0
.
cfg_reg
)
{
if
(
!
request_io
(
&
cs
->
rs
,
cs
->
hw
.
teles0
.
cfg_reg
,
8
,
"teles cfg"
))
goto
err
;
if
((
val
=
bytein
(
cs
->
hw
.
teles0
.
cfg_reg
+
0
))
!=
0x51
)
{
printk
(
KERN_WARNING
"Teles0: 16.0 Byte at %x is %x
\n
"
,
cs
->
hw
.
teles0
.
cfg_reg
+
0
,
val
);
goto
err
;
}
if
((
val
=
bytein
(
cs
->
hw
.
teles0
.
cfg_reg
+
1
))
!=
0x93
)
{
printk
(
KERN_WARNING
"Teles0: 16.0 Byte at %x is %x
\n
"
,
cs
->
hw
.
teles0
.
cfg_reg
+
1
,
val
);
goto
err
;
}
val
=
bytein
(
cs
->
hw
.
teles0
.
cfg_reg
+
2
);
/* 0x1e=without AB
* 0x1f=with AB
* 0x1c 16.3 ???
*/
if
(
val
!=
0x1e
&&
val
!=
0x1f
)
{
printk
(
KERN_WARNING
"Teles0: 16.0 Byte at %x is %x
\n
"
,
cs
->
hw
.
teles0
.
cfg_reg
+
2
,
val
);
goto
err
;
}
}
/* 16.0 and 8.0 designed for IOM1 */
test_and_set_bit
(
HW_IOM1
,
&
cs
->
HW_Flags
);
cs
->
hw
.
teles0
.
phymem
=
card
->
para
[
1
];
cs
->
hw
.
teles0
.
membase
=
request_mmio
(
&
cs
->
rs
,
cs
->
hw
.
teles0
.
phymem
,
TELES_IOMEM_SIZE
,
"teles iomem"
);
cs
->
hw
.
teles0
.
membase
=
request_mmio
(
&
cs
->
rs
,
cs
->
hw
.
teles0
.
phymem
,
TELES_IOMEM_SIZE
,
"teles iomem"
);
if
(
!
cs
->
hw
.
teles0
.
membase
)
goto
err
;
return
-
EBUSY
;
printk
(
KERN_INFO
"HiSax: %s config irq:%d mem:0x%p cfg:0x%X
\n
"
,
CardType
[
cs
->
typ
],
cs
->
irq
,
cs
->
hw
.
teles0
.
membase
,
cs
->
hw
.
teles0
.
cfg_reg
);
if
(
teles0_reset
(
cs
))
{
printk
(
KERN_WARNING
"Teles0: wrong IRQ
\n
"
);
goto
err
;
return
-
EBUSY
;
}
cs
->
card_ops
=
&
teles0_ops
;
if
(
hscxisac_setup
(
cs
,
&
isac_ops
,
&
hscx_ops
))
goto
err
;
return
1
;
return
-
EBUSY
;
return
0
;
}
static
int
__init
teles16_0_probe
(
struct
IsdnCardState
*
cs
,
struct
IsdnCard
*
card
)
{
u8
val
;
cs
->
hw
.
teles0
.
cfg_reg
=
card
->
para
[
2
];
if
(
!
request_io
(
&
cs
->
rs
,
cs
->
hw
.
teles0
.
cfg_reg
,
8
,
"teles cfg"
))
goto
err
;
if
((
val
=
bytein
(
cs
->
hw
.
teles0
.
cfg_reg
+
0
))
!=
0x51
)
{
printk
(
KERN_WARNING
"Teles0: 16.0 Byte at %x is %x
\n
"
,
cs
->
hw
.
teles0
.
cfg_reg
+
0
,
val
);
goto
err
;
}
if
((
val
=
bytein
(
cs
->
hw
.
teles0
.
cfg_reg
+
1
))
!=
0x93
)
{
printk
(
KERN_WARNING
"Teles0: 16.0 Byte at %x is %x
\n
"
,
cs
->
hw
.
teles0
.
cfg_reg
+
1
,
val
);
goto
err
;
}
val
=
bytein
(
cs
->
hw
.
teles0
.
cfg_reg
+
2
);
/* 0x1e=without AB
* 0x1f=with AB
* 0x1c 16.3 ???
*/
if
(
val
!=
0x1e
&&
val
!=
0x1f
)
{
printk
(
KERN_WARNING
"Teles0: 16.0 Byte at %x is %x
\n
"
,
cs
->
hw
.
teles0
.
cfg_reg
+
2
,
val
);
goto
err
;
}
if
(
teles0_probe
(
cs
,
card
)
<
0
)
goto
err
;
return
0
;
err:
hisax_release_resources
(
cs
);
return
-
EBUSY
;
}
static
int
__init
teles8_0_probe
(
struct
IsdnCardState
*
cs
,
struct
IsdnCard
*
card
)
{
cs
->
hw
.
teles0
.
cfg_reg
=
0
;
if
(
teles0_probe
(
cs
,
card
)
<
0
)
goto
err
;
return
0
;
err:
hisax_release_resources
(
cs
);
return
-
EBUSY
;
}
int
__init
setup_teles0
(
struct
IsdnCard
*
card
)
{
char
tmp
[
64
];
strcpy
(
tmp
,
teles0_revision
);
printk
(
KERN_INFO
"HiSax: Teles 8.0/16.0 driver Rev. %s
\n
"
,
HiSax_getrev
(
tmp
));
if
(
card
->
cs
->
typ
==
ISDN_CTYPE_16_0
)
{
if
(
teles16_0_probe
(
card
->
cs
,
card
)
<
0
)
return
0
;
}
else
{
if
(
teles8_0_probe
(
card
->
cs
,
card
)
<
0
)
return
0
;
}
return
1
;
}
drivers/isdn/hisax/teles3.c
View file @
c747c791
...
...
@@ -176,6 +176,152 @@ static struct card_ops teles3_ops = {
.
irq_func
=
hscxisac_irq
,
};
static
int
teles_hw_init
(
struct
IsdnCardState
*
cs
)
{
printk
(
KERN_INFO
"HiSax: %s config irq:%d isac:0x%X cfg:0x%X
\n
"
,
CardType
[
cs
->
typ
],
cs
->
irq
,
cs
->
hw
.
teles3
.
isac
+
32
,
cs
->
hw
.
teles3
.
cfg_reg
);
printk
(
KERN_INFO
"HiSax: hscx A:0x%X hscx B:0x%X
\n
"
,
cs
->
hw
.
teles3
.
hscx
[
0
]
+
32
,
cs
->
hw
.
teles3
.
hscx
[
1
]
+
32
);
if
(
teles3_reset
(
cs
))
{
printk
(
KERN_WARNING
"Teles3: wrong IRQ
\n
"
);
return
-
EBUSY
;
}
cs
->
card_ops
=
&
teles3_ops
;
if
(
hscxisac_setup
(
cs
,
&
isac_ops
,
&
hscx_ops
))
return
-
EBUSY
;
return
0
;
}
static
void
__init
teles_setup_io
(
struct
IsdnCardState
*
cs
,
struct
IsdnCard
*
card
)
{
cs
->
irq
=
card
->
para
[
0
];
cs
->
hw
.
teles3
.
isacfifo
=
cs
->
hw
.
teles3
.
isac
+
0x3e
;
cs
->
hw
.
teles3
.
hscxfifo
[
0
]
=
cs
->
hw
.
teles3
.
hscx
[
0
]
+
0x3e
;
cs
->
hw
.
teles3
.
hscxfifo
[
1
]
=
cs
->
hw
.
teles3
.
hscx
[
1
]
+
0x3e
;
}
static
int
__init
telespcmcia_probe
(
struct
IsdnCardState
*
cs
,
struct
IsdnCard
*
card
)
{
cs
->
hw
.
teles3
.
cfg_reg
=
0
;
cs
->
hw
.
teles3
.
hscx
[
0
]
=
card
->
para
[
1
]
-
0x20
;
cs
->
hw
.
teles3
.
hscx
[
1
]
=
card
->
para
[
1
];
cs
->
hw
.
teles3
.
isac
=
card
->
para
[
1
]
+
0x20
;
teles_setup_io
(
cs
,
card
);
if
(
!
request_io
(
&
cs
->
rs
,
cs
->
hw
.
teles3
.
hscx
[
1
],
96
,
"HiSax Teles PCMCIA"
))
goto
err
;
if
(
teles_hw_init
(
cs
)
<
0
)
goto
err
;
return
0
;
err:
hisax_release_resources
(
cs
);
return
-
EBUSY
;
}
static
int
__init
teles_request_io
(
struct
IsdnCardState
*
cs
)
{
if
(
!
request_io
(
&
cs
->
rs
,
cs
->
hw
.
teles3
.
isac
+
32
,
32
,
"HiSax isac"
))
return
-
EBUSY
;
if
(
!
request_io
(
&
cs
->
rs
,
cs
->
hw
.
teles3
.
hscx
[
0
]
+
32
,
32
,
"HiSax hscx A"
))
return
-
EBUSY
;
if
(
!
request_io
(
&
cs
->
rs
,
cs
->
hw
.
teles3
.
hscx
[
1
]
+
32
,
32
,
"HiSax hscx B"
))
return
-
EBUSY
;
return
0
;
}
static
int
__init
teles16_3_probe
(
struct
IsdnCardState
*
cs
,
struct
IsdnCard
*
card
)
{
u8
val
;
cs
->
hw
.
teles3
.
cfg_reg
=
card
->
para
[
1
];
switch
(
cs
->
hw
.
teles3
.
cfg_reg
)
{
case
0x180
:
case
0x280
:
case
0x380
:
cs
->
hw
.
teles3
.
cfg_reg
|=
0xc00
;
break
;
}
cs
->
hw
.
teles3
.
isac
=
cs
->
hw
.
teles3
.
cfg_reg
-
0x420
;
cs
->
hw
.
teles3
.
hscx
[
0
]
=
cs
->
hw
.
teles3
.
cfg_reg
-
0xc20
;
cs
->
hw
.
teles3
.
hscx
[
1
]
=
cs
->
hw
.
teles3
.
cfg_reg
-
0x820
;
teles_setup_io
(
cs
,
card
);
if
(
!
request_io
(
&
cs
->
rs
,
cs
->
hw
.
teles3
.
cfg_reg
,
8
,
"teles3 cfg"
))
goto
err
;
if
(
teles_request_io
(
cs
)
<
0
)
goto
err
;
if
((
val
=
bytein
(
cs
->
hw
.
teles3
.
cfg_reg
+
0
))
!=
0x51
)
{
printk
(
KERN_WARNING
"Teles: 16.3 Byte at %x is %x
\n
"
,
cs
->
hw
.
teles3
.
cfg_reg
+
0
,
val
);
goto
err
;
}
if
((
val
=
bytein
(
cs
->
hw
.
teles3
.
cfg_reg
+
1
))
!=
0x93
)
{
printk
(
KERN_WARNING
"Teles: 16.3 Byte at %x is %x
\n
"
,
cs
->
hw
.
teles3
.
cfg_reg
+
1
,
val
);
goto
err
;
}
/* 0x1e without AB, 0x1f with AB, 0x1c 16.3 ???,
* 0x39 16.3 1.1, 0x38 16.3 1.3, 0x46 16.3 with AB + Video */
val
=
bytein
(
cs
->
hw
.
teles3
.
cfg_reg
+
2
);
if
(
val
!=
0x46
&&
val
!=
0x39
&&
val
!=
0x38
&&
val
!=
0x1c
&&
val
!=
0x1e
&&
val
!=
0x1f
)
{
printk
(
KERN_WARNING
"Teles: 16.3 Byte at %x is %x
\n
"
,
cs
->
hw
.
teles3
.
cfg_reg
+
2
,
val
);
goto
err
;
}
if
(
teles_hw_init
(
cs
)
<
0
)
goto
err
;
return
0
;
err:
hisax_release_resources
(
cs
);
return
-
EBUSY
;
}
static
int
__init
compaq_probe
(
struct
IsdnCardState
*
cs
,
struct
IsdnCard
*
card
)
{
cs
->
hw
.
teles3
.
cfg_reg
=
card
->
para
[
3
];
cs
->
hw
.
teles3
.
isac
=
card
->
para
[
2
]
-
32
;
cs
->
hw
.
teles3
.
hscx
[
0
]
=
card
->
para
[
1
]
-
32
;
cs
->
hw
.
teles3
.
hscx
[
1
]
=
card
->
para
[
1
];
teles_setup_io
(
cs
,
card
);
if
(
!
request_io
(
&
cs
->
rs
,
cs
->
hw
.
teles3
.
cfg_reg
,
1
,
"teles3 cfg"
))
goto
err
;
if
(
teles_request_io
(
cs
)
<
0
)
goto
err
;
if
(
teles_hw_init
(
cs
)
<
0
)
goto
err
;
return
0
;
err:
hisax_release_resources
(
cs
);
return
-
EBUSY
;
}
static
int
__init
telespnp_probe
(
struct
IsdnCardState
*
cs
,
struct
IsdnCard
*
card
)
{
cs
->
hw
.
teles3
.
cfg_reg
=
0
;
cs
->
hw
.
teles3
.
isac
=
card
->
para
[
1
]
-
32
;
cs
->
hw
.
teles3
.
hscx
[
0
]
=
card
->
para
[
2
]
-
32
;
cs
->
hw
.
teles3
.
hscx
[
1
]
=
card
->
para
[
2
];
teles_setup_io
(
cs
,
card
);
if
(
teles_request_io
(
cs
)
<
0
)
goto
err
;
if
(
teles_hw_init
(
cs
)
<
0
)
goto
err
;
return
0
;
err:
hisax_release_resources
(
cs
);
return
-
EBUSY
;
}
#ifdef __ISAPNP__
static
struct
isapnp_device_id
teles_ids
[]
__initdata
=
{
{
ISAPNP_VENDOR
(
'T'
,
'A'
,
'G'
),
ISAPNP_FUNCTION
(
0x2110
),
...
...
@@ -197,16 +343,10 @@ static struct pnp_card *pnp_c __devinitdata = NULL;
int
__devinit
setup_teles3
(
struct
IsdnCard
*
card
)
{
u8
val
;
struct
IsdnCardState
*
cs
=
card
->
cs
;
char
tmp
[
64
];
strcpy
(
tmp
,
teles3_revision
);
printk
(
KERN_INFO
"HiSax: Teles IO driver Rev. %s
\n
"
,
HiSax_getrev
(
tmp
));
if
((
cs
->
typ
!=
ISDN_CTYPE_16_3
)
&&
(
cs
->
typ
!=
ISDN_CTYPE_PNP
)
&&
(
cs
->
typ
!=
ISDN_CTYPE_TELESPCMCIA
)
&&
(
cs
->
typ
!=
ISDN_CTYPE_COMPAQ_ISA
))
return
(
0
);
#ifdef __ISAPNP__
if
(
!
card
->
para
[
1
]
&&
isapnp_present
())
{
struct
pnp_card
*
pnp_card
;
...
...
@@ -258,100 +398,18 @@ setup_teles3(struct IsdnCard *card)
}
}
#endif
if
(
cs
->
typ
==
ISDN_CTYPE_16_3
)
{
cs
->
hw
.
teles3
.
cfg_reg
=
card
->
para
[
1
];
switch
(
cs
->
hw
.
teles3
.
cfg_reg
)
{
case
0x180
:
case
0x280
:
case
0x380
:
cs
->
hw
.
teles3
.
cfg_reg
|=
0xc00
;
break
;
}
cs
->
hw
.
teles3
.
isac
=
cs
->
hw
.
teles3
.
cfg_reg
-
0x420
;
cs
->
hw
.
teles3
.
hscx
[
0
]
=
cs
->
hw
.
teles3
.
cfg_reg
-
0xc20
;
cs
->
hw
.
teles3
.
hscx
[
1
]
=
cs
->
hw
.
teles3
.
cfg_reg
-
0x820
;
}
else
if
(
cs
->
typ
==
ISDN_CTYPE_TELESPCMCIA
)
{
cs
->
hw
.
teles3
.
cfg_reg
=
0
;
cs
->
hw
.
teles3
.
hscx
[
0
]
=
card
->
para
[
1
]
-
0x20
;
cs
->
hw
.
teles3
.
hscx
[
1
]
=
card
->
para
[
1
];
cs
->
hw
.
teles3
.
isac
=
card
->
para
[
1
]
+
0x20
;
}
else
if
(
cs
->
typ
==
ISDN_CTYPE_COMPAQ_ISA
)
{
cs
->
hw
.
teles3
.
cfg_reg
=
card
->
para
[
3
];
cs
->
hw
.
teles3
.
isac
=
card
->
para
[
2
]
-
32
;
cs
->
hw
.
teles3
.
hscx
[
0
]
=
card
->
para
[
1
]
-
32
;
cs
->
hw
.
teles3
.
hscx
[
1
]
=
card
->
para
[
1
];
if
(
card
->
cs
->
typ
==
ISDN_CTYPE_16_3
)
{
if
(
teles16_3_probe
(
card
->
cs
,
card
)
<
0
)
return
0
;
}
else
if
(
card
->
cs
->
typ
==
ISDN_CTYPE_TELESPCMCIA
)
{
if
(
telespcmcia_probe
(
card
->
cs
,
card
)
<
0
)
return
0
;
}
else
if
(
card
->
cs
->
typ
==
ISDN_CTYPE_COMPAQ_ISA
)
{
if
(
compaq_probe
(
card
->
cs
,
card
)
<
0
)
return
0
;
}
else
{
/* PNP */
cs
->
hw
.
teles3
.
cfg_reg
=
0
;
cs
->
hw
.
teles3
.
isac
=
card
->
para
[
1
]
-
32
;
cs
->
hw
.
teles3
.
hscx
[
0
]
=
card
->
para
[
2
]
-
32
;
cs
->
hw
.
teles3
.
hscx
[
1
]
=
card
->
para
[
2
];
}
cs
->
irq
=
card
->
para
[
0
];
cs
->
hw
.
teles3
.
isacfifo
=
cs
->
hw
.
teles3
.
isac
+
0x3e
;
cs
->
hw
.
teles3
.
hscxfifo
[
0
]
=
cs
->
hw
.
teles3
.
hscx
[
0
]
+
0x3e
;
cs
->
hw
.
teles3
.
hscxfifo
[
1
]
=
cs
->
hw
.
teles3
.
hscx
[
1
]
+
0x3e
;
if
(
cs
->
typ
==
ISDN_CTYPE_TELESPCMCIA
)
{
if
(
!
request_io
(
&
cs
->
rs
,
cs
->
hw
.
teles3
.
hscx
[
1
],
96
,
"HiSax Teles PCMCIA"
))
goto
err
;
}
else
{
if
(
cs
->
hw
.
teles3
.
cfg_reg
)
{
if
(
cs
->
typ
==
ISDN_CTYPE_COMPAQ_ISA
)
{
if
(
!
request_io
(
&
cs
->
rs
,
cs
->
hw
.
teles3
.
cfg_reg
,
1
,
"teles3 cfg"
))
goto
err
;
}
else
{
if
(
!
request_io
(
&
cs
->
rs
,
cs
->
hw
.
teles3
.
cfg_reg
,
8
,
"teles3 cfg"
))
goto
err
;
}
}
if
(
!
request_io
(
&
cs
->
rs
,
cs
->
hw
.
teles3
.
isac
+
32
,
32
,
"HiSax isac"
))
goto
err
;
if
(
!
request_io
(
&
cs
->
rs
,
cs
->
hw
.
teles3
.
hscx
[
0
]
+
32
,
32
,
"HiSax hscx A"
))
goto
err
;
if
(
!
request_io
(
&
cs
->
rs
,
cs
->
hw
.
teles3
.
hscx
[
1
]
+
32
,
32
,
"HiSax hscx B"
))
goto
err
;
}
if
((
cs
->
hw
.
teles3
.
cfg_reg
)
&&
(
cs
->
typ
!=
ISDN_CTYPE_COMPAQ_ISA
))
{
if
((
val
=
bytein
(
cs
->
hw
.
teles3
.
cfg_reg
+
0
))
!=
0x51
)
{
printk
(
KERN_WARNING
"Teles: 16.3 Byte at %x is %x
\n
"
,
cs
->
hw
.
teles3
.
cfg_reg
+
0
,
val
);
goto
err
;
}
if
((
val
=
bytein
(
cs
->
hw
.
teles3
.
cfg_reg
+
1
))
!=
0x93
)
{
printk
(
KERN_WARNING
"Teles: 16.3 Byte at %x is %x
\n
"
,
cs
->
hw
.
teles3
.
cfg_reg
+
1
,
val
);
goto
err
;
}
val
=
bytein
(
cs
->
hw
.
teles3
.
cfg_reg
+
2
);
/* 0x1e=without AB
* 0x1f=with AB
* 0x1c 16.3 ???
* 0x39 16.3 1.1
* 0x38 16.3 1.3
* 0x46 16.3 with AB + Video (Teles-Vision)
*/
if
(
val
!=
0x46
&&
val
!=
0x39
&&
val
!=
0x38
&&
val
!=
0x1c
&&
val
!=
0x1e
&&
val
!=
0x1f
)
{
printk
(
KERN_WARNING
"Teles: 16.3 Byte at %x is %x
\n
"
,
cs
->
hw
.
teles3
.
cfg_reg
+
2
,
val
);
goto
err
;
}
}
printk
(
KERN_INFO
"HiSax: %s config irq:%d isac:0x%X cfg:0x%X
\n
"
,
CardType
[
cs
->
typ
],
cs
->
irq
,
cs
->
hw
.
teles3
.
isac
+
32
,
cs
->
hw
.
teles3
.
cfg_reg
);
printk
(
KERN_INFO
"HiSax: hscx A:0x%X hscx B:0x%X
\n
"
,
cs
->
hw
.
teles3
.
hscx
[
0
]
+
32
,
cs
->
hw
.
teles3
.
hscx
[
1
]
+
32
);
if
(
teles3_reset
(
cs
))
{
printk
(
KERN_WARNING
"Teles3: wrong IRQ
\n
"
);
goto
err
;
if
(
telespnp_probe
(
card
->
cs
,
card
)
<
0
)
return
0
;
}
cs
->
card_ops
=
&
teles3_ops
;
if
(
hscxisac_setup
(
cs
,
&
isac_ops
,
&
hscx_ops
))
goto
err
;
return
1
;
err:
hisax_release_resources
(
cs
);
return
0
;
}
drivers/isdn/hisax/telespci.c
View file @
c747c791
...
...
@@ -231,36 +231,23 @@ static struct card_ops telespci_ops = {
.
irq_func
=
telespci_interrupt
,
};
static
struct
pci_dev
*
dev_tel
__initdata
=
NULL
;
int
__init
setup_telespci
(
struct
IsdnCard
*
card
)
static
int
__init
telespci_probe
(
struct
IsdnCardState
*
cs
,
struct
pci_dev
*
pdev
)
{
struct
IsdnCardState
*
cs
=
card
->
cs
;
char
tmp
[
64
];
int
rc
;
#ifdef __BIG_ENDIAN
#error "not running on big endian machines now"
#endif
strcpy
(
tmp
,
telespci_revision
);
printk
(
KERN_INFO
"HiSax: Teles/PCI driver Rev. %s
\n
"
,
HiSax_getrev
(
tmp
));
if
((
dev_tel
=
pci_find_device
(
PCI_VENDOR_ID_ZORAN
,
PCI_DEVICE_ID_ZORAN_36120
,
dev_tel
)))
{
if
(
pci_enable_device
(
dev_tel
))
return
(
0
);
cs
->
irq
=
dev_tel
->
irq
;
if
(
!
cs
->
irq
)
{
printk
(
KERN_WARNING
"Teles: No IRQ for PCI card found
\n
"
);
return
(
0
);
}
cs
->
hw
.
teles0
.
membase
=
request_mmio
(
&
cs
->
rs
,
pci_resource_start
(
dev_tel
,
0
),
4096
,
"telespci"
);
if
(
!
cs
->
hw
.
teles0
.
membase
)
goto
err
;
printk
(
KERN_INFO
"Found: Zoran, base-address: 0x%lx, irq: 0x%x
\n
"
,
pci_resource_start
(
dev_tel
,
0
),
dev_tel
->
irq
);
}
else
{
printk
(
KERN_WARNING
"TelesPCI: No PCI card found
\n
"
);
return
(
0
);
}
printk
(
KERN_INFO
"TelesPCI: defined at %#lx IRQ %d
\n
"
,
pci_resource_start
(
pdev
,
0
),
pdev
->
irq
);
rc
=
-
EBUSY
;
if
(
pci_enable_device
(
pdev
))
goto
err
;
cs
->
irq
=
pdev
->
irq
;
cs
->
irq_flags
|=
SA_SHIRQ
;
cs
->
hw
.
teles0
.
membase
=
request_mmio
(
&
cs
->
rs
,
pci_resource_start
(
pdev
,
0
),
4096
,
"telespci"
);
if
(
!
cs
->
hw
.
teles0
.
membase
)
goto
err
;
/* Initialize Zoran PCI controller */
writel
(
0x00000000
,
cs
->
hw
.
teles0
.
membase
+
0x28
);
...
...
@@ -270,17 +257,36 @@ setup_telespci(struct IsdnCard *card)
writel
(
0x70000000
,
cs
->
hw
.
teles0
.
membase
+
0x3C
);
writel
(
0x61000000
,
cs
->
hw
.
teles0
.
membase
+
0x40
);
/* writel(0x00800000, cs->hw.teles0.membase + 0x200); */
printk
(
KERN_INFO
"HiSax: %s config irq:%d mem:%p
\n
"
,
CardType
[
cs
->
typ
],
cs
->
irq
,
cs
->
hw
.
teles0
.
membase
);
cs
->
irq_flags
|=
SA_SHIRQ
;
cs
->
card_ops
=
&
telespci_ops
;
if
(
hscxisac_setup
(
cs
,
&
isac_ops
,
&
hscx_ops
))
goto
err
;
return
1
;
return
0
;
err:
hisax_release_resources
(
cs
);
return
rc
;
}
static
struct
pci_dev
*
dev_tel
__initdata
=
NULL
;
int
__init
setup_telespci
(
struct
IsdnCard
*
card
)
{
char
tmp
[
64
];
#ifdef __BIG_ENDIAN
#error "not running on big endian machines now"
#endif
strcpy
(
tmp
,
telespci_revision
);
printk
(
KERN_INFO
"HiSax: Teles/PCI driver Rev. %s
\n
"
,
HiSax_getrev
(
tmp
));
dev_tel
=
pci_find_device
(
PCI_VENDOR_ID_ZORAN
,
PCI_DEVICE_ID_ZORAN_36120
,
dev_tel
);
if
(
dev_tel
)
{
if
(
telespci_probe
(
card
->
cs
,
dev_tel
)
<
0
)
return
0
;
return
1
;
}
printk
(
KERN_WARNING
"TelesPCI: No PCI card found
\n
"
);
return
0
;
}
drivers/isdn/hisax/w6692.c
View file @
c747c791
...
...
@@ -669,11 +669,11 @@ static int id_idx ;
static
struct
pci_dev
*
dev_w6692
__initdata
=
NULL
;
static
int
w6692_setup
(
struct
IsdnCardState
*
cs
,
struct
dc_hw_ops
*
dc_ops
,
struct
bc_hw_ops
*
bc_ops
)
w6692_hw_init
(
struct
IsdnCardState
*
cs
)
{
cs
->
dc_hw_ops
=
dc_ops
;
cs
->
bc_hw_ops
=
bc_ops
;
cs
->
card_ops
=
&
w6692_ops
;
cs
->
dc_hw_ops
=
&
w6692_dc_hw_ops
,
cs
->
bc_hw_ops
=
&
w6692_bc_hw_ops
;
dc_l1_init
(
cs
,
&
w6692_dc_l1_ops
);
cs
->
bc_l1_ops
=
&
w6692_bc_l1_ops
;
W6692Version
(
cs
,
"W6692:"
);
...
...
@@ -685,14 +685,45 @@ w6692_setup(struct IsdnCardState *cs, struct dc_hw_ops *dc_ops,
return
0
;
}
static
int
__init
w6692_probe
(
struct
IsdnCardState
*
cs
,
struct
pci_dev
*
pdev
)
{
int
rc
;
printk
(
KERN_INFO
"W6692: %s %s at %#lx IRQ %d
\n
"
,
id_list
[
cs
->
subtyp
].
vendor_name
,
id_list
[
cs
->
subtyp
].
card_name
,
pci_resource_start
(
pdev
,
1
),
pdev
->
irq
);
rc
=
-
EBUSY
;
if
(
pci_enable_device
(
pdev
))
goto
err
;
/* USR ISDN PCI card TA need some special handling */
if
(
cs
->
subtyp
==
W6692_WINBOND
)
{
if
(
pdev
->
subsystem_vendor
==
W6692_SV_USR
&&
pdev
->
subsystem_device
==
W6692_SD_USR
)
{
cs
->
subtyp
=
W6692_USR
;
}
}
cs
->
irq
=
pdev
->
irq
;
cs
->
irq_flags
|=
SA_SHIRQ
;
cs
->
hw
.
w6692
.
iobase
=
pci_resource_start
(
pdev
,
1
);
if
(
!
request_io
(
&
cs
->
rs
,
cs
->
hw
.
w6692
.
iobase
,
0x100
,
id_list
[
cs
->
subtyp
].
card_name
))
goto
err
;
w6692_hw_init
(
cs
);
return
0
;
err:
hisax_release_resources
(
cs
);
return
rc
;
}
int
__init
setup_w6692
(
struct
IsdnCard
*
card
)
{
struct
IsdnCardState
*
cs
=
card
->
cs
;
char
tmp
[
64
];
u8
found
=
0
;
u8
pci_irq
=
0
;
u_int
pci_ioaddr
=
0
;
#ifdef __BIG_ENDIAN
#error "not running on big endian machines now"
...
...
@@ -704,54 +735,13 @@ setup_w6692(struct IsdnCard *card)
id_list
[
id_idx
].
device_id
,
dev_w6692
);
if
(
dev_w6692
)
{
if
(
pci_enable_device
(
dev_w6692
))
continue
;
cs
->
subtyp
=
id_idx
;
break
;
card
->
cs
->
subtyp
=
id_idx
;
if
(
w6692_probe
(
card
->
cs
,
dev_w6692
)
<
0
)
return
0
;
return
1
;
}
id_idx
++
;
}
if
(
dev_w6692
)
{
found
=
1
;
pci_irq
=
dev_w6692
->
irq
;
/* I think address 0 is allways the configuration area */
/* and address 1 is the real IO space KKe 03.09.99 */
pci_ioaddr
=
pci_resource_start
(
dev_w6692
,
1
);
/* USR ISDN PCI card TA need some special handling */
if
(
cs
->
subtyp
==
W6692_WINBOND
)
{
if
((
W6692_SV_USR
==
dev_w6692
->
subsystem_vendor
)
&&
(
W6692_SD_USR
==
dev_w6692
->
subsystem_device
))
{
cs
->
subtyp
=
W6692_USR
;
}
}
}
if
(
!
found
)
{
printk
(
KERN_WARNING
"W6692: No PCI card found
\n
"
);
return
(
0
);
}
cs
->
irq
=
pci_irq
;
if
(
!
cs
->
irq
)
{
printk
(
KERN_WARNING
"W6692: No IRQ for PCI card found
\n
"
);
return
(
0
);
}
if
(
!
pci_ioaddr
)
{
printk
(
KERN_WARNING
"W6692: NO I/O Base Address found
\n
"
);
return
(
0
);
}
cs
->
hw
.
w6692
.
iobase
=
pci_ioaddr
;
printk
(
KERN_INFO
"Found: %s %s, I/O base: 0x%x, irq: %d
\n
"
,
id_list
[
cs
->
subtyp
].
vendor_name
,
id_list
[
cs
->
subtyp
].
card_name
,
pci_ioaddr
,
pci_irq
);
if
(
!
request_io
(
&
cs
->
rs
,
cs
->
hw
.
w6692
.
iobase
,
0x100
,
id_list
[
cs
->
subtyp
].
card_name
))
return
0
;
printk
(
KERN_INFO
"HiSax: %s config irq:%d I/O:%x
\n
"
,
id_list
[
cs
->
subtyp
].
card_name
,
cs
->
irq
,
cs
->
hw
.
w6692
.
iobase
);
cs
->
card_ops
=
&
w6692_ops
;
w6692_setup
(
cs
,
&
w6692_dc_hw_ops
,
&
w6692_bc_hw_ops
);
cs
->
irq_flags
|=
SA_SHIRQ
;
return
(
1
);
printk
(
KERN_WARNING
"W6692: No PCI card found
\n
"
);
return
0
;
}
drivers/isdn/i4l/Kconfig
View file @
c747c791
...
...
@@ -85,7 +85,7 @@ config ISDN_TTY_FAX
config
ISDN_X25
bool
"X.25 PLP on top of ISDN"
depends
on
X25
depends
on
X25
&&
BROKEN
help
This
feature
provides
the
X
.25
protocol
over
ISDN
connections
.
See
<
file
:
Documentation
/
isdn
/
README
.
x25
>
for
more
information
...
...
drivers/isdn/i4l/isdn_net_lib.c
View file @
c747c791
...
...
@@ -58,6 +58,7 @@
#include "isdn_net.h"
#include "isdn_ppp.h"
#include "isdn_ciscohdlck.h"
#include "isdn_concap.h"
#define ISDN_NET_TX_TIMEOUT (20*HZ)
...
...
drivers/isdn/i4l/isdn_ppp.c
View file @
c747c791
...
...
@@ -867,7 +867,7 @@ isdn_ppp_strip_proto(struct sk_buff *skb, u16 *proto)
skb_pull
(
skb
,
1
);
}
else
{
if
(
skb
->
len
<
2
)
return
-
1
;
return
-
EINVAL
;
get_u16
(
skb
->
data
,
proto
);
skb_pull
(
skb
,
2
);
}
...
...
@@ -1037,7 +1037,7 @@ isdn_ppp_start_xmit(struct sk_buff *skb, struct net_device *ndev)
isdn_ppp_frame_log
(
"xmit1"
,
skb
->
data
,
skb
->
len
,
32
,
ipppd
->
unit
,
-
1
);
ippp_push_proto
(
ind_ppp
,
skb
,
proto
);
ippp_mp_xmit
(
idev
,
skb
,
proto
);
ippp_mp_xmit
(
idev
,
skb
);
return
0
;
drop:
...
...
drivers/isdn/i4l/isdn_ppp_mp.c
View file @
c747c791
...
...
@@ -91,12 +91,13 @@ ippp_mp_disconnected(isdn_net_dev *idev)
}
void
ippp_mp_xmit
(
isdn_net_dev
*
idev
,
struct
sk_buff
*
skb
,
u16
proto
)
ippp_mp_xmit
(
isdn_net_dev
*
idev
,
struct
sk_buff
*
skb
)
{
struct
ind_ppp
*
ind_ppp
=
idev
->
ind_priv
;
struct
inl_ppp
*
inl_ppp
=
idev
->
mlp
->
inl_priv
;
unsigned
char
*
p
;
long
txseq
;
u32
txseq
;
u16
proto
;
if
(
!
(
inl_ppp
->
mp_cfg
&
SC_MP_PROT
))
{
return
ippp_xmit
(
idev
,
skb
);
...
...
drivers/isdn/i4l/isdn_ppp_mp.h
View file @
c747c791
...
...
@@ -19,7 +19,7 @@
int
ippp_mp_bind
(
isdn_net_dev
*
idev
);
void
ippp_mp_disconnected
(
isdn_net_dev
*
idev
);
int
ippp_mp_bundle
(
isdn_net_dev
*
idev
,
int
val
);
void
ippp_mp_xmit
(
isdn_net_dev
*
idev
,
struct
sk_buff
*
skb
,
u16
proto
);
void
ippp_mp_xmit
(
isdn_net_dev
*
idev
,
struct
sk_buff
*
skb
);
void
ippp_mp_receive
(
isdn_net_dev
*
idev
,
struct
sk_buff
*
skb
,
u16
proto
);
#else
...
...
@@ -42,9 +42,9 @@ ippp_mp_bundle(isdn_net_dev *idev, int val)
}
static
inline
void
ippp_mp_xmit
(
isdn_net_dev
*
idev
,
struct
sk_buff
*
skb
,
u16
proto
)
ippp_mp_xmit
(
isdn_net_dev
*
idev
,
struct
sk_buff
*
skb
)
{
ippp_xmit
(
idev
,
skb
,
proto
);
ippp_xmit
(
idev
,
skb
);
}
static
inline
void
...
...
kernel/ksyms.c
View file @
c747c791
...
...
@@ -483,8 +483,6 @@ EXPORT_SYMBOL(task_nice);
EXPORT_SYMBOL_GPL
(
idle_cpu
);
#if CONFIG_SMP
EXPORT_SYMBOL_GPL
(
set_cpus_allowed
);
#endif
#if CONFIG_SMP || CONFIG_PREEMPT
EXPORT_SYMBOL
(
kernel_flag
);
#endif
EXPORT_SYMBOL
(
jiffies
);
...
...
kernel/sched.c
View file @
c747c791
...
...
@@ -2426,7 +2426,7 @@ __init int migration_init(void)
#endif
#if CONFIG_SMP
|| CONFIG_PREEMPT
#if CONFIG_SMP
/*
* The 'big kernel lock'
*
...
...
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