generic-2.4: add ip6t_REJECT support
[oweals/openwrt.git] / target / linux / generic-2.4 / patches / 200-i4l.patch
1 Index: linux-2.4.35.4/Documentation/isdn/CREDITS
2 ===================================================================
3 --- linux-2.4.35.4.orig/Documentation/isdn/CREDITS      2007-12-15 05:19:39.346663275 +0100
4 +++ linux-2.4.35.4/Documentation/isdn/CREDITS   2007-12-15 05:19:55.467581957 +0100
5 @@ -37,7 +37,7 @@
6  Andreas Kool (akool@Kool.f.EUnet.de)
7    For contribution of the isdnlog/isdnrep-tool
8  
9 -Pedro Roque Marques (pedro_m@yahoo.com)
10 +Pedro Roque Marques (roque@di.fc.ul.pt)
11    For lot of new ideas and the pcbit driver.
12  
13  Eberhard Moenkeberg (emoenke@gwdg.de)
14 Index: linux-2.4.35.4/Documentation/isdn/HiSax.cert
15 ===================================================================
16 --- linux-2.4.35.4.orig/Documentation/isdn/HiSax.cert   2007-12-15 05:19:39.354663733 +0100
17 +++ linux-2.4.35.4/Documentation/isdn/HiSax.cert        2007-12-15 05:19:55.471582183 +0100
18 @@ -68,6 +68,8 @@
19  drivers/isdn/hisax/elsa.c
20  drivers/isdn/hisax/diva.c
21  drivers/isdn/hisax/hfc_pci.c
22 +drivers/isdn/hisax/hfc_usbr.c
23 +drivers/isdn/hisax/hfc_usb.c
24  
25  Please send any changes, bugfixes and patches to me rather than implementing
26  them directly into the HiSax sources.
27 Index: linux-2.4.35.4/Documentation/isdn/INTERFACE
28 ===================================================================
29 --- linux-2.4.35.4.orig/Documentation/isdn/INTERFACE    2007-12-15 05:19:39.362664189 +0100
30 +++ linux-2.4.35.4/Documentation/isdn/INTERFACE 2007-12-15 05:19:55.479582638 +0100
31 @@ -1,4 +1,4 @@
32 -$Id: INTERFACE,v 1.1.4.1 2001/11/20 14:19:33 kai Exp $
33 +$Id: INTERFACE,v 1.17 2002/01/31 13:26:35 keil Exp $
34  
35  Description of the Interface between Linklevel and Hardwarelevel
36    of isdn4linux:
37 @@ -399,7 +399,7 @@
38                      protocol-Id is one of the constants ISDN_PROTO_L3...
39        parm.fax    = Pointer to T30_s fax struct. (fax usage only)
40  
41 -  ISDN_CMD_GETL2: (currently unused)
42 +  ISDN_CMD_GETL3: (currently unused)
43  
44      With this command, the HL-driver is told to return the current
45      setting of the Layer-3-protocol.
46 @@ -781,3 +781,22 @@
47        arg         = channel-number, locally to the driver. (starting with 0)
48        parm        = unused.
49  
50 +  ISDN_STAT_ALERT:
51 +
52 +    With this call, the HL-driver signals the receive of an ALERTING message to the LL.
53 +
54 +    Parameter:
55 +      driver      = driver-Id
56 +      command     = ISDN_STAT_ALERT
57 +      arg         = channel-number, locally to the driver. (starting with 0)
58 +
59 +  ISDN_STAT_PROCEED:
60 +
61 +    With this call, the HL-driver signals the receive of an CALL PROCEEDING message
62 +    to the LL.
63 +
64 +    Parameter:
65 +      driver      = driver-Id
66 +      command     = ISDN_STAT_PROCEED
67 +      arg         = channel-number, locally to the driver. (starting with 0)
68 +
69 Index: linux-2.4.35.4/Documentation/isdn/INTERFACE.fax
70 ===================================================================
71 --- linux-2.4.35.4.orig/Documentation/isdn/INTERFACE.fax        2007-12-15 05:19:39.366664415 +0100
72 +++ linux-2.4.35.4/Documentation/isdn/INTERFACE.fax     2007-12-15 05:19:55.483582867 +0100
73 @@ -1,4 +1,4 @@
74 -$Id: INTERFACE.fax,v 1.1.4.1 2001/11/20 14:19:33 kai Exp $
75 +$Id: INTERFACE.fax,v 1.2 2000/08/06 09:22:50 armin Exp $
76  
77  
78  Description of the fax-subinterface between linklevel and hardwarelevel of 
79 Index: linux-2.4.35.4/Documentation/isdn/README
80 ===================================================================
81 --- linux-2.4.35.4.orig/Documentation/isdn/README       2007-12-15 05:19:39.374664873 +0100
82 +++ linux-2.4.35.4/Documentation/isdn/README    2007-12-15 05:19:55.487583097 +0100
83 @@ -278,6 +278,12 @@
84                                        1 = Add CPN to FCON message on
85                              Bit 2:    0 = Add CDN to RING/FCON message off
86                                        1 = Add CDN to RING/FCON message on
87 +                            Bit 3:    0 = Do not signal RINGING
88 +                                      1 = Signal RINGING if ALERT was received
89 +                            Bit 4:    0 = Do not signal PROCEEDING
90 +                                      1 = Signal PROCEEDING if CALL PROCEEDING
91 +                                          was received
92 +
93  
94    Last but not least a (at the moment fairly primitive) device to request
95    the line-status (/dev/isdninfo) is made available.
96 Index: linux-2.4.35.4/Documentation/isdn/README.HiSax
97 ===================================================================
98 --- linux-2.4.35.4.orig/Documentation/isdn/README.HiSax 2007-12-15 05:19:39.382665329 +0100
99 +++ linux-2.4.35.4/Documentation/isdn/README.HiSax      2007-12-15 05:19:55.487583097 +0100
100 @@ -41,10 +41,9 @@
101  ELSA Quickstep 3000PCI
102  ELSA PCMCIA
103  ITK ix1-micro Rev.2
104 -Eicon Diva 2.0 ISA and PCI (S0 and U interface, no PRO version)
105 -Eicon Diva 2.01 ISA and PCI
106 -Eicon Diva 2.02 PCI
107 -Eicon Diva Piccola
108 +Eicon.Diehl Diva 2.0 ISA and PCI (S0 and U interface, no PRO version)
109 +Eicon.Diehl Diva 2.01 ISA and PCI
110 +Eicon.Diehl Diva Piccola
111  ASUSCOM NETWORK INC. ISDNLink 128K PC adapter (order code I-IN100-ST-D)
112  Dynalink IS64PH (OEM version of ASUSCOM NETWORK INC. ISDNLink 128K adapter)
113  PCBIT-DP (OEM version of ASUSCOM NETWORK INC. ISDNLink)
114 @@ -53,7 +52,6 @@
115  Sedlbauer Speed Star/Speed Star2 (PCMCIA)
116  Sedlbauer ISDN-Controller PC/104
117  USR Sportster internal TA (compatible Stollmann tina-pp V3)
118 -USR internal TA PCI
119  ith Kommunikationstechnik GmbH MIC 16 ISA card
120  Traverse Technologie NETjet PCI S0 card and NETspider U card
121  Ovislink ISDN sc100-p card (NETjet driver)
122 @@ -68,14 +66,14 @@
123  HFC-PCI based cards
124  Winbond W6692 based cards
125  HFC-S+, HFC-SP/PCMCIA cards
126 -formula-n enternow
127 -Gerdes Power ISDN
128 +HFC-USB ISDN TAs
129  
130  Note: PCF, PCF-Pro: up to now, only the ISDN part is supported
131        PCC-8: not tested yet
132        Eicon.Diehl Diva U interface not tested
133  
134  If you know other passive cards with the Siemens chipset, please let me know.
135 +To use the PNP cards you need the isapnptools.
136  You can combine any card, if there is no conflict between the resources
137  (io, mem, irq).
138  
139 @@ -91,15 +89,8 @@
140  modules. It is included in the normal "make [menu]config" target at the
141  kernel. Don't forget it, especially to select the right D-channel protocol.
142  
143 -Please note: In older versions of the HiSax driver, all PnP cards
144 -needed to be configured with isapnp and worked only with the HiSax
145 -driver used as a module.
146 -
147 -In the current version, HiSax will automatically use the in-kernel
148 -ISAPnP support, provided you selected it during kernel configuration
149 -(CONFIG_ISAPNP), if you don't give the io=, irq= command line parameters.
150 -
151 -The affected card types are: 4,7,12,14,19,27-30
152 +Please note: All PnP cards need to be configured with isapnp and will work
153 +only with the HiSax driver used as a module.
154  
155  a) when built as a module
156  -------------------------
157 @@ -200,8 +191,6 @@
158     37  HFC 2BDS0 S+, SP         irq,io 
159     38  NETspider U PCI card     none
160     39  HFC 2BDS0 SP/PCMCIA      irq,io (set with cardmgr)
161 -   40   hotplug interface
162 -   41   Formula-n enter:now PCI  none
163  
164  At the moment IRQ sharing is only possible with PCI cards. Please make sure
165  that your IRQ is free and enabled for ISA use.
166 @@ -227,13 +216,6 @@
167                     (IO 1 (BASE 0x0180))
168     modprobe hisax type=4 protocol=2 irq=10 io0=0x580 io1=0x180
169  
170 -   In the current version of HiSax, you can instead simply use
171 -
172 -   modprobe hisax type=4 protocol=2
173 -
174 -   if you configured your kernel for ISAPnP. Don't run isapnp in
175 -   this case!
176 -
177  6. Teles 16.3, Euro ISDN, I/O base 280 hex, IRQ 12 and
178     Teles 16.0, 1TR6, IRQ 5, Memory d0000 hex
179     modprobe hisax type=3,1 protocol=2,1 io=0x280 mem=0,0xd0000
180 @@ -314,9 +296,7 @@
181     36  W6692 based PCI cards   none
182     37  HFC 2BDS0 S+,SP/PCMCIA  ONLY WORKS AS A MODULE !
183     38  NETspider U PCI card    none
184 -   39  HFC 2BDS0 SP/PCMCIA     ONLY WORKS AS A MODULE !
185 -   40   hotplug interface      ONLY WORKS AS A MODULE !
186 -   41   Formula-n enter:now PCI none
187 +
188  
189  Running the driver
190  ------------------
191 Index: linux-2.4.35.4/Documentation/isdn/README.act2000
192 ===================================================================
193 --- linux-2.4.35.4.orig/Documentation/isdn/README.act2000       2007-12-15 05:19:39.390665784 +0100
194 +++ linux-2.4.35.4/Documentation/isdn/README.act2000    2007-12-15 05:19:55.487583097 +0100
195 @@ -1,4 +1,4 @@
196 -$Id: README.act2000,v 1.1.4.1 2001/11/20 14:19:33 kai Exp $
197 +$Id: README.act2000,v 1.3 2000/08/06 09:22:51 armin Exp $
198  
199  This document describes the ACT2000 driver for the
200  IBM Active 2000 ISDN card.
201 Index: linux-2.4.35.4/Documentation/isdn/README.audio
202 ===================================================================
203 --- linux-2.4.35.4.orig/Documentation/isdn/README.audio 2007-12-15 05:19:39.394666013 +0100
204 +++ linux-2.4.35.4/Documentation/isdn/README.audio      2007-12-15 05:19:55.487583097 +0100
205 @@ -1,4 +1,4 @@
206 -$Id: README.audio,v 1.1.4.1 2001/11/20 14:19:33 kai Exp $
207 +$Id: README.audio,v 1.8 1999/07/11 17:17:29 armin Exp $
208  
209  ISDN subsystem for Linux.
210    Description of audio mode.
211 Index: linux-2.4.35.4/Documentation/isdn/README.eicon
212 ===================================================================
213 --- linux-2.4.35.4.orig/Documentation/isdn/README.eicon 2007-12-15 05:19:39.402666468 +0100
214 +++ linux-2.4.35.4/Documentation/isdn/README.eicon      2007-12-15 05:19:55.487583097 +0100
215 @@ -1,4 +1,4 @@
216 -$Id: README.eicon,v 1.1.4.1 2001/11/20 14:19:33 kai Exp $
217 +$Id: README.eicon,v 1.10 2000/08/13 12:19:15 armin Exp $
218  
219  (c) 1999,2000 Armin Schindler (mac@melware.de)
220  (c) 1999,2000 Cytronics & Melware (info@melware.de)
221 Index: linux-2.4.35.4/Documentation/isdn/README.hysdn
222 ===================================================================
223 --- linux-2.4.35.4.orig/Documentation/isdn/README.hysdn 2007-12-15 05:19:39.410666924 +0100
224 +++ linux-2.4.35.4/Documentation/isdn/README.hysdn      2007-12-15 05:19:55.491583323 +0100
225 @@ -1,4 +1,4 @@
226 -$Id: README.hysdn,v 1.1.4.1 2001/11/20 14:19:33 kai Exp $
227 +$Id: README.hysdn,v 1.3.6.1 2001/02/10 14:41:19 kai Exp $
228  The hysdn driver has been written by
229  by Werner Cornelius (werner@isdn4linux.de or werner@titro.de) 
230  for Hypercope GmbH Aachen Germany. Hypercope agreed to publish this driver
231 Index: linux-2.4.35.4/Documentation/isdn/README.icn
232 ===================================================================
233 --- linux-2.4.35.4.orig/Documentation/isdn/README.icn   2007-12-15 05:19:39.418667379 +0100
234 +++ linux-2.4.35.4/Documentation/isdn/README.icn        2007-12-15 05:19:55.491583323 +0100
235 @@ -1,4 +1,4 @@
236 -$Id: README.icn,v 1.1.4.1 2001/11/20 14:19:33 kai Exp $
237 +$Id: README.icn,v 1.7 2000/08/06 09:22:51 armin Exp $
238  
239  You can get the ICN-ISDN-card from:
240  
241 Index: linux-2.4.35.4/Documentation/isdn/README.pcbit
242 ===================================================================
243 --- linux-2.4.35.4.orig/Documentation/isdn/README.pcbit 2007-12-15 05:19:39.422667608 +0100
244 +++ linux-2.4.35.4/Documentation/isdn/README.pcbit      2007-12-15 05:19:55.491583323 +0100
245 @@ -37,4 +37,4 @@
246  regards,
247    Pedro.
248                 
249 -<pedro_m@yahoo.com>
250 +<roque@di.fc.ul.pt>
251 Index: linux-2.4.35.4/Documentation/isdn/abcext_kernel.help
252 ===================================================================
253 --- /dev/null   1970-01-01 00:00:00.000000000 +0000
254 +++ linux-2.4.35.4/Documentation/isdn/abcext_kernel.help        2007-12-15 05:19:55.491583323 +0100
255 @@ -0,0 +1,166 @@
256
257 +ISDN-ABC-DW Extension
258 +CONFIG_ISDN_WITH_ABC
259 +   These are many brand new Options and Features for the
260 +   ISDN SUBSYSTEM. Including Logical Device bindings,
261 +   Compression and other good stuff for Optimizing your
262 +   ISDN System.
263 +
264 +   To Use this Extensions you MUST HAVE THE NEWEST
265 +   ISDN4K-UTILS. You must have Version 3.1-Beta6 or
266 +   higher. Elsewhere you can not configure this Extensions.
267 +
268 +   WARNING ! THIS STUF IS NOT PRODUCTION RELEASE THE
269 +   FUNCTION ARE UNDER DEVELOPMENT. This ist BETA-CODE.
270 +   You can use it at you Own Risk.
271 +
272 +   For more Information on these Extensions take a look at
273 +   "linux/Documentation/isdn/dw-abc-extension-howto.txt or
274 +   Online at the Web "http://www.mediatronix.de/i4l/index.html"
275 +
276 +   Please Report Bugs to "mario@mediatronix.de" or
277 +   "delefw@isdn4linux.de"
278 +
279 +D-Channel-Callback with Channel in use check
280 +CONFIG_ISDN_WITH_ABC_CALLB
281 +   When a Interface is declared as an Callback Interface,
282 +   the Interface is checking that the other Side is not
283 +   Calling on the same time before the Interface is Dialing.
284 +
285 +   See "linux/Documentation/isdn/dw-abc-extension-howto.txt" 
286 +   for more Information
287 +
288 +   In most case answer with "Yes" when you have Callback devices,
289 +   otherwise leave it "No"
290 +
291 +Outgoing-EAZ-Support
292 +CONFIG_ISDN_WITH_ABC_OUTGOING_EAZ
293 +   Enables the Feature to Define an other EAZ or MSN for
294 +   Outgoing calls on an Interface.
295 +
296 +   See "linux/Documentation/isdn/dw-abc-extension-howto.txt" 
297 +   for more Information
298 +
299 +Least Cost Router Support
300 +CONFIG_ISDN_WITH_ABC_LCR_SUPPORT
301 +   This is the final Kernel Code for configuring an Least
302 +   Cost Router Softwarebased. The other Job is to do the
303 +   action in ISDNLOG. You need the ISDNLOG to use this 
304 +   function. Currently the ISDNLOG have not the Support for
305 +   this Option.
306 +   So in most situations let the Option off.
307 +
308 +TCP keepalive detect and response
309 +CONFIG_ISDN_WITH_ABC_IPV4_TCP_KEEPALIVE
310 +   This Option works only with the TCP/IP V4. It enables
311 +   the Function that ISDN Devices are Answering TCP_KEEPALIVE Pakets
312 +   localy. So that TCP KEEPALIVE Pakets not longer takes the Line
313 +   open.
314 +
315 +Drop frames Sourceadresse is not Interfaceadress
316 +CONFIG_ISDN_WITH_ABC_IPV4_DYNADDR
317 +   This Option works only with the TCP/IP V4. It will allow only
318 +   the Transmitt of Pakets where the Sourceadresse is the Interface
319 +   adress. It is usefull when you have Lines with Dynamic IP.
320 +
321 +   See "linux/Documentation/isdn/dw-abc-extension-howto.txt" 
322 +   for more Information
323 +
324 +Receive do not reset the Hanguptimer
325 +CONFIG_ISDN_WITH_ABC_RCV_NO_HUPTIMER
326 +   When you activate this option than the reiceive of pakets do
327 +   not reset the Hanguptimer. It is very usefull because if the
328 +   Paket vor your Network your Network generate an Response and
329 +   the Transmit is reseting the HUPTIMER. But when the Paket is
330 +   Rejected at your firewall your network generate no Response
331 +   and no Sendtraffic is generated. So in this case there is no 
332 +   need to Reset the Huptimer because you have only received Data.
333 +   With that option only Transmitted Data/Pakets will reset the
334 +   HUPTIMER.
335 +
336 +Support of (device-channel) and Binding Groups
337 +CONFIG_ISDN_WITH_ABC_ICALL_BIND
338 +   This Option enables the Feature to Bind logical ISDN Interfaces
339 +   to an prefered ISDN Card or ISDN Card plus Channel. So you have
340 +   the Chance to keep Channels exclusively for one (or more) 
341 +   Connection. Very usefull when you have more channels and Use 
342 +   Calling Line Identification, because you can organize that your
343 +   call is going out over the Line with the right EAZ for the CLI.
344 +
345 +Skip channel if used external (Dial Only)
346 +CONFIG_ISDN_WITH_ABC_CH_EXTINUSE
347 +   When you have more than One ISDN Card in your System and you
348 +   will Dialout with an Interface you can become the Situation
349 +   that an External Device such a Telephone or Fax is Using the
350 +   B-Channels. Normaly ISDN4Linux does not detect this Situation
351 +   and dial everytime of the "External Busy" line out. With this
352 +   Option Enabled the I4L will detect that he can not dialout on
353 +   This Card and dial over the next Card out.
354 +
355 +   See "linux/Documentation/isdn/dw-abc-extension-howto.txt" 
356 +   for more Information
357 +
358 +Interface autodisable if Config error
359 +CONFIG_ISDN_WITH_ABC_CONN_ERROR
360 +   This Option will detect an Device which generate Telephone
361 +   Cost but does not Function correctly because there are
362 +   Configerrors on one of the Site. In this Situation the
363 +   Interface will be marked as Unsuably for some time to do
364 +   not call every time this Site.
365 +
366 +   See "linux/Documentation/isdn/dw-abc-extension-howto.txt" 
367 +   for more Information
368 +
369 +UDP-Info-Support
370 +CONFIG_ISDN_WITH_ABC_UDP_CHECK
371 +   This is the Mainoption to Enable or Disable the UDP
372 +   Info Support. An Option to Controll ISDN-Interfaces
373 +   Remotely. For this very Complex thing take a look at
374 +
375 +   "linux/Documentation/isdn/dw-abc-extension-howto.txt" 
376 +   for more Information.
377 +
378 +UDP Hangup Support
379 +CONFIG_ISDN_WITH_ABC_UDP_CHECK_HANGUP
380 +
381 +   Sorry no more Information!
382 +
383 +   See "linux/Documentation/isdn/dw-abc-extension-howto.txt" 
384 +   for more Information
385 +   
386 +UDP Dial Support
387 +CONFIG_ISDN_WITH_ABC_UDP_CHECK_DIAL
388 +
389 +   Sorry no more Information!
390 +
391 +   See "linux/Documentation/isdn/dw-abc-extension-howto.txt" 
392 +   for more Information
393 +   
394 +Limit on the line frames to two
395 +CONFIG_ISDN_WITH_ABC_FRAME_LIMIT
396 +
397 +   This Option enables support for sending only 2 Pakets on
398 +   the Fly to the ISDN Driver. It is very usefull when you
399 +   will use the new RAW-IP Compression. Because of sending
400 +   Only 2 Pakets on the Fly makes the risk of overflowing
401 +   the ISDN Driver very smaller.
402 +
403 +   See "linux/Documentation/isdn/dw-abc-extension-howto.txt" 
404 +   for more Information
405 +
406 +Compression with RAWIP and X75I
407 +CONFIG_ISDN_WITH_ABC_RAWIPCOMPRESS
408 +
409 +   With this Option you have the ability to make Datacompression
410 +   on RAW-IP Lines. It is function on HDLC and X75I Connection,
411 +   but the Prefered L2-Protocol for Compression is X75I because
412 +   the HDLC Protocol have no Errorcorrection.
413 +
414 +   To Use this Option YOU MUST HAVE ENABLED THE OPTION:
415 +   Support synchronous PPP
416 +   and must load after loading the main isdndrivers the
417 +   Modul "isdn_bsdcomp".
418 +
419 +   See "linux/Documentation/isdn/dw-abc-extension-howto.txt" 
420 +   for more Information
421 +
422 Index: linux-2.4.35.4/drivers/isdn/Config.in
423 ===================================================================
424 --- linux-2.4.35.4.orig/drivers/isdn/Config.in  2007-12-15 05:19:39.438668519 +0100
425 +++ linux-2.4.35.4/drivers/isdn/Config.in       2007-12-15 05:19:55.491583323 +0100
426 @@ -4,11 +4,9 @@
427  
428  # only included if CONFIG_ISDN != n
429  
430 -define_bool CONFIG_ISDN_BOOL y
431  if [ "$CONFIG_INET" != "n" ]; then
432     bool '  Support synchronous PPP' CONFIG_ISDN_PPP
433     if [ "$CONFIG_ISDN_PPP" != "n" ]; then
434 -      dep_bool     '    PPP filtering for ISDN' CONFIG_IPPP_FILTER $CONFIG_FILTER
435        bool         '    Use VJ-compression with synchronous PPP' CONFIG_ISDN_PPP_VJ
436        bool         '    Support generic MP (RFC 1717)' CONFIG_ISDN_MPP
437        dep_tristate '    Support BSD compression' CONFIG_ISDN_PPP_BSDCOMP $CONFIG_ISDN
438 @@ -23,6 +21,30 @@
439  fi
440  
441  mainmenu_option next_comment
442 +comment 'ISDN abc-dw-extension'
443 +bool 'Enable isdn-abc-dw-extension' CONFIG_ISDN_WITH_ABC
444 +if [ "$CONFIG_ISDN_WITH_ABC" != "n" ]; then
445 +       bool '  Use D-Channel-Callback with Channel in use check' CONFIG_ISDN_WITH_ABC_CALLB
446 +       bool '  Enable Outgoing-EAZ-Support' CONFIG_ISDN_WITH_ABC_OUTGOING_EAZ
447 +       bool '  Enable LCR-Support (need isdnlog)' CONFIG_ISDN_WITH_ABC_LCR_SUPPORT
448 +       bool '  RX dont reset hanguptimeout' CONFIG_ISDN_WITH_ABC_RCV_NO_HUPTIMER
449 +       if [ "$CONFIG_EXPERIMENTAL" != "n" ]; then
450 +               bool '  Enable UDP-Info-Support' CONFIG_ISDN_WITH_ABC_UDP_CHECK
451 +               if [ "$CONFIG_ISDN_WITH_ABC_UDP_CHECK" != "n" ]; then
452 +                       bool '    Enable Hangup-Support with UDP-INFO' CONFIG_ISDN_WITH_ABC_UDP_CHECK_HANGUP
453 +                       bool '    Enable Dial-Support with UDP-INFO' CONFIG_ISDN_WITH_ABC_UDP_CHECK_DIAL
454 +               fi
455 +       fi
456 +
457 +       bool '  Skip channel if used external (dial only)' CONFIG_ISDN_WITH_ABC_CH_EXTINUSE
458 +       bool '  Support interface-auto-disable if config-error' CONFIG_ISDN_WITH_ABC_CONN_ERROR
459 +       if [ "$CONFIG_ISDN_PPP" != "n" ]; then
460 +               bool '  Enable Compression with rawip and x75i' CONFIG_ISDN_WITH_ABC_RAWIPCOMPRESS
461 +       fi
462 +fi
463 +endmenu
464 +
465 +mainmenu_option next_comment
466  comment 'ISDN feature submodules'
467     dep_tristate 'isdnloop support' CONFIG_ISDN_DRV_LOOP $CONFIG_ISDN
468     dep_tristate 'Support isdn diversion services' CONFIG_ISDN_DIVERSION $CONFIG_ISDN
469 @@ -34,7 +56,6 @@
470  comment 'Passive ISDN cards'
471  dep_tristate 'HiSax SiemensChipSet driver support' CONFIG_ISDN_DRV_HISAX $CONFIG_ISDN
472  if [ "$CONFIG_ISDN_DRV_HISAX" != "n" ]; then
473 -   define_bool CONFIG_ISDN_HISAX y
474     comment '  D-channel protocol features'
475     bool '  HiSax Support for EURO/DSS1' CONFIG_HISAX_EURO
476     if [ "$CONFIG_HISAX_EURO" != "n" ]; then
477 @@ -45,31 +66,28 @@
478     fi
479     bool '  HiSax Support for german 1TR6' CONFIG_HISAX_1TR6
480     bool '  HiSax Support for US NI1' CONFIG_HISAX_NI1
481 -   int  '  Maximum number of cards supported by HiSax' CONFIG_HISAX_MAX_CARDS 8
482     comment '  HiSax supported cards'
483 -   if [ "$CONFIG_ISA" != "n" ]; then
484 -      bool '  Teles 16.0/8.0' CONFIG_HISAX_16_0
485 -      bool '  Teles 16.3 or PNP or PCMCIA' CONFIG_HISAX_16_3
486 -      bool '  AVM A1 (Fritz)' CONFIG_HISAX_AVM_A1
487 -      bool '  ITK ix1-micro Revision 2' CONFIG_HISAX_IX1MICROR2
488 -      bool '  ASUSCOM ISA cards' CONFIG_HISAX_ASUSCOM
489 -      bool '  TELEINT cards' CONFIG_HISAX_TELEINT
490 -      bool '  HFC-S based cards' CONFIG_HISAX_HFCS
491 -      bool '  USR Sportster internal TA' CONFIG_HISAX_SPORTSTER
492 -      bool '  MIC card' CONFIG_HISAX_MIC
493 -      bool '  Siemens I-Surf card' CONFIG_HISAX_ISURF
494 -      bool '  HST Saphir card' CONFIG_HISAX_HSTSAPHIR
495 -   fi
496 +   bool '  Teles 16.0/8.0' CONFIG_HISAX_16_0
497 +   bool '  Teles 16.3 or PNP or PCMCIA' CONFIG_HISAX_16_3
498     bool '  Teles PCI' CONFIG_HISAX_TELESPCI 
499     bool '  Teles S0Box' CONFIG_HISAX_S0BOX 
500 +   bool '  AVM A1 (Fritz)' CONFIG_HISAX_AVM_A1
501     bool '  AVM PnP/PCI (Fritz!PnP/PCI)' CONFIG_HISAX_FRITZPCI
502     bool '  AVM A1 PCMCIA (Fritz)' CONFIG_HISAX_AVM_A1_PCMCIA
503     bool '  Elsa cards' CONFIG_HISAX_ELSA
504 +   bool '  ITK ix1-micro Revision 2' CONFIG_HISAX_IX1MICROR2
505     bool '  Eicon.Diehl Diva cards' CONFIG_HISAX_DIEHLDIVA
506 +   bool '  ASUSCOM ISA cards' CONFIG_HISAX_ASUSCOM
507 +   bool '  TELEINT cards' CONFIG_HISAX_TELEINT
508 +   bool '  HFC-S based cards' CONFIG_HISAX_HFCS
509     bool '  Sedlbauer cards' CONFIG_HISAX_SEDLBAUER
510 +   bool '  USR Sportster internal TA' CONFIG_HISAX_SPORTSTER
511 +   bool '  MIC card' CONFIG_HISAX_MIC
512     bool '  NETjet card' CONFIG_HISAX_NETJET
513     bool '  NETspider U card' CONFIG_HISAX_NETJET_U
514     bool '  Niccy PnP/PCI card' CONFIG_HISAX_NICCY
515 +   bool '  Siemens I-Surf card' CONFIG_HISAX_ISURF
516 +   bool '  HST Saphir card' CONFIG_HISAX_HSTSAPHIR
517     bool '  Telekom A4T card' CONFIG_HISAX_BKM_A4T
518     bool '  Scitel Quadro card' CONFIG_HISAX_SCT_QUADRO
519     bool '  Gazel cards' CONFIG_HISAX_GAZEL
520 @@ -78,20 +96,27 @@
521     bool '  HFC-S+, HFC-SP, HFC-PCMCIA cards' CONFIG_HISAX_HFC_SX
522     if [ "$CONFIG_EXPERIMENTAL" != "n" ]; then
523  #      bool '  TESTEMULATOR (EXPERIMENTAL)' CONFIG_HISAX_TESTEMU
524 -      bool '  Formula-n enter:now PCI card' CONFIG_HISAX_ENTERNOW_PCI
525        if [ "$ARCH" = "sparc" -o "$ARCH" = "sparc64" ]; then
526          bool '  Am7930' CONFIG_HISAX_AMD7930
527        fi
528     fi
529     bool '  HiSax debugging' CONFIG_HISAX_DEBUG
530  
531 -   dep_tristate 'Sedlbauer PCMCIA cards'                              CONFIG_HISAX_SEDLBAUER_CS  $CONFIG_ISDN_DRV_HISAX $CONFIG_PCMCIA
532 -   dep_tristate 'ELSA PCMCIA MicroLink cards'                         CONFIG_HISAX_ELSA_CS       $CONFIG_ISDN_DRV_HISAX $CONFIG_PCMCIA
533 -   dep_tristate 'AVM A1 PCMCIA cards'                                 CONFIG_HISAX_AVM_A1_CS     $CONFIG_ISDN_DRV_HISAX $CONFIG_PCMCIA $CONFIG_HISAX_AVM_A1_PCMCIA
534 -   dep_tristate 'ST5481 USB ISDN modem (EXPERIMENTAL)'                CONFIG_HISAX_ST5481        $CONFIG_ISDN_DRV_HISAX    $CONFIG_EXPERIMENTAL
535 -   dep_tristate 'AVM Fritz!Card PCI/PCIv2/PnP support (EXPERIMENTAL)' CONFIG_HISAX_FRITZ_PCIPNP  $CONFIG_ISDN_DRV_HISAX                $CONFIG_EXPERIMENTAL
536 -   dep_tristate 'Auerswald devices ISDN support'                      CONFIG_USB_AUERISDN        $CONFIG_ISDN_DRV_HISAX
537 +   dep_tristate 'Sedlbauer PCMCIA cards' CONFIG_HISAX_SEDLBAUER_CS $CONFIG_PCMCIA
538 +   dep_tristate 'ELSA PCMCIA MicroLink cards' CONFIG_HISAX_ELSA_CS $CONFIG_PCMCIA
539 +   dep_tristate 'Colognechip HFC-USB support' CONFIG_HISAX_HFC_USB_CS $CONFIG_HISAX $CONFIG_USB
540 +   dep_tristate 'ST5481 USB ISDN modem (EXPERIMENTAL)' CONFIG_HISAX_ST5481 $CONFIG_HISAX $CONFIG_USB $CONFIG_EXPERIMENTAL
541 +   dep_tristate 'Fritz!PCIv2 support (EXPERIMENTAL)' CONFIG_HISAX_FRITZ_PCIPNP $CONFIG_HISAX $CONFIG_EXPERIMENTAL
542  
543 +   if [ "$CONFIG_HISAX_SEDLBAUER_CS" != "n" ]; then
544 +      define_bool CONFIG_HISAX_SEDLBAUER y
545 +   fi
546 +   if [ "$CONFIG_HISAX_ELSA_CS" != "n" ]; then
547 +      define_bool CONFIG_HISAX_ELSA y
548 +   fi
549 +   if [ "$CONFIG_HISAX_HFC_USB_CS" != "n" ]; then
550 +      define_bool CONFIG_HISAX_HFC_USB y
551 +   fi
552  fi
553  endmenu
554  
555 Index: linux-2.4.35.4/drivers/isdn/Makefile
556 ===================================================================
557 --- linux-2.4.35.4.orig/drivers/isdn/Makefile   2007-12-15 05:19:39.446668974 +0100
558 +++ linux-2.4.35.4/drivers/isdn/Makefile        2007-12-15 05:19:55.495583552 +0100
559 @@ -2,7 +2,7 @@
560  
561  # The target object and module list name.
562  
563 -O_TARGET       := vmlinux-obj.o
564 +O_TARGET       := isdn.a
565  
566  # Objects that export symbols.
567  
568 @@ -32,9 +32,9 @@
569  
570  # Object files in subdirectories
571  
572 -mod-subdirs                            := avmb1 eicon hisax
573 +mod-subdirs                            := avmb1 eicon
574  subdir-$(CONFIG_ISDN_DIVERSION)                += divert
575 -subdir-$(CONFIG_ISDN_HISAX)            += hisax
576 +subdir-$(CONFIG_ISDN_DRV_HISAX)                += hisax
577  subdir-$(CONFIG_ISDN_DRV_ICN)          += icn
578  subdir-$(CONFIG_ISDN_DRV_PCBIT)                += pcbit
579  subdir-$(CONFIG_ISDN_DRV_SC)           += sc
580 Index: linux-2.4.35.4/drivers/isdn/act2000/act2000.h
581 ===================================================================
582 --- linux-2.4.35.4.orig/drivers/isdn/act2000/act2000.h  2007-12-15 05:19:39.450669203 +0100
583 +++ linux-2.4.35.4/drivers/isdn/act2000/act2000.h       2007-12-15 05:19:55.495583552 +0100
584 @@ -1,4 +1,4 @@
585 -/* $Id: act2000.h,v 1.1.4.1 2001/11/20 14:19:34 kai Exp $
586 +/* $Id$
587   *
588   * ISDN lowlevel-module for the IBM ISDN-S0 Active 2000.
589   *
590 @@ -178,19 +178,19 @@
591          char regname[35];                /* Name used for request_region     */
592  } act2000_card;
593  
594 -static inline void act2000_schedule_tx(act2000_card *card)
595 +extern __inline__ void act2000_schedule_tx(act2000_card *card)
596  {
597          queue_task(&card->snd_tq, &tq_immediate);
598          mark_bh(IMMEDIATE_BH);
599  }
600  
601 -static inline void act2000_schedule_rx(act2000_card *card)
602 +extern __inline__ void act2000_schedule_rx(act2000_card *card)
603  {
604          queue_task(&card->rcv_tq, &tq_immediate);
605          mark_bh(IMMEDIATE_BH);
606  }
607  
608 -static inline void act2000_schedule_poll(act2000_card *card)
609 +extern __inline__ void act2000_schedule_poll(act2000_card *card)
610  {
611          queue_task(&card->poll_tq, &tq_immediate);
612          mark_bh(IMMEDIATE_BH);
613 Index: linux-2.4.35.4/drivers/isdn/act2000/act2000_isa.c
614 ===================================================================
615 --- linux-2.4.35.4.orig/drivers/isdn/act2000/act2000_isa.c      2007-12-15 05:19:39.458669659 +0100
616 +++ linux-2.4.35.4/drivers/isdn/act2000/act2000_isa.c   2007-12-15 05:19:55.495583552 +0100
617 @@ -1,4 +1,4 @@
618 -/* $Id: act2000_isa.c,v 1.1.4.1 2001/11/20 14:19:34 kai Exp $
619 +/* $Id$
620   *
621   * ISDN lowlevel-module for the IBM ISDN-S0 Active 2000 (ISA-Version).
622   *
623 @@ -178,8 +178,7 @@
624                  card->flags &= ~ACT2000_FLAGS_PVALID;
625          }
626          if (!check_region(portbase, ISA_REGION)) {
627 -                if (request_region(portbase, ACT2000_PORTLEN, card->regname) == NULL)
628 -                       return -EIO;
629 +                request_region(portbase, ACT2000_PORTLEN, card->regname);
630                  card->port = portbase;
631                  card->flags |= ACT2000_FLAGS_PVALID;
632                  return 0;
633 @@ -341,6 +340,9 @@
634                 while (skb->len) {
635                         if (act2000_isa_writeb(card, *(skb->data))) {
636                                 /* Fifo is full, but more data to send */
637 +#if 0
638 +                               printk(KERN_DEBUG "act2000_isa_send: %d bytes\n", l);
639 +#endif
640                                 test_and_clear_bit(ACT2000_LOCK_TX, (void *) &card->ilock);
641                                 /* Schedule myself */
642                                 act2000_schedule_tx(card);
643 @@ -363,6 +365,9 @@
644                 } else
645                         dev_kfree_skb(skb);
646                 card->sbuf = NULL;
647 +#if 0
648 +               printk(KERN_DEBUG "act2000_isa_send: %d bytes\n", l);
649 +#endif
650         }
651  }
652  
653 Index: linux-2.4.35.4/drivers/isdn/act2000/act2000_isa.h
654 ===================================================================
655 --- linux-2.4.35.4.orig/drivers/isdn/act2000/act2000_isa.h      2007-12-15 05:19:39.466670114 +0100
656 +++ linux-2.4.35.4/drivers/isdn/act2000/act2000_isa.h   2007-12-15 05:19:55.495583552 +0100
657 @@ -1,4 +1,4 @@
658 -/* $Id: act2000_isa.h,v 1.1.4.1 2001/11/20 14:19:34 kai Exp $
659 +/* $Id$
660   *
661   * ISDN lowlevel-module for the IBM ISDN-S0 Active 2000 (ISA-Version).
662   *
663 Index: linux-2.4.35.4/drivers/isdn/act2000/capi.c
664 ===================================================================
665 --- linux-2.4.35.4.orig/drivers/isdn/act2000/capi.c     2007-12-15 05:19:39.474670572 +0100
666 +++ linux-2.4.35.4/drivers/isdn/act2000/capi.c  2007-12-15 05:19:55.495583552 +0100
667 @@ -1,4 +1,4 @@
668 -/* $Id: capi.c,v 1.1.4.1 2001/11/20 14:19:34 kai Exp $
669 +/* $Id$
670   *
671   * ISDN lowlevel-module for the IBM ISDN-S0 Active 2000.
672   * CAPI encoder/decoder
673 @@ -76,6 +76,10 @@
674         {{ 0x84, 0x03}, "DISCONNECT_B3_RESP"},
675         {{ 0x86, 0x03}, "DATA_B3_RESP"},
676         {{ 0xff, 0x03}, "MANUFACTURER_RESP"},
677 +#if 0
678 +/* CAPI 2.0 */
679 +       {{ 0x05, 0x80}, "LISTEN_REQ (CAPI 2.0)"},
680 +#endif
681  #endif
682         {{ 0x00, 0x00}, NULL},
683  };
684 Index: linux-2.4.35.4/drivers/isdn/act2000/capi.h
685 ===================================================================
686 --- linux-2.4.35.4.orig/drivers/isdn/act2000/capi.h     2007-12-15 05:19:39.478670799 +0100
687 +++ linux-2.4.35.4/drivers/isdn/act2000/capi.h  2007-12-15 05:19:55.499583778 +0100
688 @@ -1,4 +1,4 @@
689 -/* $Id: capi.h,v 1.1.4.1 2001/11/20 14:19:34 kai Exp $
690 +/* $Id$
691   *
692   * ISDN lowlevel-module for the IBM ISDN-S0 Active 2000.
693   *
694 @@ -294,6 +294,19 @@
695                         __u16 plci;
696                         __u16 info;
697                 } select_b3_protocol_conf;
698 +#if 0
699 +               struct listen_req {
700 +                       __u32 controller;
701 +                       __u32 infomask;  
702 +                       __u32 cipmask;
703 +                       __u32 cipmask2;
704 +                       __u16 dummy; /* 2 Length-bytes of 2 Structs MUST always be 0!!! */
705 +               } listen_req;
706 +               struct listen_conf {
707 +                       __u32  controller;
708 +                       __u16 info;
709 +               } listen_conf;
710 +#else
711                 struct listen_req {
712                         __u8  controller;
713                         __u32 infomask __attribute__ ((packed));  
714 @@ -304,6 +317,7 @@
715                         __u8  controller;
716                         __u16 info __attribute__ ((packed));
717                 } listen_conf;
718 +#endif
719                 struct data_b3_req {
720                         __u16 fakencci;
721                         __u16 datalen;
722 @@ -330,7 +344,7 @@
723         } msg;
724  } actcapi_msg;
725  
726 -static inline unsigned short
727 +extern __inline__ unsigned short
728  actcapi_nextsmsg(act2000_card *card)
729  {
730         unsigned long flags;
731 Index: linux-2.4.35.4/drivers/isdn/act2000/module.c
732 ===================================================================
733 --- linux-2.4.35.4.orig/drivers/isdn/act2000/module.c   2007-12-15 05:19:39.486671254 +0100
734 +++ linux-2.4.35.4/drivers/isdn/act2000/module.c        2007-12-15 05:19:55.499583778 +0100
735 @@ -1,4 +1,4 @@
736 -/* $Id: module.c,v 1.1.4.1 2001/11/20 14:19:34 kai Exp $
737 +/* $Id$
738   *
739   * ISDN lowlevel-module for the IBM ISDN-S0 Active 2000.
740   *
741 @@ -630,6 +630,10 @@
742          card->interface.features =
743                 ISDN_FEATURE_L2_X75I |
744                 ISDN_FEATURE_L2_HDLC |
745 +#if 0
746 +/* Not yet! New Firmware is on the way ... */
747 +               ISDN_FEATURE_L2_TRANS |
748 +#endif
749                 ISDN_FEATURE_L3_TRANS |
750                 ISDN_FEATURE_P_UNKNOWN;
751          card->interface.hl_hdrlen = 20;
752 @@ -843,6 +847,39 @@
753          }
754          printk(KERN_INFO "%s unloaded\n", DRIVERNAME);
755  }
756 +#if 0
757 +#ifndef MODULE
758 +void
759 +act2000_setup(char *str, int *ints)
760 +{
761 +        int i, j, argc, port, irq, bus;
762 +       
763 +        argc = ints[0];
764 +        i = 1;
765 +        if (argc)
766 +                while (argc) {
767 +                        port = irq = -1;
768 +                       bus = 0;
769 +                        if (argc) {
770 +                                bus = ints[i];
771 +                                i++;
772 +                                argc--;
773 +                        }
774 +                        if (argc) {
775 +                                port = ints[i];
776 +                                i++;
777 +                                argc--;
778 +                        }
779 +                        if (argc) {
780 +                                irq = ints[i];
781 +                                i++;
782 +                                argc--;
783 +                        }
784 +                       act2000_addcard(bus, port, irq, act_id);
785 +               }
786 +}
787 +#endif
788 +#endif
789  
790  module_init(act2000_init);
791  module_exit(act2000_exit);
792 Index: linux-2.4.35.4/drivers/isdn/avmb1/avm_cs.c
793 ===================================================================
794 --- linux-2.4.35.4.orig/drivers/isdn/avmb1/avm_cs.c     2007-12-15 05:19:39.494671712 +0100
795 +++ linux-2.4.35.4/drivers/isdn/avmb1/avm_cs.c  2007-12-15 05:19:55.499583778 +0100
796 @@ -1,4 +1,4 @@
797 -/* $Id: avm_cs.c,v 1.1.4.1 2001/11/20 14:19:34 kai Exp $
798 +/* $Id: avm_cs.c,v 1.6 2001/09/24 13:22:44 kai Exp $
799   *
800   * A PCMCIA client driver for AVM B1/M1/M2
801   *
802 Index: linux-2.4.35.4/drivers/isdn/avmb1/avmcard.h
803 ===================================================================
804 --- linux-2.4.35.4.orig/drivers/isdn/avmb1/avmcard.h    2007-12-15 05:19:39.502672167 +0100
805 +++ linux-2.4.35.4/drivers/isdn/avmb1/avmcard.h 2007-12-15 05:19:55.499583778 +0100
806 @@ -1,4 +1,4 @@
807 -/* $Id: avmcard.h,v 1.1.4.1 2001/11/20 14:19:34 kai Exp $
808 +/* $Id: avmcard.h,v 1.12 2001/09/24 13:22:44 kai Exp $
809   *
810   * Copyright 1999 by Carsten Paeth <calle@calle.de>
811   *
812 Index: linux-2.4.35.4/drivers/isdn/avmb1/b1.c
813 ===================================================================
814 --- linux-2.4.35.4.orig/drivers/isdn/avmb1/b1.c 2007-12-15 05:19:39.510672623 +0100
815 +++ linux-2.4.35.4/drivers/isdn/avmb1/b1.c      2007-12-15 05:19:55.503584007 +0100
816 @@ -1,4 +1,4 @@
817 -/* $Id: b1.c,v 1.1.4.1 2001/11/20 14:19:34 kai Exp $
818 +/* $Id: b1.c,v 1.26 2001/09/24 13:22:44 kai Exp $
819   * 
820   * Common module for AVM B1 cards.
821   * 
822 @@ -20,6 +20,7 @@
823  #include <linux/kernelcapi.h>
824  #include <asm/io.h>
825  #include <linux/init.h>
826 +#include <linux/isdn_compat.h>
827  #include <asm/uaccess.h>
828  #include <linux/netdevice.h>
829  #include "capilli.h"
830 @@ -27,7 +28,7 @@
831  #include "capicmd.h"
832  #include "capiutil.h"
833  
834 -static char *revision = "$Revision: 1.1.4.1 $";
835 +static char *revision = "$Revision: 1.26 $";
836  
837  /* ------------------------------------------------------------- */
838  
839 Index: linux-2.4.35.4/drivers/isdn/avmb1/b1dma.c
840 ===================================================================
841 --- linux-2.4.35.4.orig/drivers/isdn/avmb1/b1dma.c      2007-12-15 05:19:39.514672852 +0100
842 +++ linux-2.4.35.4/drivers/isdn/avmb1/b1dma.c   2007-12-15 05:19:55.503584007 +0100
843 @@ -1,4 +1,4 @@
844 -/* $Id: b1dma.c,v 1.1.4.1 2001/11/20 14:19:34 kai Exp $
845 +/* $Id: b1dma.c,v 1.18 2001/09/24 13:22:44 kai Exp $
846   * 
847   * Common module for AVM B1 cards that support dma with AMCC
848   * 
849 @@ -21,6 +21,7 @@
850  #include <linux/kernelcapi.h>
851  #include <asm/io.h>
852  #include <linux/init.h>
853 +#include <linux/isdn_compat.h>
854  #include <asm/uaccess.h>
855  #include <linux/netdevice.h>
856  #include "capilli.h"
857 @@ -28,7 +29,11 @@
858  #include "capicmd.h"
859  #include "capiutil.h"
860  
861 -static char *revision = "$Revision: 1.1.4.1 $";
862 +#if BITS_PER_LONG != 32
863 +#error FIXME: driver requires 32-bit platform
864 +#endif
865 +
866 +static char *revision = "$Revision: 1.18 $";
867  
868  /* ------------------------------------------------------------- */
869  
870 @@ -851,7 +856,7 @@
871         __u8 flag;
872         int len = 0;
873         char *s;
874 -       u_long txaddr, txlen, rxaddr, rxlen, csr;
875 +       __u32 txaddr, txlen, rxaddr, rxlen, csr;
876  
877         len += sprintf(page+len, "%-16s %s\n", "name", card->name);
878         len += sprintf(page+len, "%-16s 0x%x\n", "io", card->port);
879 @@ -907,12 +912,12 @@
880         save_flags(flags);
881         cli();
882  
883 -       txaddr = (u_long)phys_to_virt(b1dmainmeml(card->mbase+0x2c));
884 -       txaddr -= (u_long)card->dma->sendbuf;
885 +       txaddr = (__u32)phys_to_virt(b1dmainmeml(card->mbase+0x2c));
886 +       txaddr -= (__u32)card->dma->sendbuf;
887         txlen  = b1dmainmeml(card->mbase+0x30);
888  
889 -       rxaddr = (u_long)phys_to_virt(b1dmainmeml(card->mbase+0x24));
890 -       rxaddr -= (u_long)card->dma->recvbuf;
891 +       rxaddr = (__u32)phys_to_virt(b1dmainmeml(card->mbase+0x24));
892 +       rxaddr -= (__u32)card->dma->recvbuf;
893         rxlen  = b1dmainmeml(card->mbase+0x28);
894  
895         csr  = b1dmainmeml(card->mbase+AMCC_INTCSR);
896 Index: linux-2.4.35.4/drivers/isdn/avmb1/b1isa.c
897 ===================================================================
898 --- linux-2.4.35.4.orig/drivers/isdn/avmb1/b1isa.c      2007-12-15 05:19:39.522673307 +0100
899 +++ linux-2.4.35.4/drivers/isdn/avmb1/b1isa.c   2007-12-15 05:19:55.503584007 +0100
900 @@ -1,4 +1,4 @@
901 -/* $Id: b1isa.c,v 1.1.4.1 2001/11/20 14:19:34 kai Exp $
902 +/* $Id: b1isa.c,v 1.14 2001/09/24 13:22:44 kai Exp $
903   * 
904   * Module for AVM B1 ISA-card.
905   * 
906 @@ -19,12 +19,13 @@
907  #include <linux/capi.h>
908  #include <linux/init.h>
909  #include <asm/io.h>
910 +#include <linux/isdn_compat.h>
911  #include "capicmd.h"
912  #include "capiutil.h"
913  #include "capilli.h"
914  #include "avmcard.h"
915  
916 -static char *revision = "$Revision: 1.1.4.1 $";
917 +static char *revision = "$Revision: 1.14 $";
918  
919  /* ------------------------------------------------------------- */
920  
921 Index: linux-2.4.35.4/drivers/isdn/avmb1/b1pci.c
922 ===================================================================
923 --- linux-2.4.35.4.orig/drivers/isdn/avmb1/b1pci.c      2007-12-15 05:19:39.530673763 +0100
924 +++ linux-2.4.35.4/drivers/isdn/avmb1/b1pci.c   2007-12-15 05:19:55.503584007 +0100
925 @@ -1,4 +1,4 @@
926 -/* $Id: b1pci.c,v 1.1.4.1 2001/11/20 14:19:34 kai Exp $
927 +/* $Id: b1pci.c,v 1.40 2001/09/24 13:22:44 kai Exp $
928   * 
929   * Module for AVM B1 PCI-card.
930   * 
931 @@ -21,21 +21,24 @@
932  #include <linux/capi.h>
933  #include <asm/io.h>
934  #include <linux/init.h>
935 +#include <linux/isdn_compat.h>
936  #include "capicmd.h"
937  #include "capiutil.h"
938  #include "capilli.h"
939  #include "avmcard.h"
940  
941 -static char *revision = "$Revision: 1.1.4.1 $";
942 +static char *revision = "$Revision: 1.40 $";
943  
944  /* ------------------------------------------------------------- */
945  
946 +#ifndef COMPAT_HAS_2_2_PCI
947  static struct pci_device_id b1pci_pci_tbl[] __initdata = {
948         { PCI_VENDOR_ID_AVM, PCI_DEVICE_ID_AVM_B1, PCI_ANY_ID, PCI_ANY_ID },
949         { }                             /* Terminating entry */
950  };
951  
952  MODULE_DEVICE_TABLE(pci, b1pci_pci_tbl);
953 +#endif
954  MODULE_DESCRIPTION("CAPI4Linux: Driver for AVM B1 PCI card");
955  MODULE_AUTHOR("Carsten Paeth");
956  MODULE_LICENSE("GPL");
957 @@ -416,14 +419,14 @@
958         }
959         param.irq = dev->irq;
960  
961 -       if (pci_resource_start(dev, 2)) { /* B1 PCI V4 */
962 +       if (pci_resource_start_io(dev, 2)) { /* B1 PCI V4 */
963  #ifdef CONFIG_ISDN_DRV_AVMB1_B1PCIV4
964                 driver = &b1pciv4_driver;
965  
966                 pci_set_master(dev);
967  #endif
968 -               param.membase = pci_resource_start(dev, 0);
969 -               param.port = pci_resource_start(dev, 2);
970 +               param.membase = pci_resource_start_mem(dev, 0);
971 +               param.port = pci_resource_start_io(dev, 2);
972  
973                 printk(KERN_INFO
974                 "%s: PCI BIOS reports AVM-B1 V4 at i/o %#x, irq %d, mem %#x\n",
975 @@ -440,7 +443,7 @@
976                 }
977         } else {
978                 param.membase = 0;
979 -               param.port = pci_resource_start(dev, 1);
980 +               param.port = pci_resource_start_io(dev, 1);
981  
982                 printk(KERN_INFO
983                 "%s: PCI BIOS reports AVM-B1 at i/o %#x, irq %d\n",
984 Index: linux-2.4.35.4/drivers/isdn/avmb1/b1pcmcia.c
985 ===================================================================
986 --- linux-2.4.35.4.orig/drivers/isdn/avmb1/b1pcmcia.c   2007-12-15 05:19:39.538674218 +0100
987 +++ linux-2.4.35.4/drivers/isdn/avmb1/b1pcmcia.c        2007-12-15 05:19:55.503584007 +0100
988 @@ -1,4 +1,4 @@
989 -/* $Id: b1pcmcia.c,v 1.1.4.1 2001/11/20 14:19:34 kai Exp $
990 +/* $Id: b1pcmcia.c,v 1.17 2001/09/24 13:22:44 kai Exp $
991   * 
992   * Module for AVM B1/M1/M2 PCMCIA-card.
993   * 
994 @@ -25,7 +25,7 @@
995  #include "capilli.h"
996  #include "avmcard.h"
997  
998 -static char *revision = "$Revision: 1.1.4.1 $";
999 +static char *revision = "$Revision: 1.17 $";
1000  
1001  /* ------------------------------------------------------------- */
1002  
1003 Index: linux-2.4.35.4/drivers/isdn/avmb1/c4.c
1004 ===================================================================
1005 --- linux-2.4.35.4.orig/drivers/isdn/avmb1/c4.c 2007-12-15 05:19:39.542674447 +0100
1006 +++ linux-2.4.35.4/drivers/isdn/avmb1/c4.c      2007-12-15 05:19:55.507584236 +0100
1007 @@ -1,4 +1,4 @@
1008 -/* $Id: c4.c,v 1.1.4.1 2001/11/20 14:19:34 kai Exp $
1009 +/* $Id: c4.c,v 1.38 2001/09/24 13:22:44 kai Exp $
1010   * 
1011   * Module for AVM C4 & C2 card.
1012   * 
1013 @@ -18,6 +18,7 @@
1014  #include <linux/interrupt.h>
1015  #include <linux/ioport.h>
1016  #include <linux/pci.h>
1017 +#include <linux/isdn_compat.h>
1018  #include <linux/capi.h>
1019  #include <linux/kernelcapi.h>
1020  #include <linux/init.h>
1021 @@ -30,7 +31,7 @@
1022  #include "capilli.h"
1023  #include "avmcard.h"
1024  
1025 -static char *revision = "$Revision: 1.1.4.1 $";
1026 +static char *revision = "$Revision: 1.38 $";
1027  
1028  #undef CONFIG_C4_DEBUG
1029  #undef CONFIG_C4_POLLDEBUG
1030 @@ -39,6 +40,7 @@
1031  
1032  static int suppress_pollack;
1033  
1034 +#ifndef COMPAT_HAS_2_2_PCI
1035  static struct pci_device_id c4_pci_tbl[] __initdata = {
1036         { PCI_VENDOR_ID_DEC,PCI_DEVICE_ID_DEC_21285, PCI_VENDOR_ID_AVM, PCI_DEVICE_ID_AVM_C4 },
1037         { PCI_VENDOR_ID_DEC,PCI_DEVICE_ID_DEC_21285, PCI_VENDOR_ID_AVM, PCI_DEVICE_ID_AVM_C2 },
1038 @@ -46,6 +48,7 @@
1039  };
1040  
1041  MODULE_DEVICE_TABLE(pci, c4_pci_tbl);
1042 +#endif
1043  MODULE_DESCRIPTION("CAPI4Linux: Driver for AVM C2/C4 cards");
1044  MODULE_AUTHOR("Carsten Paeth");
1045  MODULE_LICENSE("GPL");
1046 @@ -1332,9 +1335,9 @@
1047                 }
1048                 pci_set_master(dev);
1049  
1050 -               param.port = pci_resource_start(dev, 1);
1051 +               param.port = pci_resource_start_io(dev, 1);
1052                 param.irq = dev->irq;
1053 -               param.membase = pci_resource_start(dev, 0);
1054 +               param.membase = pci_resource_start_mem(dev, 0);
1055    
1056                 printk(KERN_INFO
1057                         "%s: PCI BIOS reports AVM-C%d at i/o %#x, irq %d, mem %#x\n",
1058 Index: linux-2.4.35.4/drivers/isdn/avmb1/capi.c
1059 ===================================================================
1060 --- linux-2.4.35.4.orig/drivers/isdn/avmb1/capi.c       2007-12-15 05:19:39.550674902 +0100
1061 +++ linux-2.4.35.4/drivers/isdn/avmb1/capi.c    2007-12-15 05:19:55.507584236 +0100
1062 @@ -1,4 +1,4 @@
1063 -/* $Id: capi.c,v 1.1.4.2 2001/12/09 18:45:13 kai Exp $
1064 +/* $Id: capi.c,v 1.59 2001/11/07 22:35:48 kai Exp $
1065   *
1066   * CAPI 2.0 Interface for Linux
1067   *
1068 @@ -23,6 +23,7 @@
1069  #include <linux/smp_lock.h>
1070  #include <linux/timer.h>
1071  #include <linux/wait.h>
1072 +#include <linux/isdn_compat.h>
1073  #ifdef CONFIG_ISDN_CAPI_MIDDLEWARE
1074  #include <linux/tty.h>
1075  #ifdef CONFIG_PPP
1076 @@ -30,6 +31,9 @@
1077  #include <linux/ppp_defs.h>
1078  #include <linux/if_ppp.h>
1079  #undef CAPI_PPP_ON_RAW_DEVICE
1080 +#ifdef CAPI_PPP_ON_RAW_DEVICE
1081 +#include <linux/ppp_channel.h>
1082 +#endif /* CAPI_PPP_ON_RAW_DEVICE */
1083  #endif /* CONFIG_PPP */
1084  #endif /* CONFIG_ISDN_CAPI_MIDDLEWARE */
1085  #include <linux/skbuff.h>
1086 @@ -38,14 +42,16 @@
1087  #include <linux/capi.h>
1088  #include <linux/kernelcapi.h>
1089  #include <linux/init.h>
1090 +#ifdef HAVE_DEVFS_FS
1091  #include <linux/devfs_fs_kernel.h>
1092 +#endif /* HAVE_DEVFS_FS */
1093  #include "capiutil.h"
1094  #include "capicmd.h"
1095  #if defined(CONFIG_ISDN_CAPI_CAPIFS) || defined(CONFIG_ISDN_CAPI_CAPIFS_MODULE)
1096  #include "capifs.h"
1097  #endif
1098  
1099 -static char *revision = "$Revision: 1.1.4.2 $";
1100 +static char *revision = "$Revision: 1.59 $";
1101  
1102  MODULE_DESCRIPTION("CAPI4Linux: Userspace /dev/capi20 interface");
1103  MODULE_AUTHOR("Carsten Paeth");
1104 @@ -87,10 +93,10 @@
1105         struct capincci  *nccip;
1106         unsigned int      minor;
1107  
1108 -       u16              applid;
1109 -       u32              ncci;
1110 -       u16              datahandle;
1111 -       u16              msgid;
1112 +       __u16            applid;
1113 +       __u32            ncci;
1114 +       __u16            datahandle;
1115 +       __u16            msgid;
1116  
1117         struct file      *file;
1118         struct tty_struct *tty;
1119 @@ -112,16 +118,22 @@
1120         /* transmit path */
1121         struct datahandle_queue {
1122                     struct datahandle_queue *next;
1123 -                   u16                      datahandle;
1124 +                   __u16                    datahandle;
1125         } *ackqueue;
1126         int nack;
1127  
1128 +#ifdef CAPI_PPP_ON_RAW_DEVICE
1129 +       /* interface to generic ppp layer */
1130 +       struct ppp_channel      chan;
1131 +       int                     chan_connected;
1132 +       int                     chan_index;
1133 +#endif
1134  };
1135  #endif /* CONFIG_ISDN_CAPI_MIDDLEWARE */
1136  
1137  struct capincci {
1138         struct capincci *next;
1139 -       u32              ncci;
1140 +       __u32            ncci;
1141         struct capidev  *cdev;
1142  #ifdef CONFIG_ISDN_CAPI_MIDDLEWARE
1143         struct capiminor *minorp;
1144 @@ -131,8 +143,8 @@
1145  struct capidev {
1146         struct capidev *next;
1147         struct file    *file;
1148 -       u16             applid;
1149 -       u16             errcode;
1150 +       __u16           applid;
1151 +       __u16           errcode;
1152         unsigned int    minor;
1153         unsigned        userflags;
1154  
1155 @@ -156,22 +168,28 @@
1156  static struct capiminor *minors = 0;
1157  #endif /* CONFIG_ISDN_CAPI_MIDDLEWARE */
1158  
1159 +#ifdef COMPAT_HAS_kmem_cache
1160  static kmem_cache_t *capidev_cachep = 0;
1161  static kmem_cache_t *capincci_cachep = 0;
1162  #ifdef CONFIG_ISDN_CAPI_MIDDLEWARE
1163  static kmem_cache_t *capiminor_cachep = 0;
1164  static kmem_cache_t *capidh_cachep = 0;
1165  #endif /* CONFIG_ISDN_CAPI_MIDDLEWARE */
1166 +#endif
1167  
1168  #ifdef CONFIG_ISDN_CAPI_MIDDLEWARE
1169  /* -------- datahandles --------------------------------------------- */
1170  
1171 -static int capincci_add_ack(struct capiminor *mp, u16 datahandle)
1172 +int capincci_add_ack(struct capiminor *mp, __u16 datahandle)
1173  {
1174         struct datahandle_queue *n, **pp;
1175  
1176         n = (struct datahandle_queue *)
1177 +#ifdef COMPAT_HAS_kmem_cache
1178         kmem_cache_alloc(capidh_cachep, GFP_ATOMIC);
1179 +#else
1180 +       kmalloc(sizeof(struct datahandle_queue), GFP_ATOMIC);
1181 +#endif
1182         if (!n) {
1183            printk(KERN_ERR "capi: alloc datahandle failed\n");
1184            return -1;
1185 @@ -184,7 +202,7 @@
1186         return 0;
1187  }
1188  
1189 -static int capiminor_del_ack(struct capiminor *mp, u16 datahandle)
1190 +int capiminor_del_ack(struct capiminor *mp, __u16 datahandle)
1191  {
1192         struct datahandle_queue **pp, *p;
1193  
1194 @@ -192,7 +210,11 @@
1195                 if ((*pp)->datahandle == datahandle) {
1196                         p = *pp;
1197                         *pp = (*pp)->next;
1198 +#ifdef COMPAT_HAS_kmem_cache
1199                         kmem_cache_free(capidh_cachep, p);
1200 +#else
1201 +                       kfree(p);
1202 +#endif
1203                         mp->nack--;
1204                         return 0;
1205                 }
1206 @@ -200,7 +222,7 @@
1207         return -1;
1208  }
1209  
1210 -static void capiminor_del_all_ack(struct capiminor *mp)
1211 +void capiminor_del_all_ack(struct capiminor *mp)
1212  {
1213         struct datahandle_queue **pp, *p;
1214  
1215 @@ -208,7 +230,11 @@
1216         while (*pp) {
1217                 p = *pp;
1218                 *pp = (*pp)->next;
1219 +#ifdef COMPAT_HAS_kmem_cache
1220                 kmem_cache_free(capidh_cachep, p);
1221 +#else
1222 +               kfree(p);
1223 +#endif
1224                 mp->nack--;
1225         }
1226  }
1227 @@ -216,13 +242,17 @@
1228  
1229  /* -------- struct capiminor ---------------------------------------- */
1230  
1231 -static struct capiminor *capiminor_alloc(u16 applid, u32 ncci)
1232 +struct capiminor *capiminor_alloc(__u16 applid, __u32 ncci)
1233  {
1234         struct capiminor *mp, **pp;
1235          unsigned int minor = 0;
1236  
1237         MOD_INC_USE_COUNT;
1238 +#ifdef COMPAT_HAS_kmem_cache
1239         mp = (struct capiminor *)kmem_cache_alloc(capiminor_cachep, GFP_ATOMIC);
1240 +#else
1241 +       mp = (struct capiminor *)kmalloc(sizeof(struct capiminor), GFP_ATOMIC);
1242 +#endif
1243         if (!mp) {
1244                 MOD_DEC_USE_COUNT;
1245                 printk(KERN_ERR "capi: can't alloc capiminor\n");
1246 @@ -257,7 +287,7 @@
1247         return mp;
1248  }
1249  
1250 -static void capiminor_free(struct capiminor *mp)
1251 +void capiminor_free(struct capiminor *mp)
1252  {
1253         struct capiminor **pp;
1254  
1255 @@ -271,7 +301,11 @@
1256                         skb_queue_purge(&mp->inqueue);
1257                         skb_queue_purge(&mp->outqueue);
1258                         capiminor_del_all_ack(mp);
1259 +#ifdef COMPAT_HAS_kmem_cache
1260                         kmem_cache_free(capiminor_cachep, mp);
1261 +#else
1262 +                       kfree(mp);
1263 +#endif
1264                         MOD_DEC_USE_COUNT;
1265  #ifdef _DEBUG_REFCOUNT
1266                         printk(KERN_DEBUG "capiminor_free %d\n", GET_USE_COUNT(THIS_MODULE));
1267 @@ -283,7 +317,7 @@
1268         }
1269  }
1270  
1271 -static struct capiminor *capiminor_find(unsigned int minor)
1272 +struct capiminor *capiminor_find(unsigned int minor)
1273  {
1274         struct capiminor *p;
1275         for (p = minors; p && p->minor != minor; p = p->next)
1276 @@ -294,7 +328,7 @@
1277  
1278  /* -------- struct capincci ----------------------------------------- */
1279  
1280 -static struct capincci *capincci_alloc(struct capidev *cdev, u32 ncci)
1281 +static struct capincci *capincci_alloc(struct capidev *cdev, __u32 ncci)
1282  {
1283         struct capincci *np, **pp;
1284  #ifdef CONFIG_ISDN_CAPI_MIDDLEWARE
1285 @@ -302,7 +336,11 @@
1286         kdev_t kdev;
1287  #endif /* CONFIG_ISDN_CAPI_MIDDLEWARE */
1288  
1289 +#ifdef COMPAT_HAS_kmem_cache
1290         np = (struct capincci *)kmem_cache_alloc(capincci_cachep, GFP_ATOMIC);
1291 +#else
1292 +       np = (struct capincci *)kmalloc(sizeof(struct capincci), GFP_ATOMIC);
1293 +#endif
1294         if (!np)
1295                 return 0;
1296         memset(np, 0, sizeof(struct capincci));
1297 @@ -331,7 +369,7 @@
1298          return np;
1299  }
1300  
1301 -static void capincci_free(struct capidev *cdev, u32 ncci)
1302 +static void capincci_free(struct capidev *cdev, __u32 ncci)
1303  {
1304         struct capincci *np, **pp;
1305  #ifdef CONFIG_ISDN_CAPI_MIDDLEWARE
1306 @@ -367,7 +405,11 @@
1307                                 }
1308                         }
1309  #endif /* CONFIG_ISDN_CAPI_MIDDLEWARE */
1310 +#ifdef COMPAT_HAS_kmem_cache
1311                         kmem_cache_free(capincci_cachep, np);
1312 +#else
1313 +                       kfree(np);
1314 +#endif
1315                         if (*pp == 0) return;
1316                 } else {
1317                         pp = &(*pp)->next;
1318 @@ -375,7 +417,7 @@
1319         }
1320  }
1321  
1322 -static struct capincci *capincci_find(struct capidev *cdev, u32 ncci)
1323 +struct capincci *capincci_find(struct capidev *cdev, __u32 ncci)
1324  {
1325         struct capincci *p;
1326  
1327 @@ -393,7 +435,11 @@
1328         struct capidev *cdev;
1329         struct capidev **pp;
1330  
1331 +#ifdef COMPAT_HAS_kmem_cache
1332         cdev = (struct capidev *)kmem_cache_alloc(capidev_cachep, GFP_KERNEL);
1333 +#else
1334 +       cdev = (struct capidev *)kmalloc(sizeof(struct capidev), GFP_KERNEL);
1335 +#endif
1336         if (!cdev)
1337                 return 0;
1338         memset(cdev, 0, sizeof(struct capidev));
1339 @@ -423,10 +469,14 @@
1340         if (*pp)
1341                 *pp = cdev->next;
1342  
1343 +#ifdef COMPAT_HAS_kmem_cache
1344         kmem_cache_free(capidev_cachep, cdev);
1345 +#else
1346 +       kfree(cdev);
1347 +#endif
1348  }
1349  
1350 -static struct capidev *capidev_find(u16 applid)
1351 +static struct capidev *capidev_find(__u16 applid)
1352  {
1353         struct capidev *p;
1354         for (p=capidev_openlist; p; p = p->next) {
1355 @@ -439,13 +489,13 @@
1356  #ifdef CONFIG_ISDN_CAPI_MIDDLEWARE
1357  /* -------- handle data queue --------------------------------------- */
1358  
1359 -static struct sk_buff *
1360 +struct sk_buff *
1361  gen_data_b3_resp_for(struct capiminor *mp, struct sk_buff *skb)
1362  {
1363         struct sk_buff *nskb;
1364         nskb = alloc_skb(CAPI_DATA_B3_RESP_LEN, GFP_ATOMIC);
1365         if (nskb) {
1366 -               u16 datahandle = CAPIMSG_U16(skb->data,CAPIMSG_BASELEN+4+4+2);
1367 +               __u16 datahandle = CAPIMSG_U16(skb->data,CAPIMSG_BASELEN+4+4+2);
1368                 unsigned char *s = skb_put(nskb, CAPI_DATA_B3_RESP_LEN);
1369                 capimsg_setu16(s, 0, CAPI_DATA_B3_RESP_LEN);
1370                 capimsg_setu16(s, 2, mp->applid);
1371 @@ -458,11 +508,11 @@
1372         return nskb;
1373  }
1374  
1375 -static int handle_recv_skb(struct capiminor *mp, struct sk_buff *skb)
1376 +int handle_recv_skb(struct capiminor *mp, struct sk_buff *skb)
1377  {
1378         struct sk_buff *nskb;
1379         unsigned int datalen;
1380 -       u16 errcode, datahandle;
1381 +       __u16 errcode, datahandle;
1382  
1383         datalen = skb->len - CAPIMSG_LEN(skb->data);
1384         if (mp->tty) {
1385 @@ -504,6 +554,28 @@
1386                 kfree_skb(skb);
1387                 return 0;
1388  
1389 +#ifdef CAPI_PPP_ON_RAW_DEVICE
1390 +       } else if (mp->chan_connected) {
1391 +               if ((nskb = gen_data_b3_resp_for(mp, skb)) == 0) {
1392 +                       printk(KERN_ERR "capi: gen_data_b3_resp failed\n");
1393 +                       return -1;
1394 +               }
1395 +               datahandle = CAPIMSG_U16(skb->data,CAPIMSG_BASELEN+4);
1396 +               errcode = (*capifuncs->capi_put_message)(mp->applid, nskb);
1397 +               if (errcode != CAPI_NOERROR) {
1398 +                       printk(KERN_ERR "capi: send DATA_B3_RESP failed=%x\n",
1399 +                                       errcode);
1400 +                       kfree_skb(nskb);
1401 +                       return -1;
1402 +               }
1403 +               (void)skb_pull(skb, CAPIMSG_LEN(skb->data));
1404 +#ifdef _DEBUG_DATAFLOW
1405 +               printk(KERN_DEBUG "capi: DATA_B3_RESP %u len=%d => ppp\n",
1406 +                                       datahandle, skb->len);
1407 +#endif
1408 +               ppp_input(&mp->chan, skb);
1409 +               return 0;
1410 +#endif
1411         } else if (mp->file) {
1412                 if (skb_queue_len(&mp->recvqueue) > CAPINC_MAX_RECVQUEUE) {
1413  #if defined(_DEBUG_DATAFLOW) || defined(_DEBUG_TTYFUNCS)
1414 @@ -538,7 +610,7 @@
1415         return -1;
1416  }
1417  
1418 -static void handle_minor_recv(struct capiminor *mp)
1419 +void handle_minor_recv(struct capiminor *mp)
1420  {
1421         struct sk_buff *skb;
1422         while ((skb = skb_dequeue(&mp->inqueue)) != 0) {
1423 @@ -552,13 +624,13 @@
1424         }
1425  }
1426  
1427 -static int handle_minor_send(struct capiminor *mp)
1428 +int handle_minor_send(struct capiminor *mp)
1429  {
1430         struct sk_buff *skb;
1431 -       u16 len;
1432 +       __u16 len;
1433         int count = 0;
1434 -       u16 errcode;
1435 -       u16 datahandle;
1436 +       __u16 errcode;
1437 +       __u16 datahandle;
1438  
1439         if (mp->tty && mp->ttyoutstop) {
1440  #if defined(_DEBUG_DATAFLOW) || defined(_DEBUG_TTYFUNCS)
1441 @@ -569,7 +641,7 @@
1442  
1443         while ((skb = skb_dequeue(&mp->outqueue)) != 0) {
1444                 datahandle = mp->datahandle;
1445 -               len = (u16)skb->len;
1446 +               len = (__u16)skb->len;
1447                 skb_push(skb, CAPI_DATA_B3_REQ_LEN);
1448                 memset(skb->data, 0, CAPI_DATA_B3_REQ_LEN);
1449                 capimsg_setu16(skb->data, 0, CAPI_DATA_B3_REQ_LEN);
1450 @@ -578,7 +650,7 @@
1451                 capimsg_setu8 (skb->data, 5, CAPI_REQ);
1452                 capimsg_setu16(skb->data, 6, mp->msgid++);
1453                 capimsg_setu32(skb->data, 8, mp->ncci); /* NCCI */
1454 -               capimsg_setu32(skb->data, 12, (u32) skb->data); /* Data32 */
1455 +               capimsg_setu32(skb->data, 12, (__u32) skb->data); /* Data32 */
1456                 capimsg_setu16(skb->data, 16, len);     /* Data length */
1457                 capimsg_setu16(skb->data, 18, datahandle);
1458                 capimsg_setu16(skb->data, 20, 0);       /* Flags */
1459 @@ -620,16 +692,16 @@
1460  #endif /* CONFIG_ISDN_CAPI_MIDDLEWARE */
1461  /* -------- function called by lower level -------------------------- */
1462  
1463 -static void capi_signal(u16 applid, void *param)
1464 +static void capi_signal(__u16 applid, void *param)
1465  {
1466         struct capidev *cdev = (struct capidev *)param;
1467  #ifdef CONFIG_ISDN_CAPI_MIDDLEWARE
1468         struct capiminor *mp;
1469 -       u16 datahandle;
1470 +       __u16 datahandle;
1471  #endif /* CONFIG_ISDN_CAPI_MIDDLEWARE */
1472         struct capincci *np;
1473         struct sk_buff *skb = 0;
1474 -       u32 ncci;
1475 +       __u32 ncci;
1476  
1477         (void) (*capifuncs->capi_get_message) (applid, &skb);
1478         if (!skb) {
1479 @@ -683,6 +755,12 @@
1480  #endif
1481                 kfree_skb(skb);
1482                 (void)capiminor_del_ack(mp, datahandle);
1483 +#ifdef CAPI_PPP_ON_RAW_DEVICE
1484 +               if (mp->chan_connected) {
1485 +                       ppp_output_wakeup(&mp->chan);
1486 +                       return;
1487 +               }
1488 +#endif
1489                 if (mp->tty) {
1490                         if (mp->tty->ldisc.write_wakeup)
1491                                 mp->tty->ldisc.write_wakeup(mp->tty);
1492 @@ -758,7 +836,7 @@
1493         struct capidev *cdev = (struct capidev *)file->private_data;
1494         struct sk_buff *skb;
1495         int retval;
1496 -       u16 mlen;
1497 +       __u16 mlen;
1498  
1499          if (ppos != &file->f_pos)
1500                 return -ESPIPE;
1501 @@ -998,7 +1076,7 @@
1502                                                 sizeof(ncci));
1503                         if (retval)
1504                                 return -EFAULT;
1505 -                       nccip = capincci_find(cdev, (u32) ncci);
1506 +                       nccip = capincci_find(cdev, (__u32) ncci);
1507                         if (!nccip)
1508                                 return 0;
1509  #ifdef CONFIG_ISDN_CAPI_MIDDLEWARE
1510 @@ -1023,7 +1101,7 @@
1511                                                 sizeof(ncci));
1512                         if (retval)
1513                                 return -EFAULT;
1514 -                       nccip = capincci_find(cdev, (u32) ncci);
1515 +                       nccip = capincci_find(cdev, (__u32) ncci);
1516                         if (!nccip || (mp = nccip->minorp) == 0)
1517                                 return -ESRCH;
1518                         return mp->minor;
1519 @@ -1070,7 +1148,9 @@
1520  
1521  static struct file_operations capi_fops =
1522  {
1523 +#ifdef COMPAT_HAS_FILEOP_OWNER
1524         owner:          THIS_MODULE,
1525 +#endif
1526         llseek:         no_llseek,
1527         read:           capi_read,
1528         write:          capi_write,
1529 @@ -1233,6 +1313,45 @@
1530                 return -EINVAL;
1531  
1532         switch (cmd) {
1533 +#ifdef CAPI_PPP_ON_RAW_DEVICE
1534 +       case PPPIOCATTACH:
1535 +               {
1536 +                       int retval, val;
1537 +                       if (get_user(val, (int *) arg))
1538 +                               break;
1539 +                       if (mp->chan_connected)
1540 +                               return -EALREADY;
1541 +                       mp->chan.private = mp;
1542 +#if 1
1543 +                       return -EINVAL;
1544 +#else
1545 +                       mp->chan.ops = &ppp_ops;
1546 +#endif
1547 +
1548 +                       retval = ppp_register_channel(&mp->chan, val);
1549 +                       if (retval)
1550 +                               return retval;
1551 +                       mp->chan_connected = 1;
1552 +                       mp->chan_index = val;
1553 +               }
1554 +               return 0;
1555 +       case PPPIOCDETACH:
1556 +               {
1557 +                       if (!mp->chan_connected)
1558 +                               return -ENXIO;
1559 +                       ppp_unregister_channel(&mp->chan);
1560 +                       mp->chan_connected = 0;
1561 +               }
1562 +               return 0;
1563 +       case PPPIOCGUNIT:
1564 +               {
1565 +                       if (!mp->chan_connected)
1566 +                               return -ENXIO;
1567 +                       if (put_user(mp->chan_index, (int *) arg))
1568 +                               return -EFAULT;
1569 +               }
1570 +               return 0;
1571 +#endif
1572         }
1573         return -EINVAL;
1574  }
1575 @@ -1260,7 +1379,9 @@
1576  
1577  static struct file_operations capinc_raw_fops =
1578  {
1579 +#ifdef COMPAT_HAS_FILEOP_OWNER
1580         owner:          THIS_MODULE,
1581 +#endif
1582         llseek:         no_llseek,
1583         read:           capinc_raw_read,
1584         write:          capinc_raw_write,
1585 @@ -1272,7 +1393,7 @@
1586  
1587  /* -------- tty_operations for capincci ----------------------------- */
1588  
1589 -static int capinc_tty_open(struct tty_struct * tty, struct file * file)
1590 +int capinc_tty_open(struct tty_struct * tty, struct file * file)
1591  {
1592         struct capiminor *mp;
1593  
1594 @@ -1300,7 +1421,7 @@
1595         return 0;
1596  }
1597  
1598 -static void capinc_tty_close(struct tty_struct * tty, struct file * file)
1599 +void capinc_tty_close(struct tty_struct * tty, struct file * file)
1600  {
1601         struct capiminor *mp;
1602  
1603 @@ -1325,8 +1446,8 @@
1604  #endif
1605  }
1606  
1607 -static int capinc_tty_write(struct tty_struct * tty, int from_user,
1608 -                           const unsigned char *buf, int count)
1609 +int capinc_tty_write(struct tty_struct * tty, int from_user,
1610 +                     const unsigned char *buf, int count)
1611  {
1612         struct capiminor *mp = (struct capiminor *)tty->driver_data;
1613         struct sk_buff *skb;
1614 @@ -1377,7 +1498,7 @@
1615         return count;
1616  }
1617  
1618 -static void capinc_tty_put_char(struct tty_struct *tty, unsigned char ch)
1619 +void capinc_tty_put_char(struct tty_struct *tty, unsigned char ch)
1620  {
1621         struct capiminor *mp = (struct capiminor *)tty->driver_data;
1622         struct sk_buff *skb;
1623 @@ -1414,7 +1535,7 @@
1624         }
1625  }
1626  
1627 -static void capinc_tty_flush_chars(struct tty_struct *tty)
1628 +void capinc_tty_flush_chars(struct tty_struct *tty)
1629  {
1630         struct capiminor *mp = (struct capiminor *)tty->driver_data;
1631         struct sk_buff *skb;
1632 @@ -1440,7 +1561,7 @@
1633         (void)handle_minor_recv(mp);
1634  }
1635  
1636 -static int capinc_tty_write_room(struct tty_struct *tty)
1637 +int capinc_tty_write_room(struct tty_struct *tty)
1638  {
1639         struct capiminor *mp = (struct capiminor *)tty->driver_data;
1640         int room;
1641 @@ -1458,7 +1579,7 @@
1642         return room;
1643  }
1644  
1645 -static int capinc_tty_chars_in_buffer(struct tty_struct *tty)
1646 +int capinc_tty_chars_in_buffer(struct tty_struct *tty)
1647  {
1648         struct capiminor *mp = (struct capiminor *)tty->driver_data;
1649         if (!mp || !mp->nccip) {
1650 @@ -1476,7 +1597,7 @@
1651         return mp->outbytes;
1652  }
1653  
1654 -static int capinc_tty_ioctl(struct tty_struct *tty, struct file * file,
1655 +int capinc_tty_ioctl(struct tty_struct *tty, struct file * file,
1656                     unsigned int cmd, unsigned long arg)
1657  {
1658         int error = 0;
1659 @@ -1488,14 +1609,14 @@
1660         return error;
1661  }
1662  
1663 -static void capinc_tty_set_termios(struct tty_struct *tty, struct termios * old)
1664 +void capinc_tty_set_termios(struct tty_struct *tty, struct termios * old)
1665  {
1666  #ifdef _DEBUG_TTYFUNCS
1667         printk(KERN_DEBUG "capinc_tty_set_termios\n");
1668  #endif
1669  }
1670  
1671 -static void capinc_tty_throttle(struct tty_struct * tty)
1672 +void capinc_tty_throttle(struct tty_struct * tty)
1673  {
1674         struct capiminor *mp = (struct capiminor *)tty->driver_data;
1675  #ifdef _DEBUG_TTYFUNCS
1676 @@ -1505,7 +1626,7 @@
1677                 mp->ttyinstop = 1;
1678  }
1679  
1680 -static void capinc_tty_unthrottle(struct tty_struct * tty)
1681 +void capinc_tty_unthrottle(struct tty_struct * tty)
1682  {
1683         struct capiminor *mp = (struct capiminor *)tty->driver_data;
1684  #ifdef _DEBUG_TTYFUNCS
1685 @@ -1517,7 +1638,7 @@
1686         }
1687  }
1688  
1689 -static void capinc_tty_stop(struct tty_struct *tty)
1690 +void capinc_tty_stop(struct tty_struct *tty)
1691  {
1692         struct capiminor *mp = (struct capiminor *)tty->driver_data;
1693  #ifdef _DEBUG_TTYFUNCS
1694 @@ -1528,7 +1649,7 @@
1695         }
1696  }
1697  
1698 -static void capinc_tty_start(struct tty_struct *tty)
1699 +void capinc_tty_start(struct tty_struct *tty)
1700  {
1701         struct capiminor *mp = (struct capiminor *)tty->driver_data;
1702  #ifdef _DEBUG_TTYFUNCS
1703 @@ -1540,43 +1661,49 @@
1704         }
1705  }
1706  
1707 -static void capinc_tty_hangup(struct tty_struct *tty)
1708 +void capinc_tty_hangup(struct tty_struct *tty)
1709  {
1710  #ifdef _DEBUG_TTYFUNCS
1711         printk(KERN_DEBUG "capinc_tty_hangup\n");
1712  #endif
1713  }
1714  
1715 -static void capinc_tty_break_ctl(struct tty_struct *tty, int state)
1716 +void capinc_tty_break_ctl(struct tty_struct *tty, int state)
1717  {
1718  #ifdef _DEBUG_TTYFUNCS
1719         printk(KERN_DEBUG "capinc_tty_break_ctl(%d)\n", state);
1720  #endif
1721  }
1722  
1723 -static void capinc_tty_flush_buffer(struct tty_struct *tty)
1724 +void capinc_tty_flush_buffer(struct tty_struct *tty)
1725  {
1726  #ifdef _DEBUG_TTYFUNCS
1727         printk(KERN_DEBUG "capinc_tty_flush_buffer\n");
1728  #endif
1729  }
1730  
1731 -static void capinc_tty_set_ldisc(struct tty_struct *tty)
1732 +void capinc_tty_set_ldisc(struct tty_struct *tty)
1733  {
1734  #ifdef _DEBUG_TTYFUNCS
1735         printk(KERN_DEBUG "capinc_tty_set_ldisc\n");
1736  #endif
1737  }
1738  
1739 -static void capinc_tty_send_xchar(struct tty_struct *tty, char ch)
1740 +void capinc_tty_send_xchar(struct tty_struct *tty, char ch)
1741  {
1742  #ifdef _DEBUG_TTYFUNCS
1743         printk(KERN_DEBUG "capinc_tty_send_xchar(%d)\n", ch);
1744  #endif
1745  }
1746  
1747 -static int capinc_tty_read_proc(char *page, char **start, off_t off,
1748 -                               int count, int *eof, void *data)
1749 +int capinc_tty_read_proc(char *page, char **start, off_t off,
1750 +                         int count, int *eof, void *data)
1751 +{
1752 +       return 0;
1753 +}
1754 +
1755 +int capinc_write_proc(struct file *file, const char *buffer,
1756 +                         unsigned long count, void *data)
1757  {
1758         return 0;
1759  }
1760 @@ -1588,7 +1715,7 @@
1761  static struct termios *capinc_tty_termios[CAPINC_NR_PORTS];
1762  static struct termios *capinc_tty_termios_locked[CAPINC_NR_PORTS];
1763  
1764 -static int capinc_tty_init(void)
1765 +int capinc_tty_init(void)
1766  {
1767         struct tty_driver *drv = &capinc_tty_driver;
1768  
1769 @@ -1646,7 +1773,7 @@
1770         return 0;
1771  }
1772  
1773 -static void capinc_tty_exit(void)
1774 +void capinc_tty_exit(void)
1775  {
1776         struct tty_driver *drv = &capinc_tty_driver;
1777         int retval;
1778 @@ -1771,8 +1898,9 @@
1779  
1780  /* -------- init function and module interface ---------------------- */
1781  
1782 +#ifdef COMPAT_HAS_kmem_cache
1783  
1784 -static void alloc_exit(void)
1785 +static void __exit alloc_exit(void)
1786  {
1787         if (capidev_cachep) {
1788                 (void)kmem_cache_destroy(capidev_cachep);
1789 @@ -1837,8 +1965,9 @@
1790  #endif /* CONFIG_ISDN_CAPI_MIDDLEWARE */
1791         return 0;
1792  }
1793 +#endif
1794  
1795 -static void lower_callback(unsigned int cmd, u32 contr, void *data)
1796 +static void lower_callback(unsigned int cmd, __u32 contr, void *data)
1797  {
1798         struct capi_ncciinfo *np;
1799         struct capidev *cdev;
1800 @@ -1900,15 +2029,19 @@
1801                 MOD_DEC_USE_COUNT;
1802                 return -EIO;
1803         }
1804 +#ifdef HAVE_DEVFS_FS
1805          devfs_register_series (NULL, "capi/r%u", CAPINC_NR_PORTS,
1806                               DEVFS_FL_DEFAULT,
1807                                capi_rawmajor, 0,
1808                                S_IFCHR | S_IRUSR | S_IWUSR,
1809                                &capinc_raw_fops, NULL);
1810 +#endif
1811  #endif /* CONFIG_ISDN_CAPI_MIDDLEWARE */
1812 +#ifdef HAVE_DEVFS_FS
1813         devfs_register (NULL, "isdn/capi20", DEVFS_FL_DEFAULT,
1814                         capi_major, 0, S_IFCHR | S_IRUSR | S_IWUSR,
1815                         &capi_fops, NULL);
1816 +#endif
1817         printk(KERN_NOTICE "capi20: started up with major %d\n", capi_major);
1818  
1819         if ((capifuncs = attach_capi_interface(&cuser)) == 0) {
1820 @@ -1918,9 +2051,11 @@
1821  #ifdef CONFIG_ISDN_CAPI_MIDDLEWARE
1822                 devfs_unregister_chrdev(capi_rawmajor, "capi/r%d");
1823  #endif /* CONFIG_ISDN_CAPI_MIDDLEWARE */
1824 +#ifdef HAVE_DEVFS_FS
1825                 devfs_unregister(devfs_find_handle(NULL, "capi20",
1826                                                    capi_major, 0,
1827                                                    DEVFS_SPECIAL_CHR, 0));
1828 +#endif
1829                 return -EIO;
1830         }
1831  
1832 @@ -1934,8 +2069,10 @@
1833         }
1834  #endif /* CONFIG_ISDN_CAPI_MIDDLEWARE */
1835  
1836 +#ifdef COMPAT_HAS_kmem_cache
1837         if (alloc_init() < 0) {
1838  #ifdef CONFIG_ISDN_CAPI_MIDDLEWARE
1839 +#ifdef HAVE_DEVFS_FS
1840                 unsigned int j;
1841                 devfs_unregister_chrdev(capi_rawmajor, "capi/r%d");
1842                 for (j = 0; j < CAPINC_NR_PORTS; j++) {
1843 @@ -1943,16 +2080,20 @@
1844                         sprintf(devname, "capi/r%u", j);
1845                         devfs_unregister(devfs_find_handle(NULL, devname, capi_rawmajor, j, DEVFS_SPECIAL_CHR, 0));
1846                 }
1847 +#endif
1848                 capinc_tty_exit();
1849  #endif /* CONFIG_ISDN_CAPI_MIDDLEWARE */
1850                 (void) detach_capi_interface(&cuser);
1851                 devfs_unregister_chrdev(capi_major, "capi20");
1852 +#ifdef HAVE_DEVFS_FS
1853                 devfs_unregister(devfs_find_handle(NULL, "capi20",
1854                                                    capi_major, 0,
1855                                                    DEVFS_SPECIAL_CHR, 0));
1856 +#endif
1857                 MOD_DEC_USE_COUNT;
1858                 return -ENOMEM;
1859         }
1860 +#endif /* COMPAT_HAS_kmem_cache */
1861  
1862         (void)proc_init();
1863  
1864 @@ -1975,23 +2116,31 @@
1865  static void __exit capi_exit(void)
1866  {
1867  #ifdef CONFIG_ISDN_CAPI_MIDDLEWARE
1868 +#ifdef HAVE_DEVFS_FS
1869         unsigned int j;
1870  #endif
1871 +#endif
1872 +#ifdef COMPAT_HAS_kmem_cache
1873         alloc_exit();
1874 +#endif
1875         (void)proc_exit();
1876  
1877         devfs_unregister_chrdev(capi_major, "capi20");
1878 +#ifdef HAVE_DEVFS_FS
1879         devfs_unregister(devfs_find_handle(NULL, "isdn/capi20", capi_major, 0, DEVFS_SPECIAL_CHR, 0));
1880 +#endif
1881  
1882  #ifdef CONFIG_ISDN_CAPI_MIDDLEWARE
1883         capinc_tty_exit();
1884         devfs_unregister_chrdev(capi_rawmajor, "capi/r%d");
1885 +#ifdef HAVE_DEVFS_FS
1886         for (j = 0; j < CAPINC_NR_PORTS; j++) {
1887                 char devname[32];
1888                 sprintf(devname, "capi/r%u", j);
1889                 devfs_unregister(devfs_find_handle(NULL, devname, capi_rawmajor, j, DEVFS_SPECIAL_CHR, 0));
1890         }
1891  #endif
1892 +#endif
1893         (void) detach_capi_interface(&cuser);
1894         printk(KERN_NOTICE "capi: Rev %s: unloaded\n", rev);
1895  }
1896 Index: linux-2.4.35.4/drivers/isdn/avmb1/capicmd.h
1897 ===================================================================
1898 --- linux-2.4.35.4.orig/drivers/isdn/avmb1/capicmd.h    2007-12-15 05:19:39.558675358 +0100
1899 +++ linux-2.4.35.4/drivers/isdn/avmb1/capicmd.h 2007-12-15 05:19:55.507584236 +0100
1900 @@ -1,4 +1,4 @@
1901 -/* $Id: capicmd.h,v 1.1.4.1 2001/11/20 14:19:34 kai Exp $
1902 +/* $Id: capicmd.h,v 1.4 2001/09/24 13:22:44 kai Exp $
1903   * 
1904   * CAPI 2.0 Interface for Linux
1905   * 
1906 Index: linux-2.4.35.4/drivers/isdn/avmb1/capidev.h
1907 ===================================================================
1908 --- linux-2.4.35.4.orig/drivers/isdn/avmb1/capidev.h    2007-12-15 05:19:39.566675816 +0100
1909 +++ linux-2.4.35.4/drivers/isdn/avmb1/capidev.h 2007-12-15 05:19:55.511584462 +0100
1910 @@ -1,4 +1,4 @@
1911 -/* $Id: capidev.h,v 1.1.4.1 2001/11/20 14:19:34 kai Exp $
1912 +/* $Id: capidev.h,v 1.8 2001/09/24 13:22:44 kai Exp $
1913   *
1914   * CAPI 2.0 Interface for Linux
1915   *
1916 Index: linux-2.4.35.4/drivers/isdn/avmb1/capidrv.c
1917 ===================================================================
1918 --- linux-2.4.35.4.orig/drivers/isdn/avmb1/capidrv.c    2007-12-15 05:19:39.570676042 +0100
1919 +++ linux-2.4.35.4/drivers/isdn/avmb1/capidrv.c 2007-12-15 05:19:55.511584462 +0100
1920 @@ -1,4 +1,4 @@
1921 -/* $Id: capidrv.c,v 1.1.4.1 2001/11/20 14:19:34 kai Exp $
1922 +/* $Id: capidrv.c,v 1.45 2001/09/24 13:22:44 kai Exp $
1923   *
1924   * ISDN4Linux Driver, using capi20 interface (kernelcapi)
1925   *
1926 @@ -35,7 +35,7 @@
1927  #include "capicmd.h"
1928  #include "capidrv.h"
1929  
1930 -static char *revision = "$Revision: 1.1.4.1 $";
1931 +static char *revision = "$Revision: 1.45 $";
1932  static int debugmode = 0;
1933  
1934  MODULE_DESCRIPTION("CAPI4Linux: Interface to ISDN4Linux");
1935 @@ -105,7 +105,6 @@
1936                                 int oldstate;
1937                                 /* */
1938                                 __u16 datahandle;
1939 -                                spinlock_t lock;
1940                                 struct ncci_datahandle_queue {
1941                                     struct ncci_datahandle_queue *next;
1942                                     __u16                         datahandle;
1943 @@ -423,7 +422,6 @@
1944         nccip->plcip = plcip;
1945         nccip->chan = plcip->chan;
1946         nccip->datahandle = 0;
1947 -        nccip->lock = SPIN_LOCK_UNLOCKED;
1948  
1949         nccip->next = plcip->ncci_list;
1950         plcip->ncci_list = nccip;
1951 @@ -480,7 +478,6 @@
1952                            __u16 datahandle, int len)
1953  {
1954         struct ncci_datahandle_queue *n, **pp;
1955 -       unsigned long flags;
1956  
1957         n = (struct ncci_datahandle_queue *)
1958                 kmalloc(sizeof(struct ncci_datahandle_queue), GFP_ATOMIC);
1959 @@ -491,31 +488,25 @@
1960         n->next = 0;
1961         n->datahandle = datahandle;
1962         n->len = len;
1963 -       spin_lock_irqsave(&nccip->lock, flags);
1964         for (pp = &nccip->ackqueue; *pp; pp = &(*pp)->next) ;
1965         *pp = n;
1966 -       spin_unlock_irqrestore(&nccip->lock, flags);
1967         return 0;
1968  }
1969  
1970  static int capidrv_del_ack(struct capidrv_ncci *nccip, __u16 datahandle)
1971  {
1972         struct ncci_datahandle_queue **pp, *p;
1973 -       unsigned long flags;
1974         int len;
1975  
1976 -       spin_lock_irqsave(&nccip->lock, flags);
1977         for (pp = &nccip->ackqueue; *pp; pp = &(*pp)->next) {
1978                 if ((*pp)->datahandle == datahandle) {
1979                         p = *pp;
1980                         len = p->len;
1981                         *pp = (*pp)->next;
1982 -                       spin_unlock_irqrestore(&nccip->lock, flags);
1983                         kfree(p);
1984                         return len;
1985                 }
1986         }
1987 -        spin_unlock_irqrestore(&nccip->lock, flags);
1988         return -1;
1989  }
1990  
1991 @@ -523,25 +514,13 @@
1992  
1993  static void send_message(capidrv_contr * card, _cmsg * cmsg)
1994  {
1995 -       struct sk_buff  *skb;
1996 -       size_t          len;
1997 -       u16             err;
1998 -
1999 +       struct sk_buff *skb;
2000 +       size_t len;
2001         capi_cmsg2message(cmsg, cmsg->buf);
2002         len = CAPIMSG_LEN(cmsg->buf);
2003         skb = alloc_skb(len, GFP_ATOMIC);
2004 -       if(!skb) {
2005 -               printk(KERN_ERR "no skb len(%d) memory\n", len);
2006 -               return;
2007 -       }
2008         memcpy(skb_put(skb, len), cmsg->buf, len);
2009 -       err = (*capifuncs->capi_put_message) (global.appid, skb);
2010 -       if (err) {
2011 -               printk(KERN_WARNING "%s: capi_put_message error: %04x\n",
2012 -                       __FUNCTION__, err);
2013 -               kfree_skb(skb);
2014 -               return;
2015 -       }
2016 +       (*capifuncs->capi_put_message) (global.appid, skb);
2017         global.nsentctlpkt++;
2018  }
2019  
2020 @@ -1932,8 +1911,10 @@
2021                         (void)capidrv_del_ack(nccip, datahandle);
2022                         return 0;
2023                 }
2024 +#if 1
2025                 printk(KERN_DEBUG "capidrv-%d: only %d bytes headroom, need %d\n",
2026                        card->contrnr, skb_headroom(skb), msglen);
2027 +#endif
2028                 memcpy(skb_push(nskb, msglen), sendcmsg.buf, msglen);
2029                 errcode = (*capifuncs->capi_put_message) (global.appid, nskb);
2030                 if (errcode == CAPI_NOERROR) {
2031 @@ -2035,6 +2016,52 @@
2032         send_message(card, &cmdcmsg);
2033  }
2034  
2035 +#if 0
2036 +static void disable_dchannel_trace(capidrv_contr *card)
2037 +{
2038 +        __u8 manufacturer[CAPI_MANUFACTURER_LEN];
2039 +        capi_version version;
2040 +       __u16 contr = card->contrnr;
2041 +       __u16 errcode;
2042 +       __u16 avmversion[3];
2043 +
2044 +        errcode = (*capifuncs->capi_get_manufacturer)(contr, manufacturer);
2045 +        if (errcode != CAPI_NOERROR) {
2046 +          printk(KERN_ERR "%s: can't get manufacturer (0x%x)\n",
2047 +                       card->name, errcode);
2048 +          return;
2049 +       }
2050 +       if (strstr(manufacturer, "AVM") == 0) {
2051 +          printk(KERN_ERR "%s: not from AVM, no d-channel trace possible (%s)\n",
2052 +                       card->name, manufacturer);
2053 +          return;
2054 +       }
2055 +        errcode = (*capifuncs->capi_get_version)(contr, &version);
2056 +        if (errcode != CAPI_NOERROR) {
2057 +          printk(KERN_ERR "%s: can't get version (0x%x)\n",
2058 +                       card->name, errcode);
2059 +          return;
2060 +       }
2061 +       avmversion[0] = (version.majormanuversion >> 4) & 0x0f;
2062 +       avmversion[1] = (version.majormanuversion << 4) & 0xf0;
2063 +       avmversion[1] |= (version.minormanuversion >> 4) & 0x0f;
2064 +       avmversion[2] |= version.minormanuversion & 0x0f;
2065 +
2066 +        if (avmversion[0] > 3 || (avmversion[0] == 3 && avmversion[1] > 5)) {
2067 +               printk(KERN_INFO "%s: D2 trace disabled\n", card->name);
2068 +       } else {
2069 +               printk(KERN_INFO "%s: D3 trace disabled\n", card->name);
2070 +       }
2071 +       capi_fill_MANUFACTURER_REQ(&cmdcmsg, global.appid,
2072 +                                  card->msgid++,
2073 +                                  contr,
2074 +                                  0x214D5641,  /* ManuID */
2075 +                                  0,           /* Class */
2076 +                                  1,           /* Function */
2077 +                                  (_cstruct)"\004\000\000\000\000");
2078 +       send_message(card, &cmdcmsg);
2079 +}
2080 +#endif
2081  
2082  static void send_listen(capidrv_contr *card)
2083  {
2084 @@ -2200,10 +2227,10 @@
2085                         free_ncci(card, card->bchans[card->nbchan-1].nccip);
2086                 if (card->bchans[card->nbchan-1].plcip)
2087                         free_plci(card, card->bchans[card->nbchan-1].plcip);
2088 +               if (card->plci_list)
2089 +                       printk(KERN_ERR "capidrv: bug in free_plci()\n");
2090                 card->nbchan--;
2091         }
2092 -       if (card->plci_list)
2093 -               printk(KERN_ERR "capidrv: bug in free_plci()\n");
2094         kfree(card->bchans);
2095         card->bchans = 0;
2096  
2097 Index: linux-2.4.35.4/drivers/isdn/avmb1/capidrv.h
2098 ===================================================================
2099 --- linux-2.4.35.4.orig/drivers/isdn/avmb1/capidrv.h    2007-12-15 05:19:39.578676498 +0100
2100 +++ linux-2.4.35.4/drivers/isdn/avmb1/capidrv.h 2007-12-15 05:19:55.511584462 +0100
2101 @@ -1,4 +1,4 @@
2102 -/* $Id: capidrv.h,v 1.1.4.1 2001/11/20 14:19:34 kai Exp $
2103 +/* $Id: capidrv.h,v 1.4 2001/09/24 13:22:44 kai Exp $
2104   *
2105   * ISDN4Linux Driver, using capi20 interface (kernelcapi)
2106   *
2107 Index: linux-2.4.35.4/drivers/isdn/avmb1/capifs.c
2108 ===================================================================
2109 --- linux-2.4.35.4.orig/drivers/isdn/avmb1/capifs.c     2007-12-15 05:19:39.586676956 +0100
2110 +++ linux-2.4.35.4/drivers/isdn/avmb1/capifs.c  2007-12-15 05:19:55.511584462 +0100
2111 @@ -1,4 +1,4 @@
2112 -/* $Id: capifs.c,v 1.1.4.1 2001/11/20 14:19:34 kai Exp $
2113 +/* $Id: capifs.c,v 1.22 2001/09/24 13:22:44 kai Exp $
2114   * 
2115   * Copyright 2000 by Carsten Paeth <calle@calle.de>
2116   *
2117 @@ -25,6 +25,7 @@
2118  #include <linux/major.h>
2119  #include <linux/slab.h>
2120  #include <linux/ctype.h>
2121 +#include <linux/isdn_compat.h>
2122  #include <asm/bitops.h>
2123  #include <asm/uaccess.h>
2124  
2125 @@ -32,7 +33,7 @@
2126  MODULE_AUTHOR("Carsten Paeth");
2127  MODULE_LICENSE("GPL");
2128  
2129 -static char *revision = "$Revision: 1.1.4.1 $";
2130 +static char *revision = "$Revision: 1.22 $";
2131  
2132  struct capifs_ncci {
2133         struct inode *inode;
2134 @@ -69,14 +70,21 @@
2135  static int capifs_root_readdir(struct file *,void *,filldir_t);
2136  static struct dentry *capifs_root_lookup(struct inode *,struct dentry *);
2137  static int capifs_revalidate(struct dentry *, int);
2138 +#ifdef COMPAT_VFS_2_4
2139  static struct inode *capifs_new_inode(struct super_block *sb);
2140 +#endif
2141  
2142  static struct file_operations capifs_root_operations = {
2143 +#ifdef COMPAT_VFS_2_4
2144         read:           generic_read_dir,
2145 +#endif
2146         readdir:        capifs_root_readdir,
2147  };
2148  
2149  struct inode_operations capifs_root_inode_operations = {
2150 +#ifndef COMPAT_VFS_2_4
2151 +       default_file_ops: &capifs_root_operations, /* file operations */
2152 +#endif
2153         lookup: capifs_root_lookup,
2154  };
2155  
2156 @@ -101,12 +109,20 @@
2157         switch(nr)
2158         {
2159         case 0:
2160 +#ifdef COMPAT_VFS_2_4
2161                 if (filldir(dirent, ".", 1, nr, inode->i_ino, DT_DIR) < 0)
2162 +#else
2163 +               if (filldir(dirent, ".", 1, nr, inode->i_ino) < 0)
2164 +#endif
2165                         return 0;
2166                 filp->f_pos = ++nr;
2167                 /* fall through */
2168         case 1:
2169 +#ifdef COMPAT_VFS_2_4
2170                 if (filldir(dirent, "..", 2, nr, inode->i_ino, DT_DIR) < 0)
2171 +#else
2172 +               if (filldir(dirent, "..", 2, nr, inode->i_ino) < 0)
2173 +#endif
2174                         return 0;
2175                 filp->f_pos = ++nr;
2176                 /* fall through */
2177 @@ -118,7 +134,11 @@
2178                                 char *p = numbuf;
2179                                 if (np->type) *p++ = np->type;
2180                                 sprintf(p, "%u", np->num);
2181 +#ifdef COMPAT_VFS_2_4
2182                                 if ( filldir(dirent, numbuf, strlen(numbuf), nr, nr, DT_UNKNOWN) < 0 )
2183 +#else
2184 +                               if ( filldir(dirent, numbuf, strlen(numbuf), nr, nr) < 0 )
2185 +#endif
2186                                         return 0;
2187                         }
2188                         filp->f_pos = ++nr;
2189 @@ -180,7 +200,7 @@
2190  
2191         dentry->d_inode = np->inode;
2192         if ( dentry->d_inode )
2193 -               atomic_inc(&dentry->d_inode->i_count);
2194 +               i_count_inc(dentry->d_inode->i_count);
2195         
2196         d_add(dentry, dentry->d_inode);
2197  
2198 @@ -199,9 +219,9 @@
2199  
2200         for ( i = 0 ; i < sbi->max_ncci ; i++ ) {
2201                 if ( (inode = sbi->nccis[i].inode) ) {
2202 -                       if (atomic_read(&inode->i_count) != 1 )
2203 +                       if (i_count_read(inode->i_count) != 1 )
2204                                 printk("capifs_put_super: badness: entry %d count %d\n",
2205 -                                      i, (unsigned)atomic_read(&inode->i_count));
2206 +                                      i, (unsigned)i_count_read(inode->i_count));
2207                         inode->i_nlink--;
2208                         iput(inode);
2209                 }
2210 @@ -213,11 +233,24 @@
2211  
2212         kfree(sbi->nccis);
2213         kfree(sbi);
2214 +#ifndef COMPAT_VFS_2_4
2215 +       MOD_DEC_USE_COUNT;
2216 +#endif
2217  }
2218  
2219 +#ifdef COMPAT_VFS_2_4
2220  static int capifs_statfs(struct super_block *sb, struct statfs *buf);
2221 +#else
2222 +static int capifs_statfs(struct super_block *sb, struct statfs *buf, int bufsiz);
2223 +static void capifs_write_inode(struct inode *inode) { };
2224 +static void capifs_read_inode(struct inode *inode);
2225 +#endif
2226  
2227  static struct super_operations capifs_sops = {
2228 +#ifndef COMPAT_VFS_2_4
2229 +       read_inode:     capifs_read_inode,
2230 +       write_inode:    capifs_write_inode,
2231 +#endif
2232         put_super:      capifs_put_super,
2233         statfs:         capifs_statfs,
2234  };
2235 @@ -288,6 +321,10 @@
2236         struct dentry * root;
2237         struct capifs_sb_info *sbi;
2238  
2239 +#ifndef COMPAT_VFS_2_4
2240 +       MOD_INC_USE_COUNT;
2241 +       lock_super(s);
2242 +#endif
2243         /* Super block already completed? */
2244         if (s->s_root)
2245                 goto out;
2246 @@ -322,6 +359,7 @@
2247         /*
2248          * Get the root inode and dentry, but defer checking for errors.
2249          */
2250 +#ifdef COMPAT_VFS_2_4
2251         root_inode = capifs_new_inode(s);
2252         if (root_inode) {
2253                 root_inode->i_ino = 1;
2254 @@ -331,6 +369,10 @@
2255                 root_inode->i_nlink = 2;
2256         } 
2257         root = d_alloc_root(root_inode);
2258 +#else
2259 +       root_inode = iget(s, 1); /* inode 1 == root directory */
2260 +       root = d_alloc_root(root_inode, NULL);
2261 +#endif
2262  
2263         /*
2264          * Check whether somebody else completed the super block.
2265 @@ -370,11 +412,34 @@
2266         mounts = s;
2267  
2268  out:   /* Success ... somebody else completed the super block for us. */ 
2269 +#ifndef COMPAT_VFS_2_4
2270 +       unlock_super(s);
2271 +#endif
2272         return s;
2273  fail:
2274 +#ifndef COMPAT_VFS_2_4
2275 +       unlock_super(s);
2276 +       MOD_DEC_USE_COUNT;
2277 +#endif
2278         return NULL;
2279  }
2280  
2281 +#ifndef COMPAT_VFS_2_4
2282 +static int capifs_statfs(struct super_block *sb, struct statfs *buf, int bufsiz)
2283 +{
2284 +       struct statfs tmp;
2285 +
2286 +       tmp.f_type = CAPIFS_SUPER_MAGIC;
2287 +       tmp.f_bsize = 1024;
2288 +       tmp.f_blocks = 0;
2289 +       tmp.f_bfree = 0;
2290 +       tmp.f_bavail = 0;
2291 +       tmp.f_files = 0;
2292 +       tmp.f_ffree = 0;
2293 +       tmp.f_namelen = NAME_MAX;
2294 +       return copy_to_user(buf, &tmp, bufsiz) ? -EFAULT : 0;
2295 +}
2296 +#else
2297  static int capifs_statfs(struct super_block *sb, struct statfs *buf)
2298  {
2299         buf->f_type = CAPIFS_SUPER_MAGIC;
2300 @@ -387,7 +452,9 @@
2301         buf->f_namelen = NAME_MAX;
2302         return 0;
2303  }
2304 +#endif
2305  
2306 +#ifdef COMPAT_VFS_2_4
2307  static struct inode *capifs_new_inode(struct super_block *sb)
2308  {
2309         struct inode *inode = new_inode(sb);
2310 @@ -399,8 +466,51 @@
2311         }
2312         return inode;
2313  }
2314 +#else
2315 +static void capifs_read_inode(struct inode *inode)
2316 +{
2317 +       ino_t ino = inode->i_ino;
2318 +       struct capifs_sb_info *sbi = SBI(inode->i_sb);
2319 +
2320 +       inode->i_mode = 0;
2321 +       inode->i_nlink = 0;
2322 +       inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME;
2323 +       inode->i_blocks = 0;
2324 +       inode->i_blksize = 1024;
2325 +       inode->i_uid = inode->i_gid = 0;
2326 +
2327 +       if ( ino == 1 ) {
2328 +               inode->i_mode = S_IFDIR | S_IRUGO | S_IXUGO | S_IWUSR;
2329 +               inode->i_op = &capifs_root_inode_operations;
2330 +               inode->i_nlink = 2;
2331 +               return;
2332 +       } 
2333  
2334 +       ino -= 2;
2335 +       if ( ino >= sbi->max_ncci )
2336 +               return;         /* Bogus */
2337 +       
2338 +#ifdef COMPAT_VFS_2_4
2339 +       init_special_inode(inode, S_IFCHR, 0);
2340 +#else
2341 +       inode->i_mode = S_IFCHR;
2342 +       inode->i_op = &chrdev_inode_operations;
2343 +#endif
2344 +
2345 +       return;
2346 +}
2347 +#endif
2348 +
2349 +#ifndef COMPAT_VFS_2_4
2350 +static struct file_system_type capifs_fs_type = {
2351 +       "capifs",
2352 +       0,
2353 +       capifs_read_super,
2354 +       NULL
2355 +};
2356 +#else
2357  static DECLARE_FSTYPE(capifs_fs_type, "capifs", capifs_read_super, 0);
2358 +#endif
2359  
2360  void capifs_new_ncci(char type, unsigned int num, kdev_t device)
2361  {
2362 @@ -421,16 +531,26 @@
2363                                 break;
2364                         }
2365                 }
2366 +#ifdef COMPAT_VFS_2_4
2367                 if ( ino >= sbi->max_ncci )
2368                         continue;
2369  
2370                 if ((np->inode = capifs_new_inode(sb)) != NULL) {
2371 +#else
2372 +               if ((np->inode = iget(sb, ino+2)) != NULL) {
2373 +#endif
2374                         struct inode *inode = np->inode;
2375                         inode->i_uid = sbi->setuid ? sbi->uid : current->fsuid;
2376                         inode->i_gid = sbi->setgid ? sbi->gid : current->fsgid;
2377 +#ifdef COMPAT_VFS_2_4
2378                         inode->i_nlink = 1;
2379                         inode->i_ino = ino + 2;
2380                         init_special_inode(inode, sbi->mode|S_IFCHR, np->kdev);
2381 +#else
2382 +                       inode->i_mode = sbi->mode | S_IFCHR;
2383 +                       inode->i_rdev = np->kdev;
2384 +                       inode->i_nlink++;
2385 +#endif
2386                 }
2387         }
2388  }
2389 Index: linux-2.4.35.4/drivers/isdn/avmb1/capifs.h
2390 ===================================================================
2391 --- linux-2.4.35.4.orig/drivers/isdn/avmb1/capifs.h     2007-12-15 05:19:39.594677411 +0100
2392 +++ linux-2.4.35.4/drivers/isdn/avmb1/capifs.h  2007-12-15 05:19:55.515584692 +0100
2393 @@ -1,4 +1,4 @@
2394 -/* $Id: capifs.h,v 1.1.4.1 2001/11/20 14:19:34 kai Exp $
2395 +/* $Id: capifs.h,v 1.4 2001/09/24 13:22:44 kai Exp $
2396   * 
2397   * Copyright 2000 by Carsten Paeth <calle@calle.de>
2398   *
2399 Index: linux-2.4.35.4/drivers/isdn/avmb1/capilli.h
2400 ===================================================================
2401 --- linux-2.4.35.4.orig/drivers/isdn/avmb1/capilli.h    2007-12-15 05:19:39.598677637 +0100
2402 +++ linux-2.4.35.4/drivers/isdn/avmb1/capilli.h 2007-12-15 05:19:55.515584692 +0100
2403 @@ -1,4 +1,4 @@
2404 -/* $Id: capilli.h,v 1.1.4.1 2001/11/20 14:19:34 kai Exp $
2405 +/* $Id: capilli.h,v 1.5 2001/09/24 13:22:44 kai Exp $
2406   * 
2407   * Kernel CAPI 2.0 Driver Interface for Linux
2408   * 
2409 Index: linux-2.4.35.4/drivers/isdn/avmb1/capiutil.c
2410 ===================================================================
2411 --- linux-2.4.35.4.orig/drivers/isdn/avmb1/capiutil.c   2007-12-15 05:19:39.606678095 +0100
2412 +++ linux-2.4.35.4/drivers/isdn/avmb1/capiutil.c        2007-12-15 05:19:55.515584692 +0100
2413 @@ -1,4 +1,4 @@
2414 -/* $Id: capiutil.c,v 1.1.4.1 2001/11/20 14:19:34 kai Exp $
2415 +/* $Id: capiutil.c,v 1.16 2001/09/24 13:22:44 kai Exp $
2416   *
2417   * CAPI 2.0 convert capi message to capi message struct
2418   *
2419 @@ -19,6 +19,7 @@
2420  #include <linux/init.h>
2421  #include <asm/segment.h>
2422  #include <linux/config.h>
2423 +#include <linux/isdn_compat.h>
2424  #include "capiutil.h"
2425  
2426  MODULE_DESCRIPTION("CAPI4Linux: CAPI message conversion support");
2427 Index: linux-2.4.35.4/drivers/isdn/avmb1/capiutil.h
2428 ===================================================================
2429 --- linux-2.4.35.4.orig/drivers/isdn/avmb1/capiutil.h   2007-12-15 05:19:39.614678551 +0100
2430 +++ linux-2.4.35.4/drivers/isdn/avmb1/capiutil.h        2007-12-15 05:19:55.515584692 +0100
2431 @@ -1,4 +1,4 @@
2432 -/* $Id: capiutil.h,v 1.1.4.1 2001/11/20 14:19:34 kai Exp $
2433 +/* $Id: capiutil.h,v 1.7 2001/09/24 13:22:44 kai Exp $
2434   *
2435   * CAPI 2.0 defines & types
2436   *
2437 Index: linux-2.4.35.4/drivers/isdn/avmb1/kcapi.c
2438 ===================================================================
2439 --- linux-2.4.35.4.orig/drivers/isdn/avmb1/kcapi.c      2007-12-15 05:19:39.622679006 +0100
2440 +++ linux-2.4.35.4/drivers/isdn/avmb1/kcapi.c   2007-12-15 05:19:55.519584918 +0100
2441 @@ -1,4 +1,4 @@
2442 -/* $Id: kcapi.c,v 1.1.4.1 2001/11/20 14:19:34 kai Exp $
2443 +/* $Id: kcapi.c,v 1.28 2001/09/24 13:22:44 kai Exp $
2444   * 
2445   * Kernel CAPI 2.0 Module
2446   * 
2447 @@ -21,6 +21,7 @@
2448  #include <linux/proc_fs.h>
2449  #include <linux/skbuff.h>
2450  #include <linux/tqueue.h>
2451 +#include <linux/isdn_compat.h>
2452  #include <linux/capi.h>
2453  #include <linux/kernelcapi.h>
2454  #include <linux/locks.h>
2455 @@ -33,7 +34,7 @@
2456  #include <linux/b1lli.h>
2457  #endif
2458  
2459 -static char *revision = "$Revision: 1.1.4.1 $";
2460 +static char *revision = "$Revision: 1.28 $";
2461  
2462  /* ------------------------------------------------------------- */
2463  
2464 @@ -64,7 +65,6 @@
2465         __u32 ncci;
2466         __u32 winsize;
2467         int   nmsg;
2468 -        spinlock_t lock;
2469         struct msgidqueue *msgidqueue;
2470         struct msgidqueue *msgidlast;
2471         struct msgidqueue *msgidfree;
2472 @@ -104,14 +104,14 @@
2473  #define APPL(a)                   (&applications[(a)-1])
2474  #define        VALID_APPLID(a)    ((a) && (a) <= CAPI_MAXAPPL && APPL(a)->applid == a)
2475  #define APPL_IS_FREE(a)    (APPL(a)->applid == 0)
2476 -#define APPL_MARK_FREE(a)  do{ APPL(a)->applid=0; MOD_DEC_USE_COUNT; }while(0)
2477 -#define APPL_MARK_USED(a)  do{ APPL(a)->applid=(a); MOD_INC_USE_COUNT; }while(0)
2478 +#define APPL_MARK_FREE(a)  do{ APPL(a)->applid=0; MOD_DEC_USE_COUNT; }while(0);
2479 +#define APPL_MARK_USED(a)  do{ APPL(a)->applid=(a); MOD_INC_USE_COUNT; }while(0);
2480  
2481  #define NCCI2CTRL(ncci)    (((ncci) >> 24) & 0x7f)
2482  
2483  #define VALID_CARD(c)     ((c) > 0 && (c) <= CAPI_MAXCONTR)
2484  #define CARD(c)                   (&cards[(c)-1])
2485 -#define CARDNR(cp)        ((((cp)-cards)+1) & 0xff)
2486 +#define CARDNR(cp)        (((cp)-cards)+1)
2487  
2488  static struct capi_appl applications[CAPI_MAXAPPL];
2489  static struct capi_ctr cards[CAPI_MAXCONTR];
2490 @@ -535,9 +535,13 @@
2491          * of devices. Devices can only removed in
2492          * user process, not in bh.
2493          */
2494 +#ifdef COMPAT_HAS_SCHEDULE_TASK
2495         MOD_INC_USE_COUNT;
2496         if (schedule_task(&tq_state_notify) == 0)
2497                 MOD_DEC_USE_COUNT;
2498 +#else
2499 +       queue_task(&tq_state_notify, &tq_scheduler);
2500 +#endif
2501         return 0;
2502  }
2503  
2504 @@ -546,13 +550,7 @@
2505  static void notify_up(__u32 contr)
2506  {
2507         struct capi_interface_user *p;
2508 -       __u16 appl;
2509  
2510 -       for (appl = 1; appl <= CAPI_MAXAPPL; appl++) {
2511 -               if (!VALID_APPLID(appl)) continue;
2512 -               if (APPL(appl)->releasing) continue;
2513 -               CARD(contr)->driver->register_appl(CARD(contr), appl, &APPL(appl)->rparam);
2514 -       }
2515          printk(KERN_NOTICE "kcapi: notify up contr %d\n", contr);
2516         spin_lock(&capi_users_lock);
2517         for (p = capi_users; p; p = p->next) {
2518 @@ -639,7 +637,9 @@
2519                 kfree(np);
2520                 MOD_DEC_USE_COUNT;
2521         }
2522 +#ifdef COMPAT_HAS_SCHEDULE_TASK
2523         MOD_DEC_USE_COUNT;
2524 +#endif
2525  }
2526         
2527  /* -------- NCCI Handling ------------------------------------- */
2528 @@ -647,7 +647,6 @@
2529  static inline void mq_init(struct capi_ncci * np)
2530  {
2531         int i;
2532 -        np->lock = SPIN_LOCK_UNLOCKED;
2533         np->msgidqueue = 0;
2534         np->msgidlast = 0;
2535         np->nmsg = 0;
2536 @@ -662,11 +661,8 @@
2537  static inline int mq_enqueue(struct capi_ncci * np, __u16 msgid)
2538  {
2539         struct msgidqueue *mq;
2540 -       spin_lock_bh(&np->lock);
2541 -       if ((mq = np->msgidfree) == 0) {
2542 -               spin_unlock_bh(&np->lock);
2543 +       if ((mq = np->msgidfree) == 0)
2544                 return 0;
2545 -       }
2546         np->msgidfree = mq->next;
2547         mq->msgid = msgid;
2548         mq->next = 0;
2549 @@ -676,14 +672,12 @@
2550         if (!np->msgidqueue)
2551                 np->msgidqueue = mq;
2552         np->nmsg++;
2553 -       spin_unlock_bh(&np->lock);
2554         return 1;
2555  }
2556  
2557  static inline int mq_dequeue(struct capi_ncci * np, __u16 msgid)
2558  {
2559         struct msgidqueue **pp;
2560 -       spin_lock_bh(&np->lock);
2561         for (pp = &np->msgidqueue; *pp; pp = &(*pp)->next) {
2562                 if ((*pp)->msgid == msgid) {
2563                         struct msgidqueue *mq = *pp;
2564 @@ -693,11 +687,9 @@
2565                         mq->next = np->msgidfree;
2566                         np->msgidfree = mq;
2567                         np->nmsg--;
2568 -                       spin_unlock_bh(&np->lock);
2569                         return 1;
2570                 }
2571         }
2572 -       spin_unlock_bh(&np->lock);
2573         return 0;
2574  }
2575  
2576 @@ -720,16 +712,12 @@
2577                         nextpp = &(*pp)->next;
2578                 }
2579         }
2580 -       if (APPL(appl)->releasing) { /* only release if the application was marked for release */
2581 -               printk(KERN_DEBUG "kcapi: appl %d releasing(%d)\n", appl, APPL(appl)->releasing);
2582 -               APPL(appl)->releasing--;
2583 -               if (APPL(appl)->releasing <= 0) {
2584 -                       APPL(appl)->signal = 0;
2585 -                       APPL_MARK_FREE(appl);
2586 -                       printk(KERN_INFO "kcapi: appl %d down\n", appl);
2587 -               }
2588 -       } else
2589 -               printk(KERN_WARNING "kcapi: appl %d card%d released without request\n", appl, card->cnr);
2590 +       APPL(appl)->releasing--;
2591 +       if (APPL(appl)->releasing <= 0) {
2592 +               APPL(appl)->signal = 0;
2593 +               APPL_MARK_FREE(appl);
2594 +               printk(KERN_INFO "kcapi: appl %d down\n", appl);
2595 +       }
2596  }
2597  /*
2598   * ncci management
2599 @@ -882,7 +870,16 @@
2600  
2601  static void controllercb_ready(struct capi_ctr * card)
2602  {
2603 +       __u16 appl;
2604 +
2605         card->cardstate = CARD_RUNNING;
2606 +
2607 +       for (appl = 1; appl <= CAPI_MAXAPPL; appl++) {
2608 +               if (!VALID_APPLID(appl)) continue;
2609 +               if (APPL(appl)->releasing) continue;
2610 +               card->driver->register_appl(card, appl, &APPL(appl)->rparam);
2611 +       }
2612 +
2613          printk(KERN_NOTICE "kcapi: card %d \"%s\" ready.\n",
2614                 CARDNR(card), card->name);
2615  
2616 Index: linux-2.4.35.4/drivers/isdn/avmb1/t1isa.c
2617 ===================================================================
2618 --- linux-2.4.35.4.orig/drivers/isdn/avmb1/t1isa.c      2007-12-15 05:19:39.626679235 +0100
2619 +++ linux-2.4.35.4/drivers/isdn/avmb1/t1isa.c   2007-12-15 05:19:55.519584918 +0100
2620 @@ -1,4 +1,4 @@
2621 -/* $Id: t1isa.c,v 1.1.4.1 2001/11/20 14:19:34 kai Exp $
2622 +/* $Id: t1isa.c,v 1.22 2001/09/24 13:22:44 kai Exp $
2623   * 
2624   * Module for AVM T1 HEMA-card.
2625   * 
2626 @@ -19,13 +19,14 @@
2627  #include <linux/capi.h>
2628  #include <linux/kernelcapi.h>
2629  #include <linux/init.h>
2630 +#include <linux/isdn_compat.h>
2631  #include <asm/io.h>
2632  #include "capicmd.h"
2633  #include "capiutil.h"
2634  #include "capilli.h"
2635  #include "avmcard.h"
2636  
2637 -static char *revision = "$Revision: 1.1.4.1 $";
2638 +static char *revision = "$Revision: 1.22 $";
2639  
2640  /* ------------------------------------------------------------- */
2641  
2642 Index: linux-2.4.35.4/drivers/isdn/avmb1/t1pci.c
2643 ===================================================================
2644 --- linux-2.4.35.4.orig/drivers/isdn/avmb1/t1pci.c      2007-12-15 05:19:39.634679691 +0100
2645 +++ linux-2.4.35.4/drivers/isdn/avmb1/t1pci.c   2007-12-15 05:19:55.519584918 +0100
2646 @@ -1,4 +1,4 @@
2647 -/* $Id: t1pci.c,v 1.1.4.1 2001/11/20 14:19:34 kai Exp $
2648 +/* $Id: t1pci.c,v 1.25 2001/09/24 13:22:44 kai Exp $
2649   * 
2650   * Module for AVM T1 PCI-card.
2651   * 
2652 @@ -18,6 +18,7 @@
2653  #include <linux/interrupt.h>
2654  #include <linux/ioport.h>
2655  #include <linux/pci.h>
2656 +#include <linux/isdn_compat.h>
2657  #include <linux/capi.h>
2658  #include <linux/init.h>
2659  #include <asm/io.h>
2660 @@ -26,19 +27,21 @@
2661  #include "capilli.h"
2662  #include "avmcard.h"
2663  
2664 -static char *revision = "$Revision: 1.1.4.1 $";
2665 +static char *revision = "$Revision: 1.25 $";
2666  
2667  #undef CONFIG_T1PCI_DEBUG
2668  #undef CONFIG_T1PCI_POLLDEBUG
2669  
2670  /* ------------------------------------------------------------- */
2671  
2672 +#ifndef COMPAT_HAS_2_2_PCI
2673  static struct pci_device_id t1pci_pci_tbl[] __initdata = {
2674         { PCI_VENDOR_ID_AVM, PCI_DEVICE_ID_AVM_T1, PCI_ANY_ID, PCI_ANY_ID },
2675         { }                             /* Terminating entry */
2676  };
2677  
2678  MODULE_DEVICE_TABLE(pci, t1pci_pci_tbl);
2679 +#endif
2680  MODULE_DESCRIPTION("CAPI4Linux: Driver for AVM T1 PCI card");
2681  MODULE_AUTHOR("Carsten Paeth");
2682  MODULE_LICENSE("GPL");
2683 @@ -264,9 +267,9 @@
2684                 }
2685                 pci_set_master(dev);
2686  
2687 -               param.port = pci_resource_start(dev, 1);
2688 +               param.port = pci_resource_start_io(dev, 1);
2689                 param.irq = dev->irq;
2690 -               param.membase = pci_resource_start(dev, 0);
2691 +               param.membase = pci_resource_start_mem(dev, 0);
2692  
2693                 printk(KERN_INFO
2694                         "%s: PCI BIOS reports AVM-T1-PCI at i/o %#x, irq %d, mem %#x\n",
2695 Index: linux-2.4.35.4/drivers/isdn/divert/divert_procfs.c
2696 ===================================================================
2697 --- linux-2.4.35.4.orig/drivers/isdn/divert/divert_procfs.c     2007-12-15 05:19:39.642680146 +0100
2698 +++ linux-2.4.35.4/drivers/isdn/divert/divert_procfs.c  2007-12-15 05:19:55.519584918 +0100
2699 @@ -1,4 +1,4 @@
2700 -/* $Id: divert_procfs.c,v 1.1.4.1 2001/11/20 14:19:35 kai Exp $
2701 +/* $Id$
2702   *
2703   * Filesystem handling for the diversion supplementary services.
2704   *
2705 @@ -14,13 +14,16 @@
2706  #include <linux/module.h>
2707  #include <linux/version.h>
2708  #include <linux/poll.h>
2709 +#ifndef COMPAT_USE_MODCOUNT_LOCK
2710  #include <linux/smp_lock.h>
2711 +#endif
2712  #ifdef CONFIG_PROC_FS
2713  #include <linux/proc_fs.h>
2714  #else
2715  #include <linux/fs.h>
2716  #endif
2717  #include <linux/isdnif.h>
2718 +#include <linux/isdn_compat.h>
2719  #include "isdn_divert.h"
2720  
2721  /*********************************/
2722 @@ -80,7 +83,6 @@
2723  isdn_divert_read(struct file *file, char *buf, size_t count, loff_t * off)
2724  {
2725         struct divert_info *inf;
2726 -       loff_t pos = *off;
2727         int len;
2728  
2729         if (!*((struct divert_info **) file->private_data)) {
2730 @@ -92,11 +94,11 @@
2731                 return (0);
2732  
2733         inf->usage_cnt--;       /* new usage count */
2734 -       file->private_data = &inf->next;        /* next structure */
2735 +       (struct divert_info **) file->private_data = &inf->next;        /* next structure */
2736         if ((len = strlen(inf->info_start)) <= count) {
2737                 if (copy_to_user(buf, inf->info_start, len))
2738                         return -EFAULT;
2739 -               *off = pos + len;
2740 +               file->f_pos += len;
2741                 return (len);
2742         }
2743         return (0);
2744 @@ -136,17 +138,23 @@
2745  {
2746         unsigned long flags;
2747  
2748 +#ifdef COMPAT_USE_MODCOUNT_LOCK
2749 +       MOD_INC_USE_COUNT;
2750 +#else
2751         lock_kernel();
2752 +#endif
2753         save_flags(flags);
2754         cli();
2755         if_used++;
2756         if (divert_info_head)
2757 -               filep->private_data = &(divert_info_tail->next);
2758 +               (struct divert_info **) filep->private_data = &(divert_info_tail->next);
2759         else
2760 -               filep->private_data = &divert_info_head;
2761 +               (struct divert_info **) filep->private_data = &divert_info_head;
2762         restore_flags(flags);
2763         /*  start_divert(); */
2764 +#ifndef COMPAT_USE_MODCOUNT_LOCK
2765         unlock_kernel();
2766 +#endif
2767         return (0);
2768  }                              /* isdn_divert_open */
2769  
2770 @@ -159,7 +167,9 @@
2771         struct divert_info *inf;
2772         unsigned long flags;
2773  
2774 +#ifndef COMPAT_USE_MODCOUNT_LOCK
2775         lock_kernel();
2776 +#endif
2777         save_flags(flags);
2778         cli();
2779         if_used--;
2780 @@ -175,7 +185,11 @@
2781                         divert_info_head = divert_info_head->next;
2782                         kfree(inf);
2783                 }
2784 +#ifdef COMPAT_USE_MODCOUNT_LOCK
2785 +       MOD_DEC_USE_COUNT;
2786 +#else
2787         unlock_kernel();
2788 +#endif
2789         return (0);
2790  }                              /* isdn_divert_close */
2791  
2792 @@ -276,6 +290,9 @@
2793         open:           isdn_divert_open,
2794         release:        isdn_divert_close,                                      
2795  };
2796 +#ifdef COMPAT_NO_SOFTNET
2797 +struct inode_operations divert_file_inode_operations;
2798 +#endif
2799  
2800  /****************************/
2801  /* isdn subdir in /proc/net */
2802 @@ -302,8 +319,16 @@
2803                 remove_proc_entry("isdn", proc_net);
2804                 return (-1);
2805         }
2806 +#ifdef COMPAT_NO_SOFTNET
2807 +       memset(&divert_file_inode_operations, 0, sizeof(struct inode_operations));
2808 +       divert_file_inode_operations.default_file_ops = &isdn_fops;
2809 +       isdn_divert_entry->ops = &divert_file_inode_operations;
2810 +#else
2811         isdn_divert_entry->proc_fops = &isdn_fops; 
2812 +#ifdef COMPAT_HAS_FILEOP_OWNER
2813         isdn_divert_entry->owner = THIS_MODULE; 
2814 +#endif
2815 +#endif  /* COMPAT_NO_SOFTNET */
2816  #endif /* CONFIG_PROC_FS */
2817  
2818         return (0);
2819 Index: linux-2.4.35.4/drivers/isdn/divert/isdn_divert.c
2820 ===================================================================
2821 --- linux-2.4.35.4.orig/drivers/isdn/divert/isdn_divert.c       2007-12-15 05:19:39.650680601 +0100
2822 +++ linux-2.4.35.4/drivers/isdn/divert/isdn_divert.c    2007-12-15 05:19:55.523585147 +0100
2823 @@ -1,4 +1,4 @@
2824 -/* $Id: isdn_divert.c,v 1.1.4.1 2001/11/20 14:19:35 kai Exp $
2825 +/* $Id$
2826   *
2827   * DSS1 main diversion supplementary handling for i4l.
2828   *
2829 @@ -84,6 +84,9 @@
2830         restore_flags(flags); 
2831         break;
2832  
2833 +     case NETWORK_DIAL:
2834 +       divert_if.dial_net_name(cs->deflect_dest);  
2835 +
2836       case DEFLECT_AUTODEL:
2837       default:
2838         save_flags(flags);
2839 @@ -452,6 +455,7 @@
2840           case DEFLECT_PROCEED:
2841           case DEFLECT_REPORT:
2842           case DEFLECT_REJECT:
2843 +         case NETWORK_DIAL:
2844             if (dv->rule.action == DEFLECT_PROCEED)
2845             if ((!if_used) || ((!extern_wait_max) && (!dv->rule.waittime))) 
2846                return(0); /* no external deflection needed */  
2847 @@ -495,6 +499,11 @@
2848             else
2849               { cs->deflect_dest[0] = '\0';
2850                retval = 4; /* only proceed */
2851 +              if (cs->akt_state == NETWORK_DIAL) {
2852 +                strcpy(cs->deflect_dest,dv->rule.to_nr);
2853 +                cs->timer.expires = jiffies + 10;
2854 +                retval = 0;
2855 +              }
2856               }  
2857             sprintf(cs->info,"%d 0x%lx %s %s %s %s 0x%x 0x%x %d %d %s\n",
2858                     cs->akt_state,
2859 @@ -739,6 +748,18 @@
2860                        } 
2861  
2862  
2863 +#if 0
2864 +  sprintf(st, "0x%lx 0x%lx",ic->arg, ic->parm.dss1_io.ll_id);
2865 +  p = st + strlen(st);
2866 +  p1 = ic->parm.dss1_io.data;
2867 +  i = ic->parm.dss1_io.datalen;
2868 +  while ((i > 0) && (p - st < 530))
2869 +   { p += sprintf(p," %02x",(*p1++) & 0xFF);
2870 +     i--;
2871 +   }
2872 +  sprintf(p, "\n");
2873 +  put_info_buffer(st);
2874 +#endif
2875                     break;
2876   
2877                    default:
2878 Index: linux-2.4.35.4/drivers/isdn/divert/isdn_divert.h
2879 ===================================================================
2880 --- linux-2.4.35.4.orig/drivers/isdn/divert/isdn_divert.h       2007-12-15 05:19:39.658681057 +0100
2881 +++ linux-2.4.35.4/drivers/isdn/divert/isdn_divert.h    2007-12-15 05:19:55.523585147 +0100
2882 @@ -1,4 +1,4 @@
2883 -/* $Id: isdn_divert.h,v 1.1.4.1 2001/11/20 14:19:35 kai Exp $
2884 +/* $Id$
2885   *
2886   * Header for the diversion supplementary ioctl interface.
2887   *
2888 @@ -36,9 +36,10 @@
2889  #define DEFLECT_PROCEED   2  /* deflect when externally triggered */
2890  #define DEFLECT_ALERT     3  /* alert and deflect after delay */ 
2891  #define DEFLECT_REJECT    4  /* reject immediately */
2892 -#define DIVERT_ACTIVATE   5  /* diversion activate */
2893 -#define DIVERT_DEACTIVATE 6  /* diversion deactivate */
2894 -#define DIVERT_REPORT     7  /* interrogation result */ 
2895 +#define NETWORK_DIAL      5  /* dial a network interface */
2896 +#define DIVERT_ACTIVATE   16 /* diversion activate */
2897 +#define DIVERT_DEACTIVATE 17 /* diversion deactivate */
2898 +#define DIVERT_REPORT     18 /* interrogation result */ 
2899  #define DEFLECT_AUTODEL 255  /* only for internal use */ 
2900  
2901  #define DEFLECT_ALL_IDS   0xFFFFFFFF /* all drivers selected */
2902 @@ -60,6 +61,7 @@
2903                         2 = report call, send proceed, wait max waittime secs
2904                         3 = report call, alert and deflect after waittime 
2905                         4 = report call, reject immediately  
2906 +                       5 = dial net interface specified in to_nr  
2907                         actions 1-2 only take place if interface is opened 
2908                     */
2909     u_char waittime; /* maximum wait time for proceeding */ 
2910 Index: linux-2.4.35.4/drivers/isdn/eicon/Divas_mod.c
2911 ===================================================================
2912 --- linux-2.4.35.4.orig/drivers/isdn/eicon/Divas_mod.c  2007-12-15 05:19:39.666681515 +0100
2913 +++ linux-2.4.35.4/drivers/isdn/eicon/Divas_mod.c       2007-12-15 05:19:55.523585147 +0100
2914 @@ -20,6 +20,7 @@
2915  #include "adapter.h"
2916  #include "uxio.h"
2917  
2918 +#include <linux/isdn_compat.h>
2919  
2920  MODULE_DESCRIPTION("ISDN4Linux: Driver for Eicon Diva Server cards");
2921  MODULE_AUTHOR("Armin Schindler");
2922 Index: linux-2.4.35.4/drivers/isdn/eicon/common.c
2923 ===================================================================
2924 --- linux-2.4.35.4.orig/drivers/isdn/eicon/common.c     2007-12-15 05:19:39.670681741 +0100
2925 +++ linux-2.4.35.4/drivers/isdn/eicon/common.c  2007-12-15 05:19:55.523585147 +0100
2926 @@ -808,9 +808,7 @@
2927         
2928         while(i--)
2929         {
2930 -            if (card->state == DIA_RUNNING)
2931 -               DivaDoCardDpc(card);
2932 -            card++;
2933 +               DivaDoCardDpc(card++);
2934         }
2935  }
2936  
2937 Index: linux-2.4.35.4/drivers/isdn/eicon/eicon.h
2938 ===================================================================
2939 --- linux-2.4.35.4.orig/drivers/isdn/eicon/eicon.h      2007-12-15 05:19:39.678682197 +0100
2940 +++ linux-2.4.35.4/drivers/isdn/eicon/eicon.h   2007-12-15 05:19:55.523585147 +0100
2941 @@ -1,4 +1,4 @@
2942 -/* $Id: eicon.h,v 1.1.4.1 2001/11/20 14:19:35 kai Exp $
2943 +/* $Id: eicon.h,v 1.26 2001/09/24 13:22:47 kai Exp $
2944   *
2945   * ISDN low-level module for Eicon active ISDN-Cards.
2946   *
2947 @@ -347,19 +347,19 @@
2948  extern char *eicon_ctype_name[];
2949  
2950  
2951 -static inline void eicon_schedule_tx(eicon_card *card)
2952 +extern __inline__ void eicon_schedule_tx(eicon_card *card)
2953  {
2954          queue_task(&card->snd_tq, &tq_immediate);
2955          mark_bh(IMMEDIATE_BH);
2956  }
2957  
2958 -static inline void eicon_schedule_rx(eicon_card *card)
2959 +extern __inline__ void eicon_schedule_rx(eicon_card *card)
2960  {
2961          queue_task(&card->rcv_tq, &tq_immediate);
2962          mark_bh(IMMEDIATE_BH);
2963  }
2964  
2965 -static inline void eicon_schedule_ack(eicon_card *card)
2966 +extern __inline__ void eicon_schedule_ack(eicon_card *card)
2967  {
2968          queue_task(&card->ack_tq, &tq_immediate);
2969          mark_bh(IMMEDIATE_BH);
2970 Index: linux-2.4.35.4/drivers/isdn/eicon/eicon_dsp.h
2971 ===================================================================
2972 --- linux-2.4.35.4.orig/drivers/isdn/eicon/eicon_dsp.h  2007-12-15 05:19:39.686682655 +0100
2973 +++ linux-2.4.35.4/drivers/isdn/eicon/eicon_dsp.h       2007-12-15 05:19:55.523585147 +0100
2974 @@ -1,4 +1,4 @@
2975 -/* $Id: eicon_dsp.h,v 1.1.4.1 2001/11/20 14:19:35 kai Exp $
2976 +/* $Id: eicon_dsp.h,v 1.8 2001/09/24 13:22:47 kai Exp $
2977   *
2978   * ISDN lowlevel-module for Eicon active cards.
2979   * DSP definitions
2980 Index: linux-2.4.35.4/drivers/isdn/eicon/eicon_idi.c
2981 ===================================================================
2982 --- linux-2.4.35.4.orig/drivers/isdn/eicon/eicon_idi.c  2007-12-15 05:19:39.694683110 +0100
2983 +++ linux-2.4.35.4/drivers/isdn/eicon/eicon_idi.c       2007-12-15 05:19:55.527585376 +0100
2984 @@ -1,4 +1,4 @@
2985 -/* $Id: eicon_idi.c,v 1.1.4.1 2001/11/20 14:19:35 kai Exp $
2986 +/* $Id: eicon_idi.c,v 1.45 2001/11/07 22:35:48 kai Exp $
2987   *
2988   * ISDN lowlevel-module for Eicon active cards.
2989   * IDI interface 
2990 @@ -25,7 +25,7 @@
2991  
2992  #undef EICON_FULL_SERVICE_OKTETT
2993  
2994 -char *eicon_idi_revision = "$Revision: 1.1.4.1 $";
2995 +char *eicon_idi_revision = "$Revision: 1.45 $";
2996  
2997  eicon_manifbuf *manbuf;
2998  
2999 @@ -1583,6 +1583,37 @@
3000                 return;
3001         }
3002  
3003 +#if 0 
3004 +       eicon_sff_dochead *doc = (eicon_sff_dochead *)skb->data;
3005 +       eicon_sff_pagehead *page = (eicon_sff_pagehead *)skb->data + sizeof(eicon_sff_dochead);
3006 +
3007 +       printk(KERN_DEBUG"SFF: doc %d / page %d (skb : %d)\n", 
3008 +               sizeof(eicon_sff_dochead), 
3009 +               sizeof(eicon_sff_pagehead), skb->len);
3010 +
3011 +       if (skb->len >= sizeof(eicon_sff_dochead)) {
3012 +               printk(KERN_DEBUG"SFF: id = 0x%x\n", doc->id);
3013 +               printk(KERN_DEBUG"SFF: version = 0x%x\n", doc->version);
3014 +               printk(KERN_DEBUG"SFF: reserved1 = 0x%x\n", doc->reserved1);
3015 +               printk(KERN_DEBUG"SFF: userinfo = 0x%x\n", doc->userinfo);
3016 +               printk(KERN_DEBUG"SFF: pagecount = 0x%x\n", doc->pagecount);
3017 +               printk(KERN_DEBUG"SFF: off1pagehead = 0x%x\n", doc->off1pagehead);
3018 +               printk(KERN_DEBUG"SFF: offnpagehead = 0x%x\n", doc->offnpagehead);
3019 +               printk(KERN_DEBUG"SFF: offdocend = 0x%x\n", doc->offdocend);
3020 +       }
3021 +       if (skb->len >= (sizeof(eicon_sff_dochead) + sizeof(eicon_sff_pagehead))) {
3022 +               printk(KERN_DEBUG"SFFp: id = 0x%x\n", page->pageheadid);
3023 +               printk(KERN_DEBUG"SFFp: len = 0x%x\n", page->pageheadlen);
3024 +               printk(KERN_DEBUG"SFFp: resvert = 0x%x\n", page->resvert);
3025 +               printk(KERN_DEBUG"SFFp: reshoriz = 0x%x\n", page->reshoriz);
3026 +               printk(KERN_DEBUG"SFFp: coding = 0x%x\n", page->coding);
3027 +               printk(KERN_DEBUG"SFFp: reserved2 = 0x%x\n", page->reserved2);
3028 +               printk(KERN_DEBUG"SFFp: linelength = 0x%x\n", page->linelength);
3029 +               printk(KERN_DEBUG"SFFp: pagelength = 0x%x\n", page->pagelength);
3030 +               printk(KERN_DEBUG"SFFp: offprevpage = 0x%x\n", page->offprevpage);
3031 +               printk(KERN_DEBUG"SFFp: offnextpage = 0x%x\n", page->offnextpage);
3032 +       }
3033 +#endif
3034  
3035         
3036         if (chan->fax->direction == ISDN_TTY_FAX_CONN_IN) {
3037 @@ -2054,8 +2085,7 @@
3038                                 OutBuf.Len++;
3039                         } else {
3040                                 *OutBuf.Next++ = 0;
3041 -                               *(__u16 *) OutBuf.Next = (__u16) LineBuf.Len;
3042 -                               OutBuf.Next += sizeof(__u16);
3043 +                               *((__u16 *) OutBuf.Next)++ = (__u16) LineBuf.Len;
3044                                 OutBuf.Len += 3;
3045                         }
3046                         memcpy(OutBuf.Next, LineBuf.Data, LineBuf.Len);
3047 @@ -2385,6 +2415,12 @@
3048                                 } else {
3049                                         if (chan->e.B2Id)
3050                                                 idi_do_req(ccard, chan, REMOVE, 1);
3051 +#if 0
3052 +                                       if (chan->e.D3Id) {
3053 +                                               idi_do_req(ccard, chan, REMOVE, 0);
3054 +                                               idi_do_req(ccard, chan, ASSIGN, 0);
3055 +                                       }
3056 +#endif
3057                                         chan->statectrl &= ~WAITING_FOR_HANGUP;
3058                                         chan->statectrl &= ~IN_HOLD;
3059                                         if (chan->statectrl & HAVE_CONN_REQ) {
3060 Index: linux-2.4.35.4/drivers/isdn/eicon/eicon_idi.h
3061 ===================================================================
3062 --- linux-2.4.35.4.orig/drivers/isdn/eicon/eicon_idi.h  2007-12-15 05:19:39.698683336 +0100
3063 +++ linux-2.4.35.4/drivers/isdn/eicon/eicon_idi.h       2007-12-15 05:19:55.527585376 +0100
3064 @@ -1,4 +1,4 @@
3065 -/* $Id: eicon_idi.h,v 1.1.4.1 2001/11/20 14:19:35 kai Exp $
3066 +/* $Id: eicon_idi.h,v 1.12 2001/09/24 13:22:47 kai Exp $
3067   *
3068   * ISDN lowlevel-module for the Eicon active cards.
3069   * IDI-Interface
3070 Index: linux-2.4.35.4/drivers/isdn/eicon/eicon_io.c
3071 ===================================================================
3072 --- linux-2.4.35.4.orig/drivers/isdn/eicon/eicon_io.c   2007-12-15 05:19:39.706683794 +0100
3073 +++ linux-2.4.35.4/drivers/isdn/eicon/eicon_io.c        2007-12-15 05:19:55.531585602 +0100
3074 @@ -1,4 +1,4 @@
3075 -/* $Id: eicon_io.c,v 1.1.4.1 2001/11/20 14:19:35 kai Exp $
3076 +/* $Id: eicon_io.c,v 1.15 2001/09/24 13:22:47 kai Exp $
3077   *
3078   * ISDN low-level module for Eicon active ISDN-Cards.
3079   * Code for communicating with hardware.
3080 Index: linux-2.4.35.4/drivers/isdn/eicon/eicon_isa.c
3081 ===================================================================
3082 --- linux-2.4.35.4.orig/drivers/isdn/eicon/eicon_isa.c  2007-12-15 05:19:39.714684250 +0100
3083 +++ linux-2.4.35.4/drivers/isdn/eicon/eicon_isa.c       2007-12-15 05:19:55.531585602 +0100
3084 @@ -1,4 +1,4 @@
3085 -/* $Id: eicon_isa.c,v 1.1.4.1 2001/11/20 14:19:35 kai Exp $
3086 +/* $Id: eicon_isa.c,v 1.18 2001/11/07 22:35:48 kai Exp $
3087   *
3088   * ISDN low-level module for Eicon active ISDN-Cards.
3089   * Hardware-specific code for old ISA cards.
3090 @@ -20,7 +20,7 @@
3091  #define release_shmem release_region
3092  #define request_shmem request_region
3093  
3094 -char *eicon_isa_revision = "$Revision: 1.1.4.1 $";
3095 +char *eicon_isa_revision = "$Revision: 1.18 $";
3096  
3097  #undef EICON_MCA_DEBUG
3098  
3099 @@ -38,8 +38,12 @@
3100  static void
3101  eicon_isa_release_shmem(eicon_isa_card *card) {
3102         if (card->mvalid) {
3103 +#ifdef COMPAT_HAS_ISA_IOREMAP
3104                 iounmap(card->shmem);
3105                 release_mem_region(card->physmem, card->ramsize);
3106 +#else
3107 +               release_shmem((unsigned long)card->shmem, card->ramsize);
3108 +#endif
3109         }
3110         card->mvalid = 0;
3111  }
3112 @@ -94,12 +98,20 @@
3113                          Mem, Id);
3114                 return -1;
3115         }
3116 +#ifdef COMPAT_HAS_ISA_IOREMAP
3117         if (check_mem_region(Mem, RAMSIZE)) {
3118 +#else
3119 +       if (check_shmem(Mem, RAMSIZE)) {
3120 +#endif
3121                 printk(KERN_WARNING "eicon_isa_boot: memory at 0x%x already in use.\n", Mem);
3122                 return -1;
3123         }
3124  
3125 +#ifdef COMPAT_HAS_ISA_IOREMAP
3126         amem = (unsigned long) ioremap(Mem, RAMSIZE);
3127 +#else
3128 +       amem = (unsigned long) Mem;
3129 +#endif
3130          writew(0x55aa, amem + 0x402);
3131          if (readw(amem + 0x402) != 0x55aa) primary = 0;
3132         writew(0, amem + 0x402);
3133 @@ -109,12 +121,16 @@
3134         if (primary) {
3135                 printk(KERN_INFO "Eicon: assuming pri card at 0x%x\n", Mem);
3136                 writeb(0, amem + 0x3ffe);
3137 +#ifdef COMPAT_HAS_ISA_IOREMAP
3138                 iounmap((unsigned char *)amem);
3139 +#endif
3140                 return EICON_CTYPE_ISAPRI;
3141         } else {
3142                 printk(KERN_INFO "Eicon: assuming bri card at 0x%x\n", Mem);
3143                 writeb(0, amem + 0x400);
3144 +#ifdef COMPAT_HAS_ISA_IOREMAP
3145                 iounmap((unsigned char *)amem);
3146 +#endif
3147                 return EICON_CTYPE_ISABRI;
3148         }
3149         return -1;
3150 @@ -151,6 +167,7 @@
3151         else
3152                 card->ramsize  = RAMSIZE;
3153  
3154 +#ifdef COMPAT_HAS_ISA_IOREMAP
3155         if (check_mem_region(card->physmem, card->ramsize)) {
3156                 printk(KERN_WARNING "eicon_isa_boot: memory at 0x%lx already in use.\n",
3157                         card->physmem);
3158 @@ -159,6 +176,16 @@
3159         }
3160         request_mem_region(card->physmem, card->ramsize, "Eicon ISA ISDN");
3161         card->shmem = (eicon_isa_shmem *) ioremap(card->physmem, card->ramsize);
3162 +#else
3163 +       /* Register shmem */
3164 +       if (check_shmem((unsigned long)card->shmem, card->ramsize)) {
3165 +               printk(KERN_WARNING "eicon_isa_boot: memory at 0x%lx already in use.\n",
3166 +                       (unsigned long)card->shmem);
3167 +               kfree(code);
3168 +               return -EBUSY;
3169 +       }
3170 +       request_shmem((unsigned long)card->shmem, card->ramsize, "Eicon ISA ISDN");
3171 +#endif
3172  #ifdef EICON_MCA_DEBUG
3173         printk(KERN_INFO "eicon_isa_boot: card->ramsize = %d.\n", card->ramsize);
3174  #endif
3175 Index: linux-2.4.35.4/drivers/isdn/eicon/eicon_isa.h
3176 ===================================================================
3177 --- linux-2.4.35.4.orig/drivers/isdn/eicon/eicon_isa.h  2007-12-15 05:19:39.722684705 +0100
3178 +++ linux-2.4.35.4/drivers/isdn/eicon/eicon_isa.h       2007-12-15 05:19:55.531585602 +0100
3179 @@ -1,4 +1,4 @@
3180 -/* $Id: eicon_isa.h,v 1.1.4.1 2001/11/20 14:19:35 kai Exp $
3181 +/* $Id: eicon_isa.h,v 1.11 2001/09/24 13:22:47 kai Exp $
3182   *
3183   * ISDN low-level module for Eicon active ISDN-Cards.
3184   *
3185 Index: linux-2.4.35.4/drivers/isdn/eicon/eicon_mod.c
3186 ===================================================================
3187 --- linux-2.4.35.4.orig/drivers/isdn/eicon/eicon_mod.c  2007-12-15 05:19:39.726684934 +0100
3188 +++ linux-2.4.35.4/drivers/isdn/eicon/eicon_mod.c       2007-12-15 05:19:55.531585602 +0100
3189 @@ -1,4 +1,4 @@
3190 -/* $Id: eicon_mod.c,v 1.1.4.1 2001/11/20 14:19:35 kai Exp $
3191 +/* $Id: eicon_mod.c,v 1.44 2001/11/20 09:48:25 armin Exp $
3192   *
3193   * ISDN lowlevel-module for Eicon active cards.
3194   * 
3195 @@ -44,7 +44,7 @@
3196  static eicon_card *cards = (eicon_card *) NULL;   /* glob. var , contains
3197                                                       start of card-list   */
3198  
3199 -static char *eicon_revision = "$Revision: 1.1.4.1 $";
3200 +static char *eicon_revision = "$Revision: 1.44 $";
3201  
3202  extern char *eicon_pci_revision;
3203  extern char *eicon_isa_revision;
3204 @@ -639,6 +639,18 @@
3205  static int
3206  if_writecmd(const u_char * buf, int len, int user, int id, int channel)
3207  {
3208 +#if 0
3209 +       /* Not yet used */
3210 +        eicon_card *card = eicon_findcard(id);
3211 +
3212 +        if (card) {
3213 +                if (!card->flags & EICON_FLAGS_RUNNING)
3214 +                        return (len);
3215 +                return (len);
3216 +        }
3217 +        printk(KERN_ERR
3218 +               "eicon: if_writecmd called with invalid driverId!\n");
3219 +#endif
3220          return (len);
3221  }
3222  
3223 @@ -665,11 +677,8 @@
3224                         else
3225                                 cnt = skb->len;
3226  
3227 -                       if (user) {
3228 -                               spin_unlock_irqrestore(&eicon_lock, flags);
3229 +                       if (user)
3230                                 copy_to_user(p, skb->data, cnt);
3231 -                               spin_lock_irqsave(&eicon_lock, flags);
3232 -                       }
3233                         else
3234                                 memcpy(p, skb->data, cnt);
3235  
3236 @@ -1459,6 +1468,7 @@
3237  
3238  #ifndef MODULE
3239  
3240 +#ifdef COMPAT_HAS_NEW_SETUP
3241  static int __init
3242  eicon_setup(char *line)
3243  {
3244 @@ -1467,6 +1477,12 @@
3245         char *str;
3246  
3247         str = get_options(line, 4, ints);
3248 +#else
3249 +void
3250 +eicon_setup(char *str, int *ints)
3251 +{
3252 +        int i, argc;
3253 +#endif
3254  
3255          argc = ints[0];
3256          i = 1;
3257 @@ -1494,9 +1510,13 @@
3258  #else
3259         printk(KERN_INFO "Eicon ISDN active driver setup\n");
3260  #endif
3261 +#ifdef COMPAT_HAS_NEW_SETUP
3262         return(1);
3263  }
3264  __setup("eicon=", eicon_setup);
3265 +#else
3266 +}
3267 +#endif
3268  
3269  #endif /* MODULE */
3270  
3271 Index: linux-2.4.35.4/drivers/isdn/eicon/eicon_pci.c
3272 ===================================================================
3273 --- linux-2.4.35.4.orig/drivers/isdn/eicon/eicon_pci.c  2007-12-15 05:19:39.734685390 +0100
3274 +++ linux-2.4.35.4/drivers/isdn/eicon/eicon_pci.c       2007-12-15 05:19:55.535585832 +0100
3275 @@ -1,4 +1,4 @@
3276 -/* $Id: eicon_pci.c,v 1.1.4.1 2001/11/20 14:19:35 kai Exp $
3277 +/* $Id: eicon_pci.c,v 1.18 2001/09/24 13:22:47 kai Exp $
3278   *
3279   * ISDN low-level module for Eicon active ISDN-Cards.
3280   * Hardware-specific code for PCI cards.
3281 @@ -24,7 +24,7 @@
3282  #include "adapter.h"
3283  #include "uxio.h"
3284  
3285 -char *eicon_pci_revision = "$Revision: 1.1.4.1 $";
3286 +char *eicon_pci_revision = "$Revision: 1.18 $";
3287  
3288  #if CONFIG_PCI          /* intire stuff is only for PCI */
3289  #ifdef CONFIG_ISDN_DRV_EICON_PCI
3290 Index: linux-2.4.35.4/drivers/isdn/eicon/eicon_pci.h
3291 ===================================================================
3292 --- linux-2.4.35.4.orig/drivers/isdn/eicon/eicon_pci.h  2007-12-15 05:19:39.742685845 +0100
3293 +++ linux-2.4.35.4/drivers/isdn/eicon/eicon_pci.h       2007-12-15 05:19:55.535585832 +0100
3294 @@ -1,4 +1,4 @@
3295 -/* $Id: eicon_pci.h,v 1.1.4.1 2001/11/20 14:19:35 kai Exp $
3296 +/* $Id: eicon_pci.h,v 1.7 2001/09/24 13:22:47 kai Exp $
3297   *
3298   * ISDN low-level module for Eicon active ISDN-Cards (PCI part).
3299   *
3300 Index: linux-2.4.35.4/drivers/isdn/eicon/fourbri.c
3301 ===================================================================
3302 --- linux-2.4.35.4.orig/drivers/isdn/eicon/fourbri.c    2007-12-15 05:19:39.750686300 +0100
3303 +++ linux-2.4.35.4/drivers/isdn/eicon/fourbri.c 2007-12-15 05:19:55.535585832 +0100
3304 @@ -337,8 +337,7 @@
3305  static int diva_server_4bri_start(card_t *card, byte *channels)
3306  {
3307         byte *ctl;
3308 -       byte *shared;
3309 -       int i;
3310 +       byte *shared, i;
3311         int adapter_num;
3312  
3313         DPRINTF(("divas: start Diva Server 4BRI"));
3314 Index: linux-2.4.35.4/drivers/isdn/eicon/kprintf.c
3315 ===================================================================
3316 --- linux-2.4.35.4.orig/drivers/isdn/eicon/kprintf.c    2007-12-15 05:19:39.754686529 +0100
3317 +++ linux-2.4.35.4/drivers/isdn/eicon/kprintf.c 2007-12-15 05:19:55.535585832 +0100
3318 @@ -18,6 +18,468 @@
3319  #include "divalog.h"
3320  #include "uxio.h"
3321  
3322 +/*
3323 + * Implementation of printf and sprintf for kernel
3324 + */
3325 +
3326 +#define MAX_BUFF    (80)        /* limit size of temporary buffers */
3327 +
3328 +#define WRITE_CHAR(BUFFER, SIZE, C) \
3329 +  if (--(SIZE) < 0) { (BUFFER)--; *(BUFFER) = '\0'; return; } *(BUFFER)++ = (C)
3330 +
3331 +
3332 +/*
3333 + * convert a number to decimal ASCII
3334 + */
3335 +
3336 +static
3337 +void    do_decimal( char            *temp,
3338 +                    int             temp_len,
3339 +                    unsigned int    value,
3340 +                    char            *s)
3341 +
3342 +{
3343 +    int     i;
3344 +
3345 +    temp[0] = '\0';
3346 +
3347 +    for (i = 1; i < temp_len; i++)
3348 +    {
3349 +        temp[i] = (char) ((value % 10) + (int) '0');
3350 +        value /= 10;
3351 +    }
3352 +
3353 +    for (i = (temp_len - 1); temp[i] == '0'; i--)
3354 +    {
3355 +        ;
3356 +    }
3357 +
3358 +    if (i == 0)
3359 +    {
3360 +        i++;
3361 +    }
3362 +
3363 +    while (i >= 0)
3364 +    {
3365 +        *s++ = temp[i--];
3366 +    }
3367 +
3368 +    return;
3369 +}
3370 +
3371 +/*
3372 + * convert a number to octal ASCII
3373 + */
3374 +
3375 +static
3376 +void    do_octal(   char            *temp,
3377 +                    unsigned int    value,
3378 +                    char            *s)
3379 +
3380 +{
3381 +    int     i;
3382 +
3383 +    temp[0] = '\0';
3384 +
3385 +    for (i = 1; i <= 11; i++)
3386 +    {
3387 +        temp[i] = (char) ((value & 07) + (int) '0');
3388 +        value >>= 3;
3389 +    }
3390 +    temp[11] &= '3';
3391 +
3392 +    for (i = 11; temp[i] == '0'; i--)
3393 +    {
3394 +        ;
3395 +    }
3396 +
3397 +    if (i == 0)
3398 +    {
3399 +        i++;
3400 +    }
3401 +
3402 +    while (i >= 0)
3403 +    {
3404 +        *s++ = temp[i--];
3405 +    }
3406 +
3407 +    return;
3408 +}
3409 +
3410 +/*
3411 + * convert a number to hex ASCII
3412 + */
3413 +
3414 +static
3415 +void    do_hex( char            *temp,
3416 +                unsigned int    value,
3417 +                char            *s)
3418 +
3419 +{
3420 +    int     i;
3421 +    static
3422 +    char    *dec_to_hex = "0123456789abcdef";
3423 +
3424 +    temp[0] = '\0';
3425 +
3426 +    for (i = 1; i <= 8; i++)
3427 +    {
3428 +        temp[i] = dec_to_hex[value & 0x0f];
3429 +        value >>= 4;
3430 +    }
3431 +
3432 +    for (i = 8; temp[i] == '0'; i--)
3433 +    {
3434 +        ;
3435 +    }
3436 +
3437 +    if (i == 0)
3438 +    {
3439 +        i++;
3440 +    }
3441 +
3442 +    while (i >= 0)
3443 +    {
3444 +        *s++ = temp[i--];
3445 +    }
3446 +
3447 +    return;
3448 +}
3449 +
3450 +/*
3451 + * convert a buffer to ASCII HEX
3452 + */
3453 +
3454 +static
3455 +void    do_buffer(  char    *buffer,
3456 +                    int     length,
3457 +                    char    *s)
3458 +
3459 +{
3460 +    static
3461 +    char    hex_char [] = "0123456789abcdef";
3462 +    char    *b = buffer;
3463 +    int     hex_byte;
3464 +    int     nybble;
3465 +
3466 +    length = (length >= ((MAX_BUFF / 3) + 1)) ? (MAX_BUFF / 3) : length;
3467 +
3468 +    while (length)
3469 +    {
3470 +        hex_byte = (int) *b++;
3471 +        nybble = (hex_byte >> 4) & 0xf;
3472 +        *s++ = hex_char[nybble];
3473 +        nybble = hex_byte & 0xf;
3474 +        *s++ = hex_char[nybble];
3475 +        *s++ = ' ';
3476 +        length--;
3477 +    }
3478 +    *s = '\0';
3479 +
3480 +    return;
3481 +}
3482 +
3483 +/*
3484 + * Body of sprintf function: behaves just like standard sprintf, except we
3485 + * have an extra argument (buffer size) which we use to ensure we don't
3486 + * overflow
3487 + */
3488 +
3489 +void    Divas_vsprintf(   char    *buffer,
3490 +                    int     size,
3491 +                    char    *fmt,
3492 +                    va_list argptr)
3493 +
3494 +{
3495 +    char        c;          /* single character buffer */
3496 +    int         i;          /* handy scratch counter */
3497 +    int         f;          /* format character (after %) */
3498 +    char        *str;       /* pointer into string */
3499 +    char        temp[20];   /* temp buffer used in printing numbers */
3500 +    char        string[MAX_BUFF]; /* output from number conversion */
3501 +    int         length;     /* length of string "str" */
3502 +    char        fill;       /* fill character ' ' or '0' */
3503 +    boolean_t   leftjust;   /* TRUE if left justified, else right justified */
3504 +    int         fmax, fmin; /* field specifiers % MIN . MAX s */
3505 +    int         leading;    /* number of leading/trailing fill characters */
3506 +    char        sign;       /* set to '-' for negative decimals */
3507 +    int         number;     /* numeric argument */
3508 +
3509 +    char        *buff_ptr;  /* pointer to user's buffer of hex data */
3510 +    int         buff_len;   /* length of hex data */
3511 +
3512 +    /* make sure we have somthing to write into */
3513 +
3514 +    if ((!buffer) || (size <= 0))
3515 +    {
3516 +        return;
3517 +    }
3518 +
3519 +    while (TRUE)
3520 +    {
3521 +        /* echo characters until end or '%' encountered */
3522 +
3523 +        while ((c = *fmt++) != '%')
3524 +        {
3525 +            if (!c)
3526 +            {
3527 +                *buffer = '\0';
3528 +                return;
3529 +            }
3530 +            WRITE_CHAR(buffer, size, c);
3531 +        }
3532 +
3533 +        /* echo %% as % */
3534 +
3535 +        if (*fmt == '%')
3536 +        {
3537 +            WRITE_CHAR(buffer, size, *fmt);
3538 +            continue;
3539 +        }
3540 +
3541 +        /* %- turns on left-justify */
3542 +
3543 +        if ((leftjust = (boolean_t) ((*fmt == '-') ? TRUE : FALSE)))
3544 +        {
3545 +            fmt++;
3546 +        }
3547 +
3548 +        /* %0 turns on zero filling */
3549 +
3550 +        if (*fmt == '0')
3551 +        {
3552 +            fill = '0';
3553 +        }
3554 +        else
3555 +        {
3556 +            fill = ' ';
3557 +        }
3558 +
3559 +        /* minium field width specifier for %d, u, x, c, s */
3560 +
3561 +        fmin = 0;
3562 +
3563 +        if (*fmt == '*')
3564 +        {
3565 +            fmin = va_arg(argptr, int);
3566 +            fmt++;
3567 +        }
3568 +        else
3569 +        {
3570 +            while ('0' <= *fmt && *fmt <= '9')
3571 +            {
3572 +                fmin = (fmin * 10) + (*fmt++ - '0');
3573 +            }
3574 +        }
3575 +
3576 +        /* maximum string width specifier for %s */
3577 +
3578 +        fmax = 0;
3579 +
3580 +        if (*fmt == '.')
3581 +        {
3582 +            if (*(++fmt) == '*')
3583 +            {
3584 +                fmax = va_arg(argptr, int);
3585 +                fmt++;
3586 +            }
3587 +            else
3588 +            {
3589 +                while ('0' <= *fmt && *fmt <= '9')
3590 +                {
3591 +                    fmax = (fmax * 10) + (*fmt++ - '0');
3592 +                }
3593 +            }
3594 +        }
3595 +
3596 +        /* skip over 'l' option (ints are assumed same size as longs) */
3597 +
3598 +        if (*fmt == 'l')
3599 +        {
3600 +            fmt++;
3601 +        }
3602 +
3603 +        /* get the format chacater */
3604 +
3605 +        if (!(f = *fmt++))
3606 +        {
3607 +            WRITE_CHAR(buffer, size, '%');
3608 +            *buffer = '\0';
3609 +            return;
3610 +        }
3611 +
3612 +        sign = '\0';        /* sign == '-' for negative decimal */
3613 +
3614 +        str = string;
3615 +
3616 +        switch (f)
3617 +        {
3618 +        case 'c' :
3619 +            string[0] = (char) va_arg(argptr, int);
3620 +            string[1] = '\0';
3621 +            fmax = 0;
3622 +            fill = ' ';
3623 +            break;
3624 +
3625 +        case 's' :
3626 +            str = va_arg(argptr, char *);
3627 +            fill = ' ';
3628 +            break;
3629 +
3630 +        case 'D' :
3631 +        case 'd' :
3632 +            number = va_arg(argptr, int);
3633 +            if (number < 0)
3634 +            {
3635 +                sign = '-';
3636 +                number = -number;
3637 +            }
3638 +            do_decimal(temp, DIM(temp), (unsigned int) number, str);
3639 +            fmax = 0;
3640 +            break;
3641 +
3642 +        case 'U' :
3643 +        case 'u' :
3644 +            number = va_arg(argptr, int);
3645 +            do_decimal(temp, DIM(temp), (unsigned int) number, str);
3646 +            fmax = 0;
3647 +            break;
3648 +
3649 +        case 'O' :
3650 +        case 'o' :
3651 +            number = va_arg(argptr, int);
3652 +            do_octal(temp, (unsigned int) number, str);
3653 +            fmax = 0;
3654 +            break;
3655 +
3656 +        case 'X' :
3657 +        case 'x' :
3658 +            number = va_arg(argptr, int);
3659 +            do_hex(temp, (unsigned int) number, str);
3660 +            fmax = 0;
3661 +            break;
3662 +
3663 +        case 'H' :
3664 +        case 'h' :
3665 +            buff_ptr = va_arg(argptr, char *);
3666 +            buff_len = va_arg(argptr, int);
3667 +            do_buffer(buff_ptr, buff_len, str);
3668 +            fmax = 0;
3669 +            break;
3670 +
3671 +        default :
3672 +            WRITE_CHAR(buffer, size, ((char) f));
3673 +            break;
3674 +        }
3675 +
3676 +        /* get the length of the string */
3677 +
3678 +        length = 0;
3679 +        while (str[length])
3680 +        {
3681 +            length++;
3682 +        }
3683 +
3684 +        /* make sure we have fmax and fmin values that are O.K. */
3685 +
3686 +        if (fmin > DIM(string) || fmin < 0)
3687 +        {
3688 +            fmin = 0;
3689 +        }
3690 +
3691 +        if (fmax > DIM(string) || fmax < 0)
3692 +        {
3693 +            fmax = 0;
3694 +        }
3695 +
3696 +        /* figure out how many leading characters thare are */
3697 +
3698 +        leading = 0;
3699 +
3700 +        if (fmax || fmin)
3701 +        {
3702 +            if (fmax)
3703 +            {
3704 +                if (length > fmax)
3705 +                {
3706 +                    length = fmax;
3707 +                }
3708 +            }
3709 +
3710 +            if (fmin)
3711 +            {
3712 +                leading = fmin - length;
3713 +            }
3714 +
3715 +            if (sign == '-')
3716 +            {
3717 +                leading--;
3718 +            }
3719 +        }
3720 +
3721 +        /* output sign now, if fill is numeric */
3722 +
3723 +        if (sign == '-' && fill == '0')
3724 +        {
3725 +            WRITE_CHAR(buffer, size, '-');
3726 +        }
3727 +
3728 +        /* if right justified, output fill characters */
3729 +
3730 +        if (!leftjust)
3731 +        {
3732 +            for (i = 0; i < leading; i++)
3733 +            {
3734 +                WRITE_CHAR(buffer, size, fill);
3735 +            }
3736 +        }
3737 +
3738 +        /* output sign now, if fill is spaces */
3739 +
3740 +        if (sign == '-' && fill == ' ')
3741 +        {
3742 +            WRITE_CHAR(buffer, size, '-');
3743 +        }
3744 +
3745 +        /* now the actual value */
3746 +
3747 +        for (i = 0; i < length; i++)
3748 +        {
3749 +            WRITE_CHAR(buffer, size, str[i]);
3750 +        }
3751 +
3752 +        /* if left justified, fill out with the fill character */
3753 +
3754 +        if (leftjust)
3755 +        {
3756 +            for (i = 0; i < leading; i++)
3757 +            {
3758 +                WRITE_CHAR(buffer, size, fill);
3759 +            }
3760 +        }
3761 +    }
3762 +}
3763 +
3764 +/*
3765 + * sprintf for kernel
3766 + *
3767 + * call our vsprintf assuming user has a big buffer....
3768 + */
3769 +
3770 +void    DivasSprintf(char *buffer, char *fmt, ...)
3771 +
3772 +{
3773 +    va_list     argptr;         /* pointer to additional args */
3774 +
3775 +    va_start(argptr, fmt);
3776 +
3777 +    Divas_vsprintf(buffer, 1024, fmt, argptr);
3778 +
3779 +    va_end(argptr);
3780 +
3781 +    return;
3782 +}
3783 +
3784  void    DivasPrintf(char  *fmt, ...)
3785  
3786  {
3787 @@ -40,7 +502,7 @@
3788  
3789      /* call vsprintf to format the user's information */
3790  
3791 -    vsnprintf(log.buffer, DIM(log.buffer), fmt, argptr);
3792 +    Divas_vsprintf(log.buffer, DIM(log.buffer), fmt, argptr);
3793  
3794      va_end(argptr);
3795  
3796 Index: linux-2.4.35.4/drivers/isdn/eicon/lincfg.c
3797 ===================================================================
3798 --- linux-2.4.35.4.orig/drivers/isdn/eicon/lincfg.c     2007-12-15 05:19:39.762686985 +0100
3799 +++ linux-2.4.35.4/drivers/isdn/eicon/lincfg.c  2007-12-15 05:19:55.535585832 +0100
3800 @@ -26,6 +26,9 @@
3801  #include "uxio.h"
3802  
3803  #include <linux/pci.h>
3804 +#ifndef COMPAT_HAS_2_2_PCI
3805 +#include <linux/pci_ids.h>
3806 +#endif
3807  #include <linux/kernel.h>
3808  #include <linux/ioport.h>
3809  
3810 Index: linux-2.4.35.4/drivers/isdn/eicon/linchr.c
3811 ===================================================================
3812 --- linux-2.4.35.4.orig/drivers/isdn/eicon/linchr.c     2007-12-15 05:19:39.770687440 +0100
3813 +++ linux-2.4.35.4/drivers/isdn/eicon/linchr.c  2007-12-15 05:19:55.539586058 +0100
3814 @@ -154,17 +154,17 @@
3815         klog_t *pHeadItem;
3816  
3817         if (BufferSize < sizeof(klog_t))
3818 +       {
3819 +               printk(KERN_WARNING "Divas: Divalog buffer specifed a size that is too small (%d - %d required)\n",
3820 +                       BufferSize, sizeof(klog_t));
3821                 return -EIO;
3822 +       }
3823  
3824         pHeadItem = (klog_t *) DivasLogFifoRead();
3825  
3826         if (pHeadItem)
3827         {
3828 -               if(copy_to_user(pClientLogBuffer, pHeadItem, sizeof(klog_t)))
3829 -               {
3830 -                       kfree(pHeadItem);
3831 -                       return -EFAULT;
3832 -               }
3833 +               memcpy(pClientLogBuffer, pHeadItem, sizeof(klog_t));
3834                 kfree(pHeadItem);
3835                 return sizeof(klog_t);
3836         }
3837 Index: linux-2.4.35.4/drivers/isdn/eicon/linio.c
3838 ===================================================================
3839 --- linux-2.4.35.4.orig/drivers/isdn/eicon/linio.c      2007-12-15 05:19:39.778687896 +0100
3840 +++ linux-2.4.35.4/drivers/isdn/eicon/linio.c   2007-12-15 05:19:55.539586058 +0100
3841 @@ -15,6 +15,7 @@
3842  #include <linux/slab.h>
3843  #include <linux/pci.h>
3844  #include <linux/delay.h>
3845 +#include <linux/isdn_compat.h>
3846  #undef N_DATA
3847  
3848  #include "uxio.h"
3849 Index: linux-2.4.35.4/drivers/isdn/hisax/Makefile
3850 ===================================================================
3851 --- linux-2.4.35.4.orig/drivers/isdn/hisax/Makefile     2007-12-15 05:19:39.786688354 +0100
3852 +++ linux-2.4.35.4/drivers/isdn/hisax/Makefile  2007-12-15 05:19:55.539586058 +0100
3853 @@ -4,20 +4,17 @@
3854  
3855  O_TARGET         := vmlinux-obj.o
3856  
3857 -# Define maximum number of cards
3858 -
3859 -EXTRA_CFLAGS      += -DHISAX_MAX_CARDS=$(CONFIG_HISAX_MAX_CARDS)
3860 -
3861  # Objects that export symbols.
3862  
3863 -export-objs      := config.o hisax_isac.o isdnhdlc.o
3864 +export-objs      := config.o fsm.o hisax_isac.o
3865  
3866  # Multipart objects.
3867  
3868  list-multi       := hisax.o hisax_st5481.o
3869  hisax-objs       := config.o isdnl1.o tei.o isdnl2.o isdnl3.o \
3870                      lmgr.o q931.o callc.o fsm.o cert.o
3871 -hisax_st5481-objs := st5481_init.o st5481_usb.o st5481_d.o st5481_b.o
3872 +hisax_st5481-objs := st5481_init.o st5481_usb.o st5481_d.o st5481_b.o \
3873 +                    st5481_hdlc.o
3874  
3875  # Optional parts of multipart objects.
3876  hisax-objs-$(CONFIG_HISAX_EURO) += l3dss1.o
3877 @@ -33,7 +30,7 @@
3878  hisax-objs-$(CONFIG_HISAX_FRITZPCI) += avm_pci.o isac.o arcofi.o
3879  hisax-objs-$(CONFIG_HISAX_ELSA) += elsa.o isac.o arcofi.o hscx.o
3880  hisax-objs-$(CONFIG_HISAX_IX1MICROR2) += ix1_micro.o isac.o arcofi.o hscx.o
3881 -hisax-objs-$(CONFIG_HISAX_DIEHLDIVA) += diva.o isac.o arcofi.o hscx.o ipacx.o
3882 +hisax-objs-$(CONFIG_HISAX_DIEHLDIVA) += diva.o isac.o arcofi.o hscx.o
3883  hisax-objs-$(CONFIG_HISAX_ASUSCOM) += asuscom.o isac.o arcofi.o hscx.o
3884  hisax-objs-$(CONFIG_HISAX_TELEINT) += teleint.o isac.o arcofi.o hfc_2bs0.o
3885  hisax-objs-$(CONFIG_HISAX_SEDLBAUER) += sedlbauer.o isac.o arcofi.o hscx.o isar.o
3886 @@ -44,6 +41,7 @@
3887  hisax-objs-$(CONFIG_HISAX_HFCS) += hfcscard.o hfc_2bds0.o
3888  hisax-objs-$(CONFIG_HISAX_HFC_PCI) += hfc_pci.o
3889  hisax-objs-$(CONFIG_HISAX_HFC_SX) += hfc_sx.o
3890 +hisax-objs-$(CONFIG_HISAX_HFC_USB) += hfc_usbr.o
3891  hisax-objs-$(CONFIG_HISAX_NICCY) += niccy.o isac.o arcofi.o hscx.o
3892  hisax-objs-$(CONFIG_HISAX_ISURF) += isurf.o isac.o arcofi.o isar.o
3893  hisax-objs-$(CONFIG_HISAX_HSTSAPHIR) += saphir.o isac.o arcofi.o hscx.o
3894 @@ -51,7 +49,6 @@
3895  hisax-objs-$(CONFIG_HISAX_SCT_QUADRO) += bkm_a8.o isac.o arcofi.o hscx.o
3896  hisax-objs-$(CONFIG_HISAX_GAZEL) += gazel.o isac.o arcofi.o hscx.o
3897  hisax-objs-$(CONFIG_HISAX_W6692) += w6692.o
3898 -hisax-objs-$(CONFIG_HISAX_ENTERNOW_PCI) += enternow_pci.o amd7930_fn.o
3899  #hisax-objs-$(CONFIG_HISAX_TESTEMU) += testemu.o
3900  
3901  hisax-objs += $(sort $(hisax-objs-y))
3902 @@ -61,10 +58,9 @@
3903  obj-$(CONFIG_ISDN_DRV_HISAX)           += hisax.o
3904  obj-$(CONFIG_HISAX_SEDLBAUER_CS)       += sedlbauer_cs.o
3905  obj-$(CONFIG_HISAX_ELSA_CS)            += elsa_cs.o
3906 -obj-$(CONFIG_HISAX_AVM_A1_CS)          += avma1_cs.o
3907 -obj-$(CONFIG_HISAX_ST5481)             += hisax_st5481.o isdnhdlc.o
3908 -obj-$(CONFIG_HISAX_FRITZ_PCIPNP)        += hisax_isac.o hisax_fcpcipnp.o
3909 -obj-$(CONFIG_USB_AUERISDN)             += isdnhdlc.o
3910 +obj-$(CONFIG_HISAX_HFC_USB_CS)         += hfc_usb.o
3911 +obj-$(CONFIG_HISAX_ST5481)             += hisax_st5481.o
3912 +obj-$(CONFIG_HISAX_FRITZ_PCIPNP)        += hisax_fcpcipnp.o hisax_isac.o
3913  
3914  CERT := $(shell md5sum -c md5sums.asc >> /dev/null;echo $$?)
3915  CFLAGS_cert.o := -DCERTIFICATION=$(CERT)
3916 Index: linux-2.4.35.4/drivers/isdn/hisax/amd7930.c
3917 ===================================================================
3918 --- /dev/null   1970-01-01 00:00:00.000000000 +0000
3919 +++ linux-2.4.35.4/drivers/isdn/hisax/amd7930.c 2007-12-15 05:19:55.539586058 +0100
3920 @@ -0,0 +1,755 @@
3921 +/* $Id: amd7930.c,v 1.8 2001/09/24 13:22:55 kai Exp $
3922 + *
3923 + * HiSax ISDN driver - chip specific routines for AMD 7930
3924 + *
3925 + * Author       Brent Baccala
3926 + * Copyright    by Brent Baccala <baccala@FreeSoft.org>
3927 + *
3928 + * This software may be used and distributed according to the terms
3929 + * of the GNU General Public License, incorporated herein by reference.
3930 + *
3931 + *    - Existing ISDN HiSax driver provides all the smarts
3932 + *    - it compiles, runs, talks to an isolated phone switch, connects
3933 + *      to a Cisco, pings go through
3934 + *    - AMD 7930 support only (no DBRI yet)
3935 + *    - no US NI-1 support (may not work on US phone system - untested)
3936 + *    - periodic packet loss, apparently due to lost interrupts
3937 + *    - ISDN sometimes freezes, requiring reboot before it will work again
3938 + *
3939 + * The code is unreliable enough to be consider alpha
3940 + *
3941 + * This file is (c) under GNU General Public License
3942 + *
3943 + * Advanced Micro Devices' Am79C30A is an ISDN/audio chip used in the
3944 + * SparcStation 1+.  The chip provides microphone and speaker interfaces
3945 + * which provide mono-channel audio at 8K samples per second via either
3946 + * 8-bit A-law or 8-bit mu-law encoding.  Also, the chip features an
3947 + * ISDN BRI Line Interface Unit (LIU), I.430 S/T physical interface,
3948 + * which performs basic D channel LAPD processing and provides raw
3949 + * B channel data.  The digital audio channel, the two ISDN B channels,
3950 + * and two 64 Kbps channels to the microprocessor are all interconnected
3951 + * via a multiplexer.
3952 + *
3953 + * This driver interfaces to the Linux HiSax ISDN driver, which performs
3954 + * all high-level Q.921 and Q.931 ISDN functions.  The file is not
3955 + * itself a hardware driver; rather it uses functions exported by
3956 + * the AMD7930 driver in the sparcaudio subsystem (drivers/sbus/audio),
3957 + * allowing the chip to be simultaneously used for both audio and ISDN data.
3958 + * The hardware driver does _no_ buffering, but provides several callbacks
3959 + * which are called during interrupt service and should therefore run quickly.
3960 + *
3961 + * D channel transmission is performed by passing the hardware driver the
3962 + * address and size of an skb's data area, then waiting for a callback
3963 + * to signal successful transmission of the packet.  A task is then
3964 + * queued to notify the HiSax driver that another packet may be transmitted.
3965 + *
3966 + * D channel reception is quite simple, mainly because of:
3967 + *   1) the slow speed of the D channel - 16 kbps, and
3968 + *   2) the presence of an 8- or 32-byte (depending on chip version) FIFO
3969 + *      to buffer the D channel data on the chip
3970 + * Worst case scenario of back-to-back packets with the 8 byte buffer
3971 + * at 16 kbps yields an service time of 4 ms - long enough to preclude
3972 + * the need for fancy buffering.  We queue a background task that copies
3973 + * data out of the receive buffer into an skb, and the hardware driver
3974 + * simply does nothing until we're done with the receive buffer and
3975 + * reset it for a new packet.
3976 + *
3977 + * B channel processing is more complex, because of:
3978 + *   1) the faster speed - 64 kbps,
3979 + *   2) the lack of any on-chip buffering (it interrupts for every byte), and
3980 + *   3) the lack of any chip support for HDLC encapsulation
3981 + *
3982 + * The HiSax driver can put each B channel into one of three modes -
3983 + * L1_MODE_NULL (channel disabled), L1_MODE_TRANS (transparent data relay),
3984 + * and L1_MODE_HDLC (HDLC encapsulation by low-level driver).
3985 + * L1_MODE_HDLC is the most common, used for almost all "pure" digital
3986 + * data sessions.  L1_MODE_TRANS is used for ISDN audio.
3987 + *
3988 + * HDLC B channel transmission is performed via a large buffer into
3989 + * which the skb is copied while performing HDLC bit-stuffing.  A CRC
3990 + * is computed and attached to the end of the buffer, which is then
3991 + * passed to the low-level routines for raw transmission.  Once
3992 + * transmission is complete, the hardware driver is set to enter HDLC
3993 + * idle by successive transmission of mark (all 1) bytes, waiting for
3994 + * the ISDN driver to prepare another packet for transmission and
3995 + * deliver it.
3996 + *
3997 + * HDLC B channel reception is performed via an X-byte ring buffer
3998 + * divided into N sections of X/N bytes each.  Defaults: X=256 bytes, N=4.
3999 + * As the hardware driver notifies us that each section is full, we
4000 + * hand it the next section and schedule a background task to peruse
4001 + * the received section, bit-by-bit, with an HDLC decoder.  As
4002 + * packets are detected, they are copied into a large buffer while
4003 + * decoding HDLC bit-stuffing.  The ending CRC is verified, and if
4004 + * it is correct, we alloc a new skb of the correct length (which we
4005 + * now know), copy the packet into it, and hand it to the upper layers.
4006 + * Optimization: for large packets, we hand the buffer (which also
4007 + * happens to be an skb) directly to the upper layer after an skb_trim,
4008 + * and alloc a new large buffer for future packets, thus avoiding a copy.
4009 + * Then we return to HDLC processing; state is saved between calls.
4010 + * 
4011 + */
4012 +
4013 +#define __NO_VERSION__
4014 +#include "hisax.h"
4015 +#include "../../sbus/audio/amd7930.h"
4016 +#include "isac.h"
4017 +#include "isdnl1.h"
4018 +#include "rawhdlc.h"
4019 +#include <linux/interrupt.h>
4020 +
4021 +static const char *amd7930_revision = "$Revision: 1.8 $";
4022 +
4023 +#define RCV_BUFSIZE    1024    /* Size of raw receive buffer in bytes */
4024 +#define RCV_BUFBLKS    4       /* Number of blocks to divide buffer into
4025 +                                * (must divide RCV_BUFSIZE) */
4026 +
4027 +static void Bchan_fill_fifo(struct BCState *, struct sk_buff *);
4028 +
4029 +static void
4030 +Bchan_xmt_bh(struct BCState *bcs)
4031 +{
4032 +       struct sk_buff *skb;
4033 +
4034 +       if (bcs->hw.amd7930.tx_skb != NULL) {
4035 +               dev_kfree_skb(bcs->hw.amd7930.tx_skb);
4036 +               bcs->hw.amd7930.tx_skb = NULL;
4037 +       }
4038 +
4039 +       if ((skb = skb_dequeue(&bcs->squeue))) {
4040 +               Bchan_fill_fifo(bcs, skb);
4041 +       } else {
4042 +               clear_bit(BC_FLG_BUSY, &bcs->Flag);
4043 +               bcs->event |= 1 << B_XMTBUFREADY;
4044 +               queue_task(&bcs->tqueue, &tq_immediate);
4045 +               mark_bh(IMMEDIATE_BH);
4046 +       }
4047 +}
4048 +
4049 +static void
4050 +Bchan_xmit_callback(struct BCState *bcs)
4051 +{
4052 +       queue_task(&bcs->hw.amd7930.tq_xmt, &tq_immediate);
4053 +       mark_bh(IMMEDIATE_BH);
4054 +}
4055 +
4056 +/* B channel transmission: two modes (three, if you count L1_MODE_NULL)
4057 + *
4058 + * L1_MODE_HDLC - We need to do HDLC encapsulation before transmiting
4059 + * the packet (i.e. make_raw_hdlc_data).  Since this can be a
4060 + * time-consuming operation, our completion callback just schedules
4061 + * a bottom half to do encapsulation for the next packet.  In between,
4062 + * the link will just idle
4063 + *
4064 + * L1_MODE_TRANS - Data goes through, well, transparent.  No HDLC encap,
4065 + * and we can't just let the link idle, so the "bottom half" actually
4066 + * gets called during the top half (it's our callback routine in this case),
4067 + * but it's a lot faster now since we don't call make_raw_hdlc_data
4068 + */
4069 +
4070 +static void
4071 +Bchan_fill_fifo(struct BCState *bcs, struct sk_buff *skb)
4072 +{
4073 +       struct IsdnCardState *cs = bcs->cs;
4074 +       int len;
4075 +
4076 +       if ((cs->debug & L1_DEB_HSCX) || (cs->debug & L1_DEB_HSCX_FIFO)) {
4077 +               char tmp[1024];
4078 +               char *t = tmp;
4079 +
4080 +               t += sprintf(t, "amd7930_fill_fifo %c cnt %d",
4081 +                            bcs->channel ? 'B' : 'A', skb->len);
4082 +               if (cs->debug & L1_DEB_HSCX_FIFO)
4083 +                       QuickHex(t, skb->data, skb->len);
4084 +               debugl1(cs, tmp);
4085 +       }
4086 +
4087 +       if (bcs->mode == L1_MODE_HDLC) {
4088 +               len = make_raw_hdlc_data(skb->data, skb->len,
4089 +                                        bcs->hw.amd7930.tx_buff, RAW_BUFMAX);
4090 +               if (len > 0)
4091 +                       amd7930_bxmit(0, bcs->channel,
4092 +                                     bcs->hw.amd7930.tx_buff, len,
4093 +                                     (void *) &Bchan_xmit_callback,
4094 +                                     (void *) bcs);
4095 +               dev_kfree_skb(skb);
4096 +       } else if (bcs->mode == L1_MODE_TRANS) {
4097 +               amd7930_bxmit(0, bcs->channel,
4098 +                             bcs->hw.amd7930.tx_buff, skb->len,
4099 +                             (void *) &Bchan_xmt_bh,
4100 +                             (void *) bcs);
4101 +               bcs->hw.amd7930.tx_skb = skb;
4102 +       } else {
4103 +               dev_kfree_skb(skb);
4104 +       }
4105 +}
4106 +
4107 +static void
4108 +Bchan_mode(struct BCState *bcs, int mode, int bc)
4109 +{
4110 +       struct IsdnCardState *cs = bcs->cs;
4111 +
4112 +       if (cs->debug & L1_DEB_HSCX) {
4113 +               char tmp[40];
4114 +               sprintf(tmp, "AMD 7930 mode %d bchan %d/%d",
4115 +                       mode, bc, bcs->channel);
4116 +               debugl1(cs, tmp);
4117 +       }
4118 +       bcs->mode = mode;
4119 +}
4120 +
4121 +/* Bchan_l2l1 is the entry point for upper layer routines that want to
4122 + * transmit on the B channel.  PH_DATA_REQ is a normal packet that
4123 + * we either start transmitting (if idle) or queue (if busy).
4124 + * PH_PULL_REQ can be called to request a callback message (PH_PULL_CNF)
4125 + * once the link is idle.  After a "pull" callback, the upper layer
4126 + * routines can use PH_PULL_IND to send data.
4127 + */
4128 +
4129 +static void
4130 +Bchan_l2l1(struct PStack *st, int pr, void *arg)
4131 +{
4132 +       struct sk_buff *skb = arg;
4133 +
4134 +       switch (pr) {
4135 +               case (PH_DATA_REQ):
4136 +                       if (test_bit(BC_FLG_BUSY, &st->l1.bcs->Flag)) {
4137 +                               skb_queue_tail(&st->l1.bcs->squeue, skb);
4138 +                       } else {
4139 +                               test_and_set_bit(BC_FLG_BUSY, &st->l1.bcs->Flag);
4140 +                               Bchan_fill_fifo(st->l1.bcs, skb);
4141 +                       }
4142 +                       break;
4143 +               case (PH_PULL_IND):
4144 +                       if (test_bit(BC_FLG_BUSY, &st->l1.bcs->Flag)) {
4145 +                               printk(KERN_WARNING "amd7930: this shouldn't happen\n");
4146 +                               break;
4147 +                       }
4148 +                       test_and_set_bit(BC_FLG_BUSY, &st->l1.bcs->Flag);
4149 +                       Bchan_fill_fifo(st->l1.bcs, skb);
4150 +                       break;
4151 +               case (PH_PULL_REQ):
4152 +                       if (!test_bit(BC_FLG_BUSY, &st->l1.bcs->Flag)) {
4153 +                               clear_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
4154 +                               st->l1.l1l2(st, PH_PULL_CNF, NULL);
4155 +                       } else
4156 +                               set_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
4157 +                       break;
4158 +       }
4159 +}
4160 +
4161 +/* Receiver callback and bottom half - decodes HDLC at leisure (if
4162 + * L1_MODE_HDLC) and passes newly received skb on via bcs->rqueue.  If
4163 + * a large packet is received, stick rv_skb (the buffer that the
4164 + * packet has been decoded into) on the receive queue and alloc a new
4165 + * (large) skb to act as buffer for future receives.  If a small
4166 + * packet is received, leave rv_skb alone, alloc a new skb of the
4167 + * correct size, and copy the packet into it
4168 + */
4169 +
4170 +static void
4171 +Bchan_recv_callback(struct BCState *bcs)
4172 +{
4173 +       struct amd7930_hw *hw = &bcs->hw.amd7930;
4174 +
4175 +       hw->rv_buff_in += RCV_BUFSIZE/RCV_BUFBLKS;
4176 +       hw->rv_buff_in %= RCV_BUFSIZE;
4177 +
4178 +       if (hw->rv_buff_in != hw->rv_buff_out) {
4179 +               amd7930_brecv(0, bcs->channel,
4180 +                             hw->rv_buff + hw->rv_buff_in,
4181 +                             RCV_BUFSIZE/RCV_BUFBLKS,
4182 +                             (void *) &Bchan_recv_callback, (void *) bcs);
4183 +       }
4184 +
4185 +       queue_task(&hw->tq_rcv, &tq_immediate);
4186 +       mark_bh(IMMEDIATE_BH);
4187 +}
4188 +
4189 +static void
4190 +Bchan_rcv_bh(struct BCState *bcs)
4191 +{
4192 +       struct IsdnCardState *cs = bcs->cs;
4193 +       struct amd7930_hw *hw = &bcs->hw.amd7930;
4194 +       struct sk_buff *skb;
4195 +       int len;
4196 +
4197 +       if (cs->debug & L1_DEB_HSCX) {
4198 +               char tmp[1024];
4199 +
4200 +               sprintf(tmp, "amd7930_Bchan_rcv (%d/%d)",
4201 +                       hw->rv_buff_in, hw->rv_buff_out);
4202 +               debugl1(cs, tmp);
4203 +               QuickHex(tmp, hw->rv_buff + hw->rv_buff_out,
4204 +                        RCV_BUFSIZE/RCV_BUFBLKS);
4205 +               debugl1(cs, tmp);
4206 +       }
4207 +
4208 +       do {
4209 +               if (bcs->mode == L1_MODE_HDLC) {
4210 +                       while ((len = read_raw_hdlc_data(hw->hdlc_state,
4211 +                                                        hw->rv_buff + hw->rv_buff_out, RCV_BUFSIZE/RCV_BUFBLKS,
4212 +                                                        hw->rv_skb->tail, HSCX_BUFMAX))) {
4213 +                               if (len > 0 && (cs->debug & L1_DEB_HSCX_FIFO)) {
4214 +                                       char tmp[1024];
4215 +                                       char *t = tmp;
4216 +
4217 +                                       t += sprintf(t, "amd7930_Bchan_rcv %c cnt %d", bcs->channel ? 'B' : 'A', len);
4218 +                                       QuickHex(t, hw->rv_skb->tail, len);
4219 +                                       debugl1(cs, tmp);
4220 +                               }
4221 +
4222 +                               if (len > HSCX_BUFMAX/2) {
4223 +                                       /* Large packet received */
4224 +
4225 +                                       if (!(skb = dev_alloc_skb(HSCX_BUFMAX))) {
4226 +                                               printk(KERN_WARNING "amd7930: receive out of memory");
4227 +                                       } else {
4228 +                                               skb_put(hw->rv_skb, len);
4229 +                                               skb_queue_tail(&bcs->rqueue, hw->rv_skb);
4230 +                                               hw->rv_skb = skb;
4231 +                                               bcs->event |= 1 << B_RCVBUFREADY;
4232 +                                               queue_task(&bcs->tqueue, &tq_immediate);
4233 +                                       }
4234 +                               } else if (len > 0) {
4235 +                                       /* Small packet received */
4236 +
4237 +                                       if (!(skb = dev_alloc_skb(len))) {
4238 +                                               printk(KERN_WARNING "amd7930: receive out of memory\n");
4239 +                                       } else {
4240 +                                               memcpy(skb_put(skb, len), hw->rv_skb->tail, len);
4241 +                                               skb_queue_tail(&bcs->rqueue, skb);
4242 +                                               bcs->event |= 1 << B_RCVBUFREADY;
4243 +                                               queue_task(&bcs->tqueue, &tq_immediate);
4244 +                                               mark_bh(IMMEDIATE_BH);
4245 +                                       }
4246 +                               } else {
4247 +                                       /* Reception Error */
4248 +                                       /* printk("amd7930: B channel receive error\n"); */
4249 +                               }
4250 +                       }
4251 +               } else if (bcs->mode == L1_MODE_TRANS) {
4252 +                       if (!(skb = dev_alloc_skb(RCV_BUFSIZE/RCV_BUFBLKS))) {
4253 +                               printk(KERN_WARNING "amd7930: receive out of memory\n");
4254 +                       } else {
4255 +                               memcpy(skb_put(skb, RCV_BUFSIZE/RCV_BUFBLKS),
4256 +                                      hw->rv_buff + hw->rv_buff_out,
4257 +                                      RCV_BUFSIZE/RCV_BUFBLKS);
4258 +                               skb_queue_tail(&bcs->rqueue, skb);
4259 +                               bcs->event |= 1 << B_RCVBUFREADY;
4260 +                               queue_task(&bcs->tqueue, &tq_immediate);
4261 +                               mark_bh(IMMEDIATE_BH);
4262 +                       }
4263 +               }
4264 +
4265 +               if (hw->rv_buff_in == hw->rv_buff_out) {
4266 +                       /* Buffer was filled up - need to restart receiver */
4267 +                       amd7930_brecv(0, bcs->channel,
4268 +                                     hw->rv_buff + hw->rv_buff_in,
4269 +                                     RCV_BUFSIZE/RCV_BUFBLKS,
4270 +                                     (void *) &Bchan_recv_callback,
4271 +                                     (void *) bcs);
4272 +               }
4273 +
4274 +               hw->rv_buff_out += RCV_BUFSIZE/RCV_BUFBLKS;
4275 +               hw->rv_buff_out %= RCV_BUFSIZE;
4276 +
4277 +       } while (hw->rv_buff_in != hw->rv_buff_out);
4278 +}
4279 +
4280 +static void
4281 +Bchan_close(struct BCState *bcs)
4282 +{
4283 +       struct sk_buff *skb;
4284 +
4285 +       Bchan_mode(bcs, 0, 0);
4286 +       amd7930_bclose(0, bcs->channel);
4287 +
4288 +       if (test_bit(BC_FLG_INIT, &bcs->Flag)) {
4289 +               skb_queue_purge(&bcs->rqueue);
4290 +               skb_queue_purge(&bcs->squeue);
4291 +       }
4292 +       test_and_clear_bit(BC_FLG_INIT, &bcs->Flag);
4293 +}
4294 +
4295 +static int
4296 +Bchan_open(struct BCState *bcs)
4297 +{
4298 +       struct amd7930_hw *hw = &bcs->hw.amd7930;
4299 +
4300 +       if (!test_and_set_bit(BC_FLG_INIT, &bcs->Flag)) {
4301 +               skb_queue_head_init(&bcs->rqueue);
4302 +               skb_queue_head_init(&bcs->squeue);
4303 +       }
4304 +       test_and_clear_bit(BC_FLG_BUSY, &bcs->Flag);
4305 +
4306 +       amd7930_bopen(0, bcs->channel, 0xff);
4307 +       hw->rv_buff_in = 0;
4308 +       hw->rv_buff_out = 0;
4309 +       hw->tx_skb = NULL;
4310 +       init_hdlc_state(hw->hdlc_state, 0);
4311 +       amd7930_brecv(0, bcs->channel,
4312 +                     hw->rv_buff + hw->rv_buff_in, RCV_BUFSIZE/RCV_BUFBLKS,
4313 +                     (void *) &Bchan_recv_callback, (void *) bcs);
4314 +
4315 +       bcs->event = 0;
4316 +       bcs->tx_cnt = 0;
4317 +       return (0);
4318 +}
4319 +
4320 +static void
4321 +Bchan_init(struct BCState *bcs)
4322 +{
4323 +       if (!(bcs->hw.amd7930.tx_buff = kmalloc(RAW_BUFMAX, GFP_ATOMIC))) {
4324 +               printk(KERN_WARNING
4325 +                      "HiSax: No memory for amd7930.tx_buff\n");
4326 +               return;
4327 +       }
4328 +       if (!(bcs->hw.amd7930.rv_buff = kmalloc(RCV_BUFSIZE, GFP_ATOMIC))) {
4329 +               printk(KERN_WARNING
4330 +                      "HiSax: No memory for amd7930.rv_buff\n");
4331 +               return;
4332 +       }
4333 +       if (!(bcs->hw.amd7930.rv_skb = dev_alloc_skb(HSCX_BUFMAX))) {
4334 +               printk(KERN_WARNING
4335 +                      "HiSax: No memory for amd7930.rv_skb\n");
4336 +               return;
4337 +       }
4338 +       if (!(bcs->hw.amd7930.hdlc_state = kmalloc(sizeof(struct hdlc_state),
4339 +                                                  GFP_ATOMIC))) {
4340 +               printk(KERN_WARNING
4341 +                      "HiSax: No memory for amd7930.hdlc_state\n");
4342 +               return;
4343 +       }
4344 +
4345 +       bcs->hw.amd7930.tq_rcv.sync = 0;
4346 +       bcs->hw.amd7930.tq_rcv.routine = (void (*)(void *)) &Bchan_rcv_bh;
4347 +       bcs->hw.amd7930.tq_rcv.data = (void *) bcs;
4348 +
4349 +       bcs->hw.amd7930.tq_xmt.sync = 0;
4350 +       bcs->hw.amd7930.tq_xmt.routine = (void (*)(void *)) &Bchan_xmt_bh;
4351 +       bcs->hw.amd7930.tq_xmt.data = (void *) bcs;
4352 +}
4353 +
4354 +static void
4355 +Bchan_manl1(struct PStack *st, int pr,
4356 +         void *arg)
4357 +{
4358 +       switch (pr) {
4359 +               case (PH_ACTIVATE_REQ):
4360 +                       test_and_set_bit(BC_FLG_ACTIV, &st->l1.bcs->Flag);
4361 +                       Bchan_mode(st->l1.bcs, st->l1.mode, st->l1.bc);
4362 +                       st->l1.l1man(st, PH_ACTIVATE_CNF, NULL);
4363 +                       break;
4364 +               case (PH_DEACTIVATE_REQ):
4365 +                       if (!test_bit(BC_FLG_BUSY, &st->l1.bcs->Flag))
4366 +                               Bchan_mode(st->l1.bcs, 0, 0);
4367 +                       test_and_clear_bit(BC_FLG_ACTIV, &st->l1.bcs->Flag);
4368 +                       break;
4369 +       }
4370 +}
4371 +
4372 +int
4373 +setstack_amd7930(struct PStack *st, struct BCState *bcs)
4374 +{
4375 +       if (Bchan_open(bcs))
4376 +               return (-1);
4377 +       st->l1.bcs = bcs;
4378 +       st->l2.l2l1 = Bchan_l2l1;
4379 +       st->ma.manl1 = Bchan_manl1;
4380 +       setstack_manager(st);
4381 +       bcs->st = st;
4382 +       return (0);
4383 +}
4384 +
4385 +
4386 +static void
4387 +amd7930_drecv_callback(void *arg, int error, unsigned int count)
4388 +{
4389 +       struct IsdnCardState *cs = (struct IsdnCardState *) arg;
4390 +       static struct tq_struct task;
4391 +       struct sk_buff *skb;
4392 +
4393 +        /* NOTE: This function is called directly from an interrupt handler */
4394 +
4395 +       if (1) {
4396 +               if (!(skb = alloc_skb(count, GFP_ATOMIC)))
4397 +                       printk(KERN_WARNING "HiSax: D receive out of memory\n");
4398 +               else {
4399 +                       memcpy(skb_put(skb, count), cs->rcvbuf, count);
4400 +                       skb_queue_tail(&cs->rq, skb);
4401 +               }
4402 +
4403 +               task.routine = (void *) DChannel_proc_rcv;
4404 +               task.data = (void *) cs;
4405 +               queue_task(&task, &tq_immediate);
4406 +               mark_bh(IMMEDIATE_BH);
4407 +       }
4408 +
4409 +       if (cs->debug & L1_DEB_ISAC_FIFO) {
4410 +               char tmp[128];
4411 +               char *t = tmp;
4412 +
4413 +               t += sprintf(t, "amd7930 Drecv cnt %d", count);
4414 +               if (error) t += sprintf(t, " ERR %x", error);
4415 +               QuickHex(t, cs->rcvbuf, count);
4416 +               debugl1(cs, tmp);
4417 +       }
4418 +
4419 +       amd7930_drecv(0, cs->rcvbuf, MAX_DFRAME_LEN,
4420 +                     &amd7930_drecv_callback, cs);
4421 +}
4422 +
4423 +static void
4424 +amd7930_dxmit_callback(void *arg, int error)
4425 +{
4426 +       struct IsdnCardState *cs = (struct IsdnCardState *) arg;
4427 +       static struct tq_struct task;
4428 +
4429 +        /* NOTE: This function is called directly from an interrupt handler */
4430 +
4431 +       /* may wish to do retransmission here, if error indicates collision */
4432 +
4433 +       if (cs->debug & L1_DEB_ISAC_FIFO) {
4434 +               char tmp[128];
4435 +               char *t = tmp;
4436 +
4437 +               t += sprintf(t, "amd7930 Dxmit cnt %d", cs->tx_skb->len);
4438 +               if (error) t += sprintf(t, " ERR %x", error);
4439 +               QuickHex(t, cs->tx_skb->data, cs->tx_skb->len);
4440 +               debugl1(cs, tmp);
4441 +       }
4442 +
4443 +       cs->tx_skb = NULL;
4444 +
4445 +       task.routine = (void *) DChannel_proc_xmt;
4446 +       task.data = (void *) cs;
4447 +       queue_task(&task, &tq_immediate);
4448 +       mark_bh(IMMEDIATE_BH);
4449 +}
4450 +
4451 +static void
4452 +amd7930_Dchan_l2l1(struct PStack *st, int pr, void *arg)
4453 +{
4454 +       struct IsdnCardState *cs = (struct IsdnCardState *) st->l1.hardware;
4455 +       struct sk_buff *skb = arg;
4456 +       char str[64];
4457 +
4458 +       switch (pr) {
4459 +               case (PH_DATA_REQ):
4460 +                       if (cs->tx_skb) {
4461 +                               skb_queue_tail(&cs->sq, skb);
4462 +#ifdef L2FRAME_DEBUG           /* psa */
4463 +                               if (cs->debug & L1_DEB_LAPD)
4464 +                                       Logl2Frame(cs, skb, "PH_DATA Queued", 0);
4465 +#endif
4466 +                       } else {
4467 +                               if ((cs->dlogflag) && (!(skb->data[2] & 1))) {
4468 +                                       /* I-FRAME */
4469 +                                       LogFrame(cs, skb->data, skb->len);
4470 +                                       sprintf(str, "Q.931 frame user->network tei %d", st->l2.tei);
4471 +                                       dlogframe(cs, skb->data+4, skb->len-4,
4472 +                                                 str);
4473 +                               }
4474 +                               cs->tx_skb = skb;
4475 +                               cs->tx_cnt = 0;
4476 +#ifdef L2FRAME_DEBUG           /* psa */
4477 +                               if (cs->debug & L1_DEB_LAPD)
4478 +                                       Logl2Frame(cs, skb, "PH_DATA", 0);
4479 +#endif
4480 +                               amd7930_dxmit(0, skb->data, skb->len,
4481 +                                             &amd7930_dxmit_callback, cs);
4482 +                       }
4483 +                       break;
4484 +               case (PH_PULL_IND):
4485 +                       if (cs->tx_skb) {
4486 +                               if (cs->debug & L1_DEB_WARN)
4487 +                                       debugl1(cs, " l2l1 tx_skb exist this shouldn't happen");
4488 +                               skb_queue_tail(&cs->sq, skb);
4489 +                               break;
4490 +                       }
4491 +                       if ((cs->dlogflag) && (!(skb->data[2] & 1))) {  /* I-FRAME */
4492 +                               LogFrame(cs, skb->data, skb->len);
4493 +                               sprintf(str, "Q.931 frame user->network tei %d", st->l2.tei);
4494 +                               dlogframe(cs, skb->data + 4, skb->len - 4,
4495 +                                         str);
4496 +                       }
4497 +                       cs->tx_skb = skb;
4498 +                       cs->tx_cnt = 0;
4499 +#ifdef L2FRAME_DEBUG           /* psa */
4500 +                       if (cs->debug & L1_DEB_LAPD)
4501 +                               Logl2Frame(cs, skb, "PH_DATA_PULLED", 0);
4502 +#endif
4503 +                       amd7930_dxmit(0, cs->tx_skb->data, cs->tx_skb->len,
4504 +                                     &amd7930_dxmit_callback, cs);
4505 +                       break;
4506 +               case (PH_PULL_REQ):
4507 +#ifdef L2FRAME_DEBUG           /* psa */
4508 +                       if (cs->debug & L1_DEB_LAPD)
4509 +                               debugl1(cs, "-> PH_REQUEST_PULL");
4510 +#endif
4511 +                       if (!cs->tx_skb) {
4512 +                               test_and_clear_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
4513 +                               st->l1.l1l2(st, PH_PULL_CNF, NULL);
4514 +                       } else
4515 +                               test_and_set_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
4516 +                       break;
4517 +       }
4518 +}
4519 +
4520 +int
4521 +setDstack_amd7930(struct PStack *st, struct IsdnCardState *cs)
4522 +{
4523 +       st->l2.l2l1 = amd7930_Dchan_l2l1;
4524 +       if (! cs->rcvbuf) {
4525 +               printk("setDstack_amd7930: No cs->rcvbuf!\n");
4526 +       } else {
4527 +               amd7930_drecv(0, cs->rcvbuf, MAX_DFRAME_LEN,
4528 +                             &amd7930_drecv_callback, cs);
4529 +       }
4530 +       return (0);
4531 +}
4532 +
4533 +static void
4534 +manl1_msg(struct IsdnCardState *cs, int msg, void *arg) {
4535 +       struct PStack *st;
4536 +
4537 +       st = cs->stlist;
4538 +       while (st) {
4539 +               st->ma.manl1(st, msg, arg);
4540 +               st = st->next;
4541 +       }
4542 +}
4543 +
4544 +static void
4545 +amd7930_new_ph(struct IsdnCardState *cs)
4546 +{
4547 +       switch (amd7930_get_liu_state(0)) {
4548 +               case 3:
4549 +                       manl1_msg(cs, PH_POWERUP_CNF, NULL);
4550 +                        break;
4551 +
4552 +               case 7:
4553 +                       manl1_msg(cs, PH_I4_P8_IND, NULL);
4554 +                       break;
4555 +
4556 +               case 8:
4557 +                       manl1_msg(cs, PH_RSYNC_IND, NULL);
4558 +                       break;
4559 +       }
4560 +}
4561 +
4562 +/* amd7930 LIU state change callback */
4563 +
4564 +static void
4565 +amd7930_liu_callback(struct IsdnCardState *cs)
4566 +{
4567 +       static struct tq_struct task;
4568 +
4569 +       if (!cs)
4570 +               return;
4571 +
4572 +       if (cs->debug & L1_DEB_ISAC) {
4573 +               char tmp[32];
4574 +               sprintf(tmp, "amd7930_liu state %d", amd7930_get_liu_state(0));
4575 +               debugl1(cs, tmp);
4576 +       }
4577 +
4578 +       task.sync = 0;
4579 +       task.routine = (void *) &amd7930_new_ph;
4580 +       task.data = (void *) cs;
4581 +       queue_task(&task, &tq_immediate);
4582 +       mark_bh(IMMEDIATE_BH);
4583 +}
4584 +
4585 +void
4586 +amd7930_l1cmd(struct IsdnCardState *cs, int msg, void *arg)
4587 +{
4588 +       u_char val;
4589 +       char tmp[32];
4590 +       
4591 +       if (cs->debug & L1_DEB_ISAC) {
4592 +               char tmp[32];
4593 +               sprintf(tmp, "amd7930_l1cmd msg %x", msg);
4594 +               debugl1(cs, tmp);
4595 +       }
4596 +
4597 +       switch(msg) {
4598 +               case PH_RESET_REQ:
4599 +                       if (amd7930_get_liu_state(0) <= 3)
4600 +                               amd7930_liu_activate(0,0);
4601 +                       else
4602 +                               amd7930_liu_deactivate(0);
4603 +                       break;
4604 +               case PH_ENABLE_REQ:
4605 +                       break;
4606 +               case PH_INFO3_REQ:
4607 +                       amd7930_liu_activate(0,0);
4608 +                       break;
4609 +               case PH_TESTLOOP_REQ:
4610 +                       break;
4611 +               default:
4612 +                       if (cs->debug & L1_DEB_WARN) {
4613 +                               sprintf(tmp, "amd7930_l1cmd unknown %4x", msg);
4614 +                               debugl1(cs, tmp);
4615 +                       }
4616 +                       break;
4617 +       }
4618 +}
4619 +
4620 +static void init_amd7930(struct IsdnCardState *cs)
4621 +{
4622 +       Bchan_init(&cs->bcs[0]);
4623 +       Bchan_init(&cs->bcs[1]);
4624 +       cs->bcs[0].BC_SetStack = setstack_amd7930;
4625 +       cs->bcs[1].BC_SetStack = setstack_amd7930;
4626 +       cs->bcs[0].BC_Close = Bchan_close;
4627 +       cs->bcs[1].BC_Close = Bchan_close;
4628 +       Bchan_mode(cs->bcs, 0, 0);
4629 +       Bchan_mode(cs->bcs + 1, 0, 0);
4630 +}
4631 +
4632 +void
4633 +release_amd7930(struct IsdnCardState *cs)
4634 +{
4635 +}
4636 +
4637 +static int
4638 +amd7930_card_msg(struct IsdnCardState *cs, int mt, void *arg)
4639 +{
4640 +       switch (mt) {
4641 +               case CARD_RESET:
4642 +                       return(0);
4643 +               case CARD_RELEASE:
4644 +                       release_amd7930(cs);
4645 +                       return(0);
4646 +               case CARD_INIT:
4647 +                       cs->l1cmd = amd7930_l1cmd;
4648 +                       amd7930_liu_init(0, &amd7930_liu_callback, (void *)cs);
4649 +                       init_amd7930(cs);
4650 +                       return(0);
4651 +               case CARD_TEST:
4652 +                       return(0);
4653 +       }
4654 +       return(0);
4655 +}
4656 +
4657 +int __init
4658 +setup_amd7930(struct IsdnCard *card)
4659 +{
4660 +       struct IsdnCardState *cs = card->cs;
4661 +       char tmp[64];
4662 +
4663 +       strcpy(tmp, amd7930_revision);
4664 +       printk(KERN_INFO "HiSax: AMD7930 driver Rev. %s\n", HiSax_getrev(tmp));
4665 +       if (cs->typ != ISDN_CTYPE_AMD7930)
4666 +               return (0);
4667 +
4668 +        cs->irq = amd7930_get_irqnum(0);
4669 +        if (cs->irq == 0)
4670 +               return (0);
4671 +
4672 +       cs->cardmsg = &amd7930_card_msg;
4673 +
4674 +       return (1);
4675 +}
4676 Index: linux-2.4.35.4/drivers/isdn/hisax/arcofi.c
4677 ===================================================================
4678 --- linux-2.4.35.4.orig/drivers/isdn/hisax/arcofi.c     2007-12-15 05:19:39.798689035 +0100
4679 +++ linux-2.4.35.4/drivers/isdn/hisax/arcofi.c  2007-12-15 05:19:55.539586058 +0100
4680 @@ -1,4 +1,4 @@
4681 -/* $Id: arcofi.c,v 1.1.4.1 2001/11/20 14:19:35 kai Exp $
4682 +/* $Id: arcofi.c,v 1.14 2001/09/24 13:22:55 kai Exp $
4683   *
4684   * Ansteuerung ARCOFI 2165
4685   *
4686 Index: linux-2.4.35.4/drivers/isdn/hisax/arcofi.h
4687 ===================================================================
4688 --- linux-2.4.35.4.orig/drivers/isdn/hisax/arcofi.h     2007-12-15 05:19:39.802689264 +0100
4689 +++ linux-2.4.35.4/drivers/isdn/hisax/arcofi.h  2007-12-15 05:19:55.543586286 +0100
4690 @@ -1,4 +1,4 @@
4691 -/* $Id: arcofi.h,v 1.1.4.1 2001/11/20 14:19:35 kai Exp $
4692 +/* $Id$
4693   *
4694   * Ansteuerung ARCOFI 2165
4695   *
4696 Index: linux-2.4.35.4/drivers/isdn/hisax/asuscom.c
4697 ===================================================================
4698 --- linux-2.4.35.4.orig/drivers/isdn/hisax/asuscom.c    2007-12-15 05:19:39.810689720 +0100
4699 +++ linux-2.4.35.4/drivers/isdn/hisax/asuscom.c 2007-12-15 05:19:55.543586286 +0100
4700 @@ -1,4 +1,4 @@
4701 -/* $Id: asuscom.c,v 1.1.4.1 2001/11/20 14:19:35 kai Exp $
4702 +/* $Id: asuscom.c,v 1.14 2001/09/24 13:22:55 kai Exp $
4703   *
4704   * low level stuff for ASUSCOM NETWORK INC. ISDNLink cards
4705   *
4706 @@ -14,7 +14,6 @@
4707  
4708  #define __NO_VERSION__
4709  #include <linux/init.h>
4710 -#include <linux/isapnp.h>
4711  #include "hisax.h"
4712  #include "isac.h"
4713  #include "ipac.h"
4714 @@ -23,7 +22,7 @@
4715  
4716  extern const char *CardType[];
4717  
4718 -const char *Asuscom_revision = "$Revision: 1.1.4.1 $";
4719 +const char *Asuscom_revision = "$Revision: 1.14 $";
4720  
4721  #define byteout(addr,val) outb(val,addr)
4722  #define bytein(addr) inb(addr)
4723 @@ -310,27 +309,6 @@
4724         return(0);
4725  }
4726  
4727 -#ifdef __ISAPNP__
4728 -static struct isapnp_device_id asus_ids[] __initdata = {
4729 -       { ISAPNP_VENDOR('A', 'S', 'U'), ISAPNP_FUNCTION(0x1688),
4730 -         ISAPNP_VENDOR('A', 'S', 'U'), ISAPNP_FUNCTION(0x1688), 
4731 -         (unsigned long) "Asus1688 PnP" },
4732 -       { ISAPNP_VENDOR('A', 'S', 'U'), ISAPNP_FUNCTION(0x1690),
4733 -         ISAPNP_VENDOR('A', 'S', 'U'), ISAPNP_FUNCTION(0x1690), 
4734 -         (unsigned long) "Asus1690 PnP" },
4735 -       { ISAPNP_VENDOR('S', 'I', 'E'), ISAPNP_FUNCTION(0x0020),
4736 -         ISAPNP_VENDOR('S', 'I', 'E'), ISAPNP_FUNCTION(0x0020), 
4737 -         (unsigned long) "Isurf2 PnP" },
4738 -       { ISAPNP_VENDOR('E', 'L', 'F'), ISAPNP_FUNCTION(0x0000),
4739 -         ISAPNP_VENDOR('E', 'L', 'F'), ISAPNP_FUNCTION(0x0000), 
4740 -         (unsigned long) "Iscas TE320" },
4741 -       { 0, }
4742 -};
4743 -
4744 -static struct isapnp_device_id *adev = &asus_ids[0];
4745 -static struct pci_bus *pnp_c __devinitdata = NULL;
4746 -#endif
4747 -
4748  int __init
4749  setup_asuscom(struct IsdnCard *card)
4750  {
4751 @@ -343,45 +321,7 @@
4752         printk(KERN_INFO "HiSax: Asuscom ISDNLink driver Rev. %s\n", HiSax_getrev(tmp));
4753         if (cs->typ != ISDN_CTYPE_ASUSCOM)
4754                 return (0);
4755 -#ifdef __ISAPNP__
4756 -       if (!card->para[1] && isapnp_present()) {
4757 -               struct pci_bus *pb;
4758 -               struct pci_dev *pd;
4759 -
4760 -               while(adev->card_vendor) {
4761 -                       if ((pb = isapnp_find_card(adev->card_vendor,
4762 -                               adev->card_device, pnp_c))) {
4763 -                               pnp_c = pb;
4764 -                               pd = NULL;
4765 -                               if ((pd = isapnp_find_dev(pnp_c,
4766 -                                       adev->vendor, adev->function, pd))) {
4767 -                                       printk(KERN_INFO "HiSax: %s detected\n",
4768 -                                               (char *)adev->driver_data);
4769 -                                       pd->prepare(pd);
4770 -                                       pd->deactivate(pd);
4771 -                                       pd->activate(pd);
4772 -                                       card->para[1] = pd->resource[0].start;
4773 -                                       card->para[0] = pd->irq_resource[0].start;
4774 -                                       if (!card->para[0] || !card->para[1]) {
4775 -                                               printk(KERN_ERR "AsusPnP:some resources are missing %ld/%lx\n",
4776 -                                               card->para[0], card->para[1]);
4777 -                                               pd->deactivate(pd);
4778 -                                               return(0);
4779 -                                       }
4780 -                                       break;
4781 -                               } else {
4782 -                                       printk(KERN_ERR "AsusPnP: PnP error card found, no device\n");
4783 -                               }
4784 -                       }
4785 -                       adev++;
4786 -                       pnp_c=NULL;
4787 -               } 
4788 -               if (!adev->card_vendor) {
4789 -                       printk(KERN_INFO "AsusPnP: no ISAPnP card found\n");
4790 -                       return(0);
4791 -               }
4792 -       }
4793 -#endif
4794 +
4795         bytecnt = 8;
4796         cs->hw.asus.cfg_reg = card->para[1];
4797         cs->irq = card->para[0];
4798 Index: linux-2.4.35.4/drivers/isdn/hisax/avm_a1.c
4799 ===================================================================
4800 --- linux-2.4.35.4.orig/drivers/isdn/hisax/avm_a1.c     2007-12-15 05:19:39.818690175 +0100
4801 +++ linux-2.4.35.4/drivers/isdn/hisax/avm_a1.c  2007-12-15 05:19:55.543586286 +0100
4802 @@ -1,4 +1,4 @@
4803 -/* $Id: avm_a1.c,v 1.1.4.1 2001/11/20 14:19:35 kai Exp $
4804 +/* $Id: avm_a1.c,v 2.15 2001/09/24 13:22:55 kai Exp $
4805   *
4806   * low level stuff for AVM A1 (Fritz) isdn cards
4807   *
4808 @@ -18,7 +18,7 @@
4809  #include "isdnl1.h"
4810  
4811  extern const char *CardType[];
4812 -static const char *avm_revision = "$Revision: 1.1.4.1 $";
4813 +static const char *avm_revision = "$Revision: 2.15 $";
4814  
4815  #define         AVM_A1_STAT_ISAC       0x01
4816  #define         AVM_A1_STAT_HSCX       0x02
4817 Index: linux-2.4.35.4/drivers/isdn/hisax/avm_a1p.c
4818 ===================================================================
4819 --- linux-2.4.35.4.orig/drivers/isdn/hisax/avm_a1p.c    2007-12-15 05:19:39.826690633 +0100
4820 +++ linux-2.4.35.4/drivers/isdn/hisax/avm_a1p.c 2007-12-15 05:19:55.543586286 +0100
4821 @@ -1,4 +1,4 @@
4822 -/* $Id: avm_a1p.c,v 1.1.4.1 2001/11/20 14:19:35 kai Exp $
4823 +/* $Id: avm_a1p.c,v 2.9 2001/09/24 13:22:55 kai Exp $
4824   *
4825   * low level stuff for the following AVM cards:
4826   * A1 PCMCIA
4827 @@ -57,7 +57,7 @@
4828  #define byteout(addr,val) outb(val,addr)
4829  #define bytein(addr) inb(addr)
4830  
4831 -static const char *avm_revision = "$Revision: 1.1.4.1 $";
4832 +static const char *avm_revision = "$Revision: 2.9 $";
4833  
4834  static inline u_char
4835  ReadISAC(struct IsdnCardState *cs, u_char offset)
4836 Index: linux-2.4.35.4/drivers/isdn/hisax/avm_pci.c
4837 ===================================================================
4838 --- linux-2.4.35.4.orig/drivers/isdn/hisax/avm_pci.c    2007-12-15 05:19:39.830690859 +0100
4839 +++ linux-2.4.35.4/drivers/isdn/hisax/avm_pci.c 2007-12-15 05:19:55.543586286 +0100
4840 @@ -1,4 +1,4 @@
4841 -/* $Id: avm_pci.c,v 1.1.4.1 2001/11/20 14:19:35 kai Exp $
4842 +/* $Id: avm_pci.c,v 1.29 2001/09/24 13:22:55 kai Exp $
4843   *
4844   * low level stuff for AVM Fritz!PCI and ISA PnP isdn cards
4845   *
4846 @@ -19,11 +19,11 @@
4847  #include "isac.h"
4848  #include "isdnl1.h"
4849  #include <linux/pci.h>
4850 -#include <linux/isapnp.h>
4851 +#include <linux/isdn_compat.h>
4852  #include <linux/interrupt.h>
4853  
4854  extern const char *CardType[];
4855 -static const char *avm_pci_rev = "$Revision: 1.1.4.1 $";
4856 +static const char *avm_pci_rev = "$Revision: 1.29 $";
4857  
4858  #define  AVM_FRITZ_PCI         1
4859  #define  AVM_FRITZ_PNP         2
4860 @@ -291,8 +291,7 @@
4861                         debugl1(cs, "hdlc_empty_fifo: incoming packet too large");
4862                 return;
4863         }
4864 -       p = bcs->hw.hdlc.rcvbuf + bcs->hw.hdlc.rcvidx;
4865 -       ptr = (u_int *)p;
4866 +       ptr = (u_int *) p = bcs->hw.hdlc.rcvbuf + bcs->hw.hdlc.rcvidx;
4867         bcs->hw.hdlc.rcvidx += count;
4868         if (cs->subtyp == AVM_FRITZ_PCI) {
4869                 outl(idx, cs->hw.avm.cfg_reg + 4);
4870 @@ -353,8 +352,7 @@
4871         }
4872         if ((cs->debug & L1_DEB_HSCX) && !(cs->debug & L1_DEB_HSCX_FIFO))
4873                 debugl1(cs, "hdlc_fill_fifo %d/%ld", count, bcs->tx_skb->len);
4874 -       p = bcs->tx_skb->data;
4875 -       ptr = (u_int *)p;
4876 +       ptr = (u_int *) p = bcs->tx_skb->data;
4877         skb_pull(bcs->tx_skb, count);
4878         bcs->tx_cnt -= count;
4879         bcs->hw.hdlc.count += count;
4880 @@ -766,10 +764,6 @@
4881  }
4882  
4883  static struct pci_dev *dev_avm __initdata = NULL;
4884 -#ifdef __ISAPNP__
4885 -static struct pci_bus *bus_avm __initdata = NULL;
4886 -static struct pci_dev *pnp_avm __initdata = NULL;
4887 -#endif
4888  
4889  int __init
4890  setup_avm_pcipnp(struct IsdnCard *card)
4891 @@ -783,47 +777,10 @@
4892         if (cs->typ != ISDN_CTYPE_FRITZPCI)
4893                 return (0);
4894         if (card->para[1]) {
4895 -               /* old manual method */
4896                 cs->hw.avm.cfg_reg = card->para[1];
4897                 cs->irq = card->para[0];
4898                 cs->subtyp = AVM_FRITZ_PNP;
4899         } else {
4900 -#ifdef __ISAPNP__
4901 -               if (isapnp_present()) {
4902 -                       struct pci_bus *ba;
4903 -                       if ((ba = isapnp_find_card(
4904 -                               ISAPNP_VENDOR('A', 'V', 'M'),
4905 -                               ISAPNP_FUNCTION(0x0900), bus_avm))) {
4906 -                               bus_avm = ba;
4907 -                               pnp_avm = NULL;
4908 -                               if ((pnp_avm = isapnp_find_dev(bus_avm,
4909 -                                       ISAPNP_VENDOR('A', 'V', 'M'),
4910 -                                       ISAPNP_FUNCTION(0x0900), pnp_avm))) {
4911 -                                       pnp_avm->prepare(pnp_avm);
4912 -                                       pnp_avm->deactivate(pnp_avm);
4913 -                                       pnp_avm->activate(pnp_avm);
4914 -                                       cs->hw.avm.cfg_reg =
4915 -                                               pnp_avm->resource[0].start;
4916 -                                       cs->irq = 
4917 -                                               pnp_avm->irq_resource[0].start;
4918 -                                       if (!cs->irq) {
4919 -                                               printk(KERN_ERR "FritzPnP:No IRQ\n");
4920 -                                               pnp_avm->deactivate(pnp_avm);
4921 -                                               return(0);
4922 -                                       }
4923 -                                       if (!cs->hw.avm.cfg_reg) {
4924 -                                               printk(KERN_ERR "FritzPnP:No IO address\n");
4925 -                                               pnp_avm->deactivate(pnp_avm);
4926 -                                               return(0);
4927 -                                       }
4928 -                                       cs->subtyp = AVM_FRITZ_PNP;
4929 -                                       goto ready;
4930 -                               }
4931 -                       }
4932 -               } else {
4933 -                       printk(KERN_INFO "FritzPnP: no ISA PnP present\n");
4934 -               }
4935 -#endif
4936  #if CONFIG_PCI
4937                 if (!pci_present()) {
4938                         printk(KERN_ERR "FritzPCI: no PCI bus present\n");
4939 @@ -838,7 +795,7 @@
4940                         }
4941                         if (pci_enable_device(dev_avm))
4942                                 return(0);
4943 -                       cs->hw.avm.cfg_reg = pci_resource_start(dev_avm, 1);
4944 +                       cs->hw.avm.cfg_reg = pci_resource_start_io(dev_avm, 1);
4945                         if (!cs->hw.avm.cfg_reg) {
4946                                 printk(KERN_ERR "FritzPCI: No IO-Adr for PCI card found\n");
4947                                 return(0);
4948 @@ -854,7 +811,6 @@
4949                 return (0);
4950  #endif /* CONFIG_PCI */
4951         }
4952 -ready:
4953         cs->hw.avm.isac = cs->hw.avm.cfg_reg + 0x10;
4954         if (check_region((cs->hw.avm.cfg_reg), 32)) {
4955                 printk(KERN_WARNING
4956 Index: linux-2.4.35.4/drivers/isdn/hisax/bkm_a4t.c
4957 ===================================================================
4958 --- linux-2.4.35.4.orig/drivers/isdn/hisax/bkm_a4t.c    2007-12-15 05:19:39.838691315 +0100
4959 +++ linux-2.4.35.4/drivers/isdn/hisax/bkm_a4t.c 2007-12-15 05:19:55.547586516 +0100
4960 @@ -1,4 +1,4 @@
4961 -/* $Id: bkm_a4t.c,v 1.1.4.1 2001/11/20 14:19:35 kai Exp $
4962 +/* $Id: bkm_a4t.c,v 1.22 2001/09/24 13:22:55 kai Exp $
4963   *
4964   * low level stuff for T-Berkom A4T
4965   *
4966 @@ -20,11 +20,12 @@
4967  #include "jade.h"
4968  #include "isdnl1.h"
4969  #include <linux/pci.h>
4970 +#include <linux/isdn_compat.h>
4971  #include "bkm_ax.h"
4972  
4973  extern const char *CardType[];
4974  
4975 -const char *bkm_a4t_revision = "$Revision: 1.1.4.1 $";
4976 +const char *bkm_a4t_revision = "$Revision: 1.22 $";
4977  
4978  
4979  static inline u_char
4980 @@ -293,13 +294,13 @@
4981                 u16 sub_sys;
4982                 u16 sub_vendor;
4983  
4984 -               sub_vendor = dev_a4t->subsystem_vendor;
4985 -               sub_sys = dev_a4t->subsystem_device;
4986 +               pci_get_sub_vendor(dev_a4t,sub_vendor);
4987 +               pci_get_sub_system(dev_a4t,sub_sys);
4988                 if ((sub_sys == PCI_DEVICE_ID_BERKOM_A4T) && (sub_vendor == PCI_VENDOR_ID_BERKOM)) {
4989                         if (pci_enable_device(dev_a4t))
4990                                 return(0);
4991                         found = 1;
4992 -                       pci_memaddr = pci_resource_start(dev_a4t, 0);
4993 +                       pci_memaddr = pci_resource_start_mem(dev_a4t, 0);
4994                         cs->irq = dev_a4t->irq;
4995                         break;
4996                 }
4997 Index: linux-2.4.35.4/drivers/isdn/hisax/bkm_a8.c
4998 ===================================================================
4999 --- linux-2.4.35.4.orig/drivers/isdn/hisax/bkm_a8.c     2007-12-15 05:19:39.846691773 +0100
5000 +++ linux-2.4.35.4/drivers/isdn/hisax/bkm_a8.c  2007-12-15 05:19:55.547586516 +0100
5001 @@ -1,4 +1,4 @@
5002 -/* $Id: bkm_a8.c,v 1.1.4.1 2001/11/20 14:19:35 kai Exp $
5003 +/* $Id: bkm_a8.c,v 1.22 2001/09/24 13:22:55 kai Exp $
5004   *
5005   * low level stuff for Scitel Quadro (4*S0, passive)
5006   *
5007 @@ -20,6 +20,7 @@
5008  #include "hscx.h"
5009  #include "isdnl1.h"
5010  #include <linux/pci.h>
5011 +#include <linux/isdn_compat.h>
5012  #include "bkm_ax.h"
5013  
5014  #if CONFIG_PCI
5015 @@ -28,7 +29,7 @@
5016  
5017  extern const char *CardType[];
5018  
5019 -const char sct_quadro_revision[] = "$Revision: 1.1.4.1 $";
5020 +const char sct_quadro_revision[] = "$Revision: 1.22 $";
5021  
5022  static const char *sct_quadro_subtypes[] =
5023  {
5024 @@ -329,13 +330,13 @@
5025                 while ((dev_a8 = pci_find_device(PCI_VENDOR_ID_PLX,
5026                         PCI_DEVICE_ID_PLX_9050, dev_a8))) {
5027                         
5028 -                       sub_vendor_id = dev_a8->subsystem_vendor;
5029 -                       sub_sys_id = dev_a8->subsystem_device;
5030 +                       pci_get_sub_vendor(dev_a8,sub_vendor_id);
5031 +                       pci_get_sub_system(dev_a8,sub_sys_id);
5032                         if ((sub_sys_id == PCI_DEVICE_ID_BERKOM_SCITEL_QUADRO) &&
5033                                 (sub_vendor_id == PCI_VENDOR_ID_BERKOM)) {
5034                                 if (pci_enable_device(dev_a8))
5035                                         return(0);
5036 -                               pci_ioaddr1 = pci_resource_start(dev_a8, 1);
5037 +                               pci_ioaddr1 = pci_resource_start_io(dev_a8, 1);
5038                                 pci_irq = dev_a8->irq;
5039                                 pci_bus = dev_a8->bus->number;
5040                                 pci_device_fn = dev_a8->devfn;
5041 @@ -365,7 +366,7 @@
5042                         pci_ioaddr1 &= PCI_BASE_ADDRESS_IO_MASK;
5043                         pcibios_write_config_dword(pci_bus, pci_device_fn,
5044                                 PCI_BASE_ADDRESS_1, pci_ioaddr1);
5045 -                       dev_a8->resource[ 1].start = pci_ioaddr1;
5046 +                       get_pcibase(dev_a8, 1) = pci_ioaddr1;
5047                 }
5048  #endif /* End HACK */
5049         }
5050 Index: linux-2.4.35.4/drivers/isdn/hisax/bkm_ax.h
5051 ===================================================================
5052 --- linux-2.4.35.4.orig/drivers/isdn/hisax/bkm_ax.h     2007-12-15 05:19:39.854692228 +0100
5053 +++ linux-2.4.35.4/drivers/isdn/hisax/bkm_ax.h  2007-12-15 05:19:55.547586516 +0100
5054 @@ -1,4 +1,4 @@
5055 -/* $Id: bkm_ax.h,v 1.1.4.1 2001/11/20 14:19:35 kai Exp $
5056 +/* $Id$
5057   *
5058   * low level decls for T-Berkom cards A4T and Scitel Quadro (4*S0, passive)
5059   *
5060 Index: linux-2.4.35.4/drivers/isdn/hisax/callc.c
5061 ===================================================================
5062 --- linux-2.4.35.4.orig/drivers/isdn/hisax/callc.c      2007-12-15 05:19:39.862692684 +0100
5063 +++ linux-2.4.35.4/drivers/isdn/hisax/callc.c   2007-12-15 05:19:55.547586516 +0100
5064 @@ -1,4 +1,4 @@
5065 -/* $Id: callc.c,v 1.1.4.1 2001/11/20 14:19:35 kai Exp $
5066 +/* $Id: callc.c,v 2.59 2002/02/09 21:19:11 keil Exp $
5067   *
5068   * Author       Karsten Keil
5069   * Copyright    by Karsten Keil      <keil@isdn4linux.de>
5070 @@ -26,7 +26,7 @@
5071  #define MOD_USE_COUNT ( GET_USE_COUNT (&__this_module))
5072  #endif /* MODULE */
5073  
5074 -const char *lli_revision = "$Revision: 1.1.4.1 $";
5075 +const char *lli_revision = "$Revision: 2.59 $";
5076  
5077  extern struct IsdnCard cards[];
5078  extern int nrcards;
5079 @@ -145,9 +145,11 @@
5080         EV_PROCEED,             /* 20 */
5081         EV_ALERT,               /* 21 */ 
5082         EV_REDIR,               /* 22 */ 
5083 +       EV_ALERTING,            /* 23 */
5084 +       EV_PROCEEDING,          /* 24 */
5085  };
5086  
5087 -#define EVENT_COUNT (EV_REDIR + 1)
5088 +#define EVENT_COUNT (EV_PROCEEDING + 1)
5089  
5090  static char *strEvent[] =
5091  {
5092 @@ -174,6 +176,8 @@
5093         "EV_PROCEED",
5094         "EV_ALERT",
5095         "EV_REDIR",
5096 +       "EV_ALERTING",
5097 +       "EV_PROCEEDING",
5098  };
5099  
5100  
5101 @@ -286,6 +290,22 @@
5102  }
5103  
5104  static void
5105 +lli_alerting(struct FsmInst *fi, int event, void *arg)
5106 +{
5107 +       struct Channel *chanp = fi->userdata;
5108 +       
5109 +       HL_LL(chanp, ISDN_STAT_ALERT);
5110 +}
5111 +
5112 +static void
5113 +lli_proceeding(struct FsmInst *fi, int event, void *arg)
5114 +{
5115 +       struct Channel *chanp = fi->userdata;
5116 +       
5117 +       HL_LL(chanp, ISDN_STAT_PROCEED);
5118 +}
5119 +
5120 +static void
5121  lli_resume(struct FsmInst *fi, int event, void *arg)
5122  {
5123         struct Channel *chanp = fi->userdata;
5124 @@ -784,6 +804,8 @@
5125          {ST_OUT_DIAL,           EV_DISCONNECT_IND,      lli_release_req},
5126          {ST_OUT_DIAL,           EV_RELEASE,             lli_dhup_close},
5127          {ST_OUT_DIAL,           EV_NOSETUP_RSP,         lli_no_setup_rsp},
5128 +        {ST_OUT_DIAL,           EV_PROCEEDING,         lli_proceeding},
5129 +        {ST_OUT_DIAL,           EV_ALERTING,           lli_alerting},
5130          {ST_OUT_DIAL,           EV_SETUP_ERR,           lli_error},
5131          {ST_IN_WAIT_LL,         EV_LEASED_REL,          lli_failure_l},
5132          {ST_IN_WAIT_LL,         EV_ACCEPTD,             lli_setup_rsp},
5133 @@ -925,7 +947,7 @@
5134         ic.driver = cs->myid;
5135         ic.command = ISDN_STAT_REDIR;
5136         ic.arg = chan; 
5137 -       ic.parm.num[0] = result;
5138 +       (ulong)(ic.parm.num[0]) = result;
5139         cs->iif.statcallb(&ic);
5140  } /* stat_redir_result */
5141  
5142 @@ -997,8 +1019,13 @@
5143                         FsmEvent(&chanp->fi, EV_RELEASE, NULL);
5144                         break;
5145                 case (CC_PROCEED_SEND | INDICATION):
5146 +                       break;
5147                 case (CC_PROCEEDING | INDICATION):
5148 +                       FsmEvent(&chanp->fi, EV_PROCEEDING, NULL);
5149 +                       break;
5150                 case (CC_ALERTING | INDICATION):
5151 +                       FsmEvent(&chanp->fi, EV_ALERTING, NULL);
5152 +                       break;
5153                 case (CC_PROGRESS | INDICATION):
5154                 case (CC_NOTIFY | INDICATION):
5155                         break;
5156 Index: linux-2.4.35.4/drivers/isdn/hisax/cert.c
5157 ===================================================================
5158 --- linux-2.4.35.4.orig/drivers/isdn/hisax/cert.c       2007-12-15 05:19:39.866692913 +0100
5159 +++ linux-2.4.35.4/drivers/isdn/hisax/cert.c    2007-12-15 05:19:55.551586742 +0100
5160 @@ -1,4 +1,4 @@
5161 -/* $Id: cert.c,v 1.1.4.1 2001/11/20 14:19:35 kai Exp $
5162 +/* $Id: cert.c,v 2.6 2001/09/24 13:22:56 kai Exp $
5163   *
5164   * Author       Karsten Keil
5165   * Copyright    by Karsten Keil      <keil@isdn4linux.de>
5166 Index: linux-2.4.35.4/drivers/isdn/hisax/config.c
5167 ===================================================================
5168 --- linux-2.4.35.4.orig/drivers/isdn/hisax/config.c     2007-12-15 05:19:39.874693368 +0100
5169 +++ linux-2.4.35.4/drivers/isdn/hisax/config.c  2007-12-15 05:19:55.551586742 +0100
5170 @@ -1,4 +1,4 @@
5171 -/* $Id: config.c,v 1.1.4.5 2001/12/09 19:19:26 kai Exp $
5172 +/* $Id: config.c,v 2.84 2002/08/13 09:55:29 keil Exp $
5173   *
5174   * Author       Karsten Keil
5175   * Copyright    by Karsten Keil      <keil@isdn4linux.de>
5176 @@ -24,6 +24,11 @@
5177  #include <linux/kernel_stat.h>
5178  #include <linux/tqueue.h>
5179  #include <linux/interrupt.h>
5180 +
5181 +#ifdef CONFIG_HISAX_HFC_USB
5182 +#include "hisax_loadable.h"
5183 +#endif
5184 +
5185  #define HISAX_STATUS_BUFSIZE 4096
5186  #define INCLUDE_INLINE_FUNCS
5187  
5188 @@ -75,8 +80,7 @@
5189   *   37 HFC 2BDS0 S+/SP         p0=irq p1=iobase
5190   *   38 Travers Technologies NETspider-U PCI card
5191   *   39 HFC 2BDS0-SP PCMCIA     p0=irq p1=iobase
5192 - *   40 hotplug interface
5193 - *   41 Formula-n enter:now ISDN PCI a/b   none
5194 + *   40 HFC-S USB               none
5195   *
5196   * protocol can be either ISDN_PTYPE_EURO or ISDN_PTYPE_1TR6 or ISDN_PTYPE_NI1
5197   *
5198 @@ -95,11 +99,17 @@
5199         "Siemens I-Surf", "Acer P10", "HST Saphir", "Telekom A4T",
5200         "Scitel Quadro", "Gazel", "HFC 2BDS0 PCI", "Winbond 6692",
5201         "HFC 2BDS0 SX", "NETspider-U", "HFC-2BDS0-SP PCMCIA",
5202 -       "Hotplug", "Formula-n enter:now PCI a/b", 
5203 +       "HFC-S USB",
5204  };
5205  
5206  void HiSax_closecard(int cardnr);
5207  
5208 +#ifdef CONFIG_HISAX_HFC_USB
5209 +#define DEFAULT_CARD ISDN_CTYPE_HFC_USB
5210 +#define DEFAULT_CFG {0,0,0,0}
5211 +EXPORT_SYMBOL(hisax_register_hfcusb);
5212 +#endif
5213 +
5214  #ifdef CONFIG_HISAX_ELSA
5215  #define DEFAULT_CARD ISDN_CTYPE_ELSA
5216  #define DEFAULT_CFG {0,0,0,0}
5217 @@ -339,19 +349,27 @@
5218         NULL, \
5219  }
5220  
5221 -struct IsdnCard cards[HISAX_MAX_CARDS] = {
5222 +#define EMPTY_CARD     {0, DEFAULT_PROTO, {0, 0, 0, 0}, NULL}
5223 +
5224 +struct IsdnCard cards[] = {
5225         FIRST_CARD,
5226 +       EMPTY_CARD,
5227 +       EMPTY_CARD,
5228 +       EMPTY_CARD,
5229 +       EMPTY_CARD,
5230 +       EMPTY_CARD,
5231 +       EMPTY_CARD,
5232 +       EMPTY_CARD,
5233  };
5234  
5235 -#define HISAX_IDSIZE (HISAX_MAX_CARDS*8)
5236 -static char HiSaxID[HISAX_IDSIZE] __devinitdata = { 0, };
5237 +static char HiSaxID[64] __devinitdata = { 0, };
5238  
5239  char *HiSax_id __devinitdata = HiSaxID;
5240  #ifdef MODULE
5241  /* Variables for insmod */
5242 -static int type[HISAX_MAX_CARDS] __devinitdata = { 0, };
5243 -static int protocol[HISAX_MAX_CARDS] __devinitdata = { 0, };
5244 -static int io[HISAX_MAX_CARDS] __devinitdata = { 0, };
5245 +static int type[8] __devinitdata = { 0, };
5246 +static int protocol[8] __devinitdata = { 0, };
5247 +static int io[8] __devinitdata = { 0, };
5248  #undef IO0_IO1
5249  #ifdef CONFIG_HISAX_16_3
5250  #define IO0_IO1
5251 @@ -361,27 +379,23 @@
5252  #define IO0_IO1
5253  #endif
5254  #ifdef IO0_IO1
5255 -static int io0[HISAX_MAX_CARDS] __devinitdata = { 0, };
5256 -static int io1[HISAX_MAX_CARDS] __devinitdata = { 0, };
5257 +static int io0[8] __devinitdata = { 0, };
5258 +static int io1[8] __devinitdata = { 0, };
5259  #endif
5260 -static int irq[HISAX_MAX_CARDS] __devinitdata = { 0, };
5261 -static int mem[HISAX_MAX_CARDS] __devinitdata = { 0, };
5262 +static int irq[8] __devinitdata = { 0, };
5263 +static int mem[8] __devinitdata = { 0, };
5264  static char *id __devinitdata = HiSaxID;
5265  
5266 -#define PARM_PARA "1-" __MODULE_STRING(HISAX_MAX_CARDS) "i"
5267 -
5268 -MODULE_DESCRIPTION("ISDN4Linux: Driver for passive ISDN cards");
5269  MODULE_AUTHOR("Karsten Keil");
5270 -MODULE_LICENSE("GPL");
5271 -MODULE_PARM(type, PARM_PARA);
5272 -MODULE_PARM(protocol, PARM_PARA);
5273 -MODULE_PARM(io, PARM_PARA);
5274 -MODULE_PARM(irq, PARM_PARA);
5275 -MODULE_PARM(mem, PARM_PARA);
5276 +MODULE_PARM(type, "1-8i");
5277 +MODULE_PARM(protocol, "1-8i");
5278 +MODULE_PARM(io, "1-8i");
5279 +MODULE_PARM(irq, "1-8i");
5280 +MODULE_PARM(mem, "1-8i");
5281  MODULE_PARM(id, "s");
5282  #ifdef IO0_IO1
5283 -MODULE_PARM(io0, PARM_PARA);
5284 -MODULE_PARM(io1, PARM_PARA);
5285 +MODULE_PARM(io0, "1-8i");
5286 +MODULE_PARM(io1, "1-8i");
5287  #endif
5288  #endif /* MODULE */
5289  
5290 @@ -432,6 +446,7 @@
5291  }
5292  
5293  #ifndef MODULE
5294 +#ifdef COMPAT_HAS_NEW_SETUP
5295  #define MAX_ARG        (HISAX_MAX_CARDS*5)
5296  static int __init HiSax_setup(char *line)
5297  {
5298 @@ -440,12 +455,16 @@
5299         char *str;
5300  
5301         str = get_options(line, MAX_ARG, ints);
5302 +#else
5303 +void __init HiSax_setup(char *str, int *ints)
5304 +{
5305 +       int i, j, argc;
5306 +#endif
5307         argc = ints[0];
5308         printk(KERN_DEBUG "HiSax_setup: argc(%d) str(%s)\n", argc, str);
5309         i = 0;
5310         j = 1;
5311         while (argc && (i < HISAX_MAX_CARDS)) {
5312 -               cards[i].protocol = DEFAULT_PROTO;
5313                 if (argc) {
5314                         cards[i].typ = ints[j];
5315                         j++;
5316 @@ -473,19 +492,21 @@
5317                 }
5318                 i++;
5319         }
5320 -       if (str && *str) {
5321 -               if (strlen(str) < HISAX_IDSIZE)
5322 -                       strcpy(HiSaxID, str);
5323 -               else
5324 -                       printk(KERN_WARNING "HiSax: ID too long!");
5325 -       } else
5326 +       if (str && *str) {
5327 +               strcpy(HiSaxID, str);
5328 +               HiSax_id = HiSaxID;
5329 +       } else {
5330                 strcpy(HiSaxID, "HiSax");
5331 -
5332 -       HiSax_id = HiSaxID;
5333 +               HiSax_id = HiSaxID;
5334 +       }
5335 +#ifdef COMPAT_HAS_NEW_SETUP
5336         return 1;
5337  }
5338  
5339  __setup("hisax=", HiSax_setup);
5340 +#else
5341 +}
5342 +#endif /* COMPAT_HAS_NEW_SETUP */
5343  #endif /* MODULES */
5344  
5345  #if CARD_TELES0
5346 @@ -560,6 +581,10 @@
5347  extern int setup_hfcpci(struct IsdnCard *card);
5348  #endif
5349  
5350 +#if CONFIG_HISAX_HFC_USB
5351 +extern int setup_hfc_usb(struct IsdnCard *card);
5352 +#endif
5353 +
5354  #if CARD_HFC_SX
5355  extern int setup_hfcsx(struct IsdnCard *card);
5356  #endif
5357 @@ -604,10 +629,6 @@
5358  extern int setup_netjet_u(struct IsdnCard *card);
5359  #endif
5360  
5361 -#if CARD_FN_ENTERNOW_PCI
5362 -extern int setup_enternow_pci(struct IsdnCard *card);
5363 -#endif
5364 -
5365  /*
5366   * Find card with given driverId
5367   */
5368 @@ -899,7 +920,8 @@
5369         return 3;
5370  }
5371  
5372 -static int __devinit checkcard(int cardnr, char *id, int *busy_flag)
5373 +static int __devinit checkcard(int cardnr, char *id, int *busy_flag,
5374 +                              void *load_drv)
5375  {
5376         long flags;
5377         int ret = 0;
5378 @@ -1093,6 +1115,12 @@
5379                 ret = setup_hfcsx(card);
5380                 break;
5381  #endif
5382 +#if CONFIG_HISAX_HFC_USB
5383 +       case ISDN_CTYPE_HFC_USB:
5384 +               cs->hw.hfcusb.drv = load_drv;
5385 +               ret = setup_hfc_usb(card);
5386 +               break;
5387 +#endif
5388  #if CARD_NICCY
5389         case ISDN_CTYPE_NICCY:
5390                 ret = setup_niccy(card);
5391 @@ -1143,11 +1171,6 @@
5392                 ret = setup_netjet_u(card);
5393                 break;
5394  #endif
5395 -#if CARD_FN_ENTERNOW_PCI
5396 -       case ISDN_CTYPE_ENTERNOW:
5397 -               ret = setup_enternow_pci(card);
5398 -               break;
5399 -#endif
5400         case ISDN_CTYPE_DYNAMIC:
5401                 ret = 2;
5402                 break;
5403 @@ -1186,6 +1209,9 @@
5404         case ISDN_CTYPE_DYNAMIC:
5405                 ret = 0;
5406                 break;
5407 +       case ISDN_CTYPE_HFC_USB:
5408 +               ret = cs->cardmsg(cs, CARD_INIT, NULL);
5409 +               break;
5410         default:
5411                 ret = init_card(cs);
5412                 break;
5413 @@ -1257,16 +1283,13 @@
5414                         else
5415                                 sprintf(ids, "%s%d", id, i);
5416                 }
5417 -               if (checkcard(i, ids, busy_flag)) {
5418 +               if (checkcard(i, ids, busy_flag, NULL)) {
5419                         foundcards++;
5420                         i++;
5421                 } else {
5422 -                       /* make sure we don't oops the module */
5423 -                       if (cards[i].typ > 0 && cards[i].typ <= ISDN_CTYPE_COUNT) {
5424 -                               printk(KERN_WARNING
5425 -                                       "HiSax: Card %s not installed !\n",
5426 -                                       CardType[cards[i].typ]);
5427 -                       }
5428 +                       printk(KERN_WARNING
5429 +                              "HiSax: Card %s not installed !\n",
5430 +                              CardType[cards[i].typ]);
5431                         HiSax_shiftcards(i);
5432                         nrcards--;
5433                 }
5434 @@ -1342,6 +1365,49 @@
5435  #endif
5436  }
5437  
5438 +#ifdef CONFIG_HISAX_HFC_USB
5439 +int
5440 +hisax_register_hfcusb(struct hisax_drvreg *l1drv)
5441 +{
5442 +       int i;
5443 +       char ids[30];
5444 +
5445 +       if (l1drv->version != HISAX_LOAD_VERSION)
5446 +               return 1;
5447 +
5448 +       switch (l1drv->cmd) {
5449 +       case HISAX_LOAD_CHKVER:
5450 +               break;  /* success */
5451 +
5452 +       case HISAX_LOAD_REGISTER:
5453 +               for (i = 0; i < HISAX_MAX_CARDS; i++) {
5454 +                       if (!cards[i].typ)
5455 +                               break;
5456 +               }
5457 +               if (i >= HISAX_MAX_CARDS)
5458 +                       return 1;       /* no space */
5459 +               cards[i].typ = ISDN_CTYPE_HFC_USB;      /* setup type */
5460 +               cards[i].protocol = DEFAULT_PROTO;
5461 +               sprintf(ids, "%s%d", l1drv->drvname, i);
5462 +               if (checkcard(i, ids, NULL, (void *) l1drv)) {
5463 +                       nrcards++;
5464 +                       return 0;
5465 +               }
5466 +               if (cards[i].cs)
5467 +                       kfree((void *) cards[i].cs);
5468 +               cards[i].cs = NULL;
5469 +               cards[i].typ = 0;       /* no card present */
5470 +               return 1;
5471 +               break;
5472 +
5473 +       default:
5474 +               return 1;       /* unknown command */
5475 +       }
5476 +
5477 +       return 0;
5478 +}                              /* hisax_register_hfcusb */
5479 +#endif
5480 +
5481  static int __init HiSax_init(void)
5482  {
5483         int i, retval;
5484 @@ -1408,8 +1474,6 @@
5485                 if (protocol[i]) {
5486                         cards[j].protocol = protocol[i];
5487                         nzproto++;
5488 -               } else {
5489 -                       cards[j].protocol = DEFAULT_PROTO;
5490                 }
5491                 switch (type[i]) {
5492                 case ISDN_CTYPE_16_0:
5493 @@ -1487,22 +1551,15 @@
5494                         } else {
5495                                 /* QUADRO is a 4 BRI card */
5496                                 cards[j++].para[0] = 1;
5497 -                               /* we need to check if further cards can be added */
5498 -                               if (j < HISAX_MAX_CARDS) {
5499 -                                       cards[j].typ = ISDN_CTYPE_SCT_QUADRO;
5500 -                                       cards[j].protocol = protocol[i];
5501 -                                       cards[j++].para[0] = 2;
5502 -                               }
5503 -                               if (j < HISAX_MAX_CARDS) {
5504 -                                       cards[j].typ = ISDN_CTYPE_SCT_QUADRO;
5505 -                                       cards[j].protocol = protocol[i];
5506 -                                       cards[j++].para[0] = 3;
5507 -                               }
5508 -                               if (j < HISAX_MAX_CARDS) {
5509 -                                       cards[j].typ = ISDN_CTYPE_SCT_QUADRO;
5510 -                                       cards[j].protocol = protocol[i];
5511 -                                       cards[j].para[0] = 4;
5512 -                               }
5513 +                               cards[j].typ = ISDN_CTYPE_SCT_QUADRO;
5514 +                               cards[j].protocol = protocol[i];
5515 +                               cards[j++].para[0] = 2;
5516 +                               cards[j].typ = ISDN_CTYPE_SCT_QUADRO;
5517 +                               cards[j].protocol = protocol[i];
5518 +                               cards[j++].para[0] = 3;
5519 +                               cards[j].typ = ISDN_CTYPE_SCT_QUADRO;
5520 +                               cards[j].protocol = protocol[i];
5521 +                               cards[j].para[0] = 4;
5522                         }
5523                         break;
5524                 }
5525 @@ -1526,10 +1583,15 @@
5526                nrcards, (nrcards > 1) ? "s" : "");
5527  
5528         /* Install only, if at least one card found */
5529 -       if (!HiSax_inithardware(NULL))
5530 -               return -ENODEV;
5531 +       if (!HiSax_inithardware(NULL)) {
5532 +               retval = -EIO;
5533 +               goto out_isdnl1;
5534 +       }
5535 +
5536         return 0;
5537  
5538 + out_isdnl1:
5539 +       Isdnl1Free();
5540   out_tei:
5541         TeiFree();
5542   out_isdnl2:
5543 @@ -1576,8 +1638,6 @@
5544                 cards[i].typ = type[i];
5545                 if (protocol[i]) {
5546                         cards[i].protocol = protocol[i];
5547 -               } else {
5548 -                       cards[i].protocol = DEFAULT_PROTO;
5549                 }
5550         }
5551         cards[0].para[0] = pcm_irq;
5552 @@ -1595,8 +1655,7 @@
5553         printk(KERN_DEBUG "HiSax: Total %d card%s defined\n",
5554                nrcards, (nrcards > 1) ? "s" : "");
5555  
5556 -       if (!HiSax_inithardware(busy_flag))
5557 -               return -ENODEV;
5558 +       HiSax_inithardware(busy_flag);
5559         printk(KERN_NOTICE "HiSax: module installed\n");
5560  #endif
5561         return 0;
5562 @@ -1619,8 +1678,6 @@
5563                 cards[i].typ = type[i];
5564                 if (protocol[i]) {
5565                         cards[i].protocol = protocol[i];
5566 -               } else {
5567 -                       cards[i].protocol = DEFAULT_PROTO;
5568                 }
5569         }
5570         cards[0].para[0] = pcm_irq;
5571 @@ -1638,8 +1695,7 @@
5572         printk(KERN_DEBUG "HiSax: Total %d card%s defined\n",
5573                nrcards, (nrcards > 1) ? "s" : "");
5574  
5575 -       if (!HiSax_inithardware(busy_flag))
5576 -               return -ENODEV;
5577 +       HiSax_inithardware(busy_flag);
5578         printk(KERN_NOTICE "HiSax: module installed\n");
5579  #endif
5580         return 0;
5581 @@ -1662,8 +1718,6 @@
5582                 cards[i].typ = type[i];
5583                 if (protocol[i]) {
5584                         cards[i].protocol = protocol[i];
5585 -               } else {
5586 -                       cards[i].protocol = DEFAULT_PROTO;
5587                 }
5588         }
5589         cards[0].para[0] = pcm_irq;
5590 @@ -1681,8 +1735,7 @@
5591         printk(KERN_DEBUG "HiSax: Total %d card%s defined\n",
5592                nrcards, (nrcards > 1) ? "s" : "");
5593  
5594 -       if (!HiSax_inithardware(busy_flag))
5595 -               return -ENODEV;
5596 +       HiSax_inithardware(busy_flag);
5597         printk(KERN_NOTICE "HiSax: module installed\n");
5598  #endif
5599         return 0;
5600 @@ -1705,8 +1758,6 @@
5601                 cards[i].typ = type[i];
5602                 if (protocol[i]) {
5603                         cards[i].protocol = protocol[i];
5604 -               } else {
5605 -                       cards[i].protocol = DEFAULT_PROTO;
5606                 }
5607         }
5608         cards[0].para[0] = pcm_irq;
5609 @@ -1724,8 +1775,7 @@
5610         printk(KERN_DEBUG "HiSax: Total %d card%s defined\n",
5611                nrcards, (nrcards > 1) ? "s" : "");
5612  
5613 -       if (!HiSax_inithardware(busy_flag))
5614 -               return -ENODEV;
5615 +       HiSax_inithardware(busy_flag);
5616         printk(KERN_NOTICE "HiSax: module installed\n");
5617  #endif
5618         return 0;
5619 @@ -1743,7 +1793,7 @@
5620                 sprintf(ids, "HiSax%d", nrcards);
5621         else
5622                 sprintf(ids, "HiSax");
5623 -       if (!checkcard(nrcards, ids, busy_flag)) {
5624 +       if (!checkcard(nrcards, ids, busy_flag, NULL)) {
5625                 return -1;
5626         }
5627         ret = nrcards;
5628 @@ -1785,7 +1835,7 @@
5629         cards[i].protocol = protocol;
5630         sprintf(id, "%s%d", name, i);
5631         nrcards++;
5632 -       retval = checkcard(i, id, 0);
5633 +       retval = checkcard(i, id, 0, NULL);
5634         if (retval == 0) { // yuck
5635                 cards[i].typ = 0;
5636                 nrcards--;
5637 @@ -2117,9 +2167,6 @@
5638         {PCI_VENDOR_ID_EICON,    PCI_DEVICE_ID_EICON_DIVA20,     PCI_ANY_ID, PCI_ANY_ID},
5639         {PCI_VENDOR_ID_EICON,    PCI_DEVICE_ID_EICON_DIVA20_U,   PCI_ANY_ID, PCI_ANY_ID},
5640         {PCI_VENDOR_ID_EICON,    PCI_DEVICE_ID_EICON_DIVA201,    PCI_ANY_ID, PCI_ANY_ID},
5641 -//#########################################################################################    
5642 -       {PCI_VENDOR_ID_EICON,    PCI_DEVICE_ID_EICON_DIVA202,    PCI_ANY_ID, PCI_ANY_ID},
5643 -//#########################################################################################    
5644  #endif
5645  #ifdef CONFIG_HISAX_ELSA
5646         {PCI_VENDOR_ID_ELSA,     PCI_DEVICE_ID_ELSA_MICROLINK,   PCI_ANY_ID, PCI_ANY_ID},
5647 @@ -2178,11 +2225,3 @@
5648  
5649  module_init(HiSax_init);
5650  module_exit(HiSax_exit);
5651 -
5652 -EXPORT_SYMBOL(FsmNew);
5653 -EXPORT_SYMBOL(FsmFree);
5654 -EXPORT_SYMBOL(FsmEvent);
5655 -EXPORT_SYMBOL(FsmChangeState);
5656 -EXPORT_SYMBOL(FsmInitTimer);
5657 -EXPORT_SYMBOL(FsmDelTimer);
5658 -EXPORT_SYMBOL(FsmRestartTimer);
5659 Index: linux-2.4.35.4/drivers/isdn/hisax/diva.c
5660 ===================================================================
5661 --- linux-2.4.35.4.orig/drivers/isdn/hisax/diva.c       2007-12-15 05:19:39.882693823 +0100
5662 +++ linux-2.4.35.4/drivers/isdn/hisax/diva.c    2007-12-15 05:19:55.551586742 +0100
5663 @@ -1,4 +1,4 @@
5664 -/* $Id: diva.c,v 1.1.4.2 2002/08/30 11:21:00 keil Exp $
5665 +/* $Id: diva.c,v 1.33 2001/09/24 13:22:56 kai Exp $
5666   *
5667   * low level stuff for Eicon.Diehl Diva Family ISDN cards
5668   *
5669 @@ -22,14 +22,13 @@
5670  #include "isac.h"
5671  #include "hscx.h"
5672  #include "ipac.h"
5673 -#include "ipacx.h"
5674  #include "isdnl1.h"
5675  #include <linux/pci.h>
5676 -#include <linux/isapnp.h>
5677 +#include <linux/isdn_compat.h>
5678  
5679  extern const char *CardType[];
5680  
5681 -const char *Diva_revision = "$Revision: 1.1.4.2 $";
5682 +const char *Diva_revision = "$Revision: 1.33 $";
5683  
5684  #define byteout(addr,val) outb(val,addr)
5685  #define bytein(addr) inb(addr)
5686 @@ -51,7 +50,6 @@
5687  #define DIVA_PCI       2
5688  #define DIVA_IPAC_ISA  3
5689  #define DIVA_IPAC_PCI  4
5690 -#define DIVA_IPACX_PCI 5
5691  
5692  /* CTRL (Read) */
5693  #define DIVA_IRQ_STAT  0x01
5694 @@ -71,12 +69,10 @@
5695  #define PITA_MISC_REG          0x1c
5696  #ifdef __BIG_ENDIAN
5697  #define PITA_PARA_SOFTRESET    0x00000001
5698 -#define PITA_SER_SOFTRESET     0x00000002
5699  #define PITA_PARA_MPX_MODE     0x00000004
5700  #define PITA_INT0_ENABLE       0x00000200
5701  #else
5702  #define PITA_PARA_SOFTRESET    0x01000000
5703 -#define PITA_SER_SOFTRESET     0x02000000
5704  #define PITA_PARA_MPX_MODE     0x04000000
5705  #define PITA_INT0_ENABLE       0x00020000
5706  #endif
5707 @@ -244,47 +240,6 @@
5708         memwritereg(cs->hw.diva.cfg_reg, offset + (hscx ? 0x40 : 0), value);
5709  }
5710  
5711 -/* IO-Functions for IPACX type cards */
5712 -static u_char
5713 -MemReadISAC_IPACX(struct IsdnCardState *cs, u_char offset)
5714 -{
5715 -       return (memreadreg(cs->hw.diva.cfg_reg, offset));
5716 -}
5717 -
5718 -static void
5719 -MemWriteISAC_IPACX(struct IsdnCardState *cs, u_char offset, u_char value)
5720 -{
5721 -       memwritereg(cs->hw.diva.cfg_reg, offset, value);
5722 -}
5723 -
5724 -static void
5725 -MemReadISACfifo_IPACX(struct IsdnCardState *cs, u_char * data, int size)
5726 -{
5727 -       while(size--)
5728 -               *data++ = memreadreg(cs->hw.diva.cfg_reg, 0);
5729 -}
5730 -
5731 -static void
5732 -MemWriteISACfifo_IPACX(struct IsdnCardState *cs, u_char * data, int size)
5733 -{
5734 -       while(size--)
5735 -               memwritereg(cs->hw.diva.cfg_reg, 0, *data++);
5736 -}
5737 -
5738 -static u_char
5739 -MemReadHSCX_IPACX(struct IsdnCardState *cs, int hscx, u_char offset)
5740 -{
5741 -       return(memreadreg(cs->hw.diva.cfg_reg, offset + 
5742 -                    (hscx ? IPACX_OFF_B2 : IPACX_OFF_B1)));
5743 -}
5744 -
5745 -static void
5746 -MemWriteHSCX_IPACX(struct IsdnCardState *cs, int hscx, u_char offset, u_char value)
5747 -{
5748 -       memwritereg(cs->hw.diva.cfg_reg, offset + 
5749 -              (hscx ? IPACX_OFF_B2 : IPACX_OFF_B1), value);
5750 -}
5751 -
5752  /*
5753   * fast interrupt HSCX stuff goes here
5754   */
5755 @@ -595,7 +550,7 @@
5756         u_char exval;
5757         struct BCState *bcs;
5758  
5759 -       if (val & 0x01) { // EXB
5760 +       if (val & 0x01) {
5761                 bcs = cs->bcs + 1;
5762                 exval = MemReadHSCX(cs, 1, HSCX_EXIR);
5763                 if (exval & 0x40) {
5764 @@ -622,7 +577,7 @@
5765                         debugl1(cs, "HSCX B interrupt %x", val);
5766                 Memhscx_interrupt(cs, val, 1);
5767         }
5768 -       if (val & 0x02) {       // EXA
5769 +       if (val & 0x02) {
5770                 bcs = cs->bcs;
5771                 exval = MemReadHSCX(cs, 0, HSCX_EXIR);
5772                 if (exval & 0x40) {
5773 @@ -644,7 +599,7 @@
5774                 } else if (cs->debug & L1_DEB_HSCX)
5775                         debugl1(cs, "HSCX A EXIR %x", exval);
5776         }
5777 -       if (val & 0x04) {       // ICA
5778 +       if (val & 0x04) {
5779                 exval = MemReadHSCX(cs, 0, HSCX_ISTA);
5780                 if (cs->debug & L1_DEB_HSCX)
5781                         debugl1(cs, "HSCX A interrupt %x", exval);
5782 @@ -705,31 +660,12 @@
5783         memwritereg(cs->hw.diva.cfg_reg, IPAC_MASK, 0xC0);
5784  }
5785  
5786 -static void
5787 -diva_irq_ipacx_pci(int intno, void *dev_id, struct pt_regs *regs)
5788 -{
5789 -       struct IsdnCardState *cs = dev_id;
5790 -       u_char val;
5791 -       u_char *cfg;
5792 -
5793 -       if (!cs) {
5794 -               printk(KERN_WARNING "Diva: Spurious interrupt!\n");
5795 -               return;
5796 -       }
5797 -       cfg = (u_char *) cs->hw.diva.pci_cfg;
5798 -       val = *cfg;
5799 -       if (!(val &PITA_INT0_STATUS)) return; // other shared IRQ
5800 -  interrupt_ipacx(cs);      // handler for chip
5801 -       *cfg = PITA_INT0_STATUS;  // Reset PLX interrupt
5802 -}
5803 -
5804  void
5805  release_io_diva(struct IsdnCardState *cs)
5806  {
5807         int bytecnt;
5808  
5809 -       if ((cs->subtyp == DIVA_IPAC_PCI) || 
5810 -           (cs->subtyp == DIVA_IPACX_PCI)   ) {
5811 +       if (cs->subtyp == DIVA_IPAC_PCI) {
5812                 u_int *cfg = (unsigned int *)cs->hw.diva.pci_cfg;
5813  
5814                 *cfg = 0; /* disable INT0/1 */ 
5815 @@ -776,16 +712,6 @@
5816                 set_current_state(TASK_UNINTERRUPTIBLE);
5817                 schedule_timeout((10*HZ)/1000);
5818                 memwritereg(cs->hw.diva.cfg_reg, IPAC_MASK, 0xc0);
5819 -       } else if (cs->subtyp == DIVA_IPACX_PCI) {
5820 -               unsigned int *ireg = (unsigned int *)(cs->hw.diva.pci_cfg +
5821 -                                       PITA_MISC_REG);
5822 -               *ireg = PITA_PARA_SOFTRESET | PITA_PARA_MPX_MODE;
5823 -               set_current_state(TASK_UNINTERRUPTIBLE);
5824 -               schedule_timeout((10*HZ)/1000);
5825 -               *ireg = PITA_PARA_MPX_MODE | PITA_SER_SOFTRESET;
5826 -               set_current_state(TASK_UNINTERRUPTIBLE);
5827 -               schedule_timeout((10*HZ)/1000);
5828 -               MemWriteISAC_IPACX(cs, IPACX_MASK, 0xff); // Interrupts off
5829         } else { /* DIVA 2.0 */
5830                 cs->hw.diva.ctrl_reg = 0;        /* Reset On */
5831                 byteout(cs->hw.diva.ctrl, cs->hw.diva.ctrl_reg);
5832 @@ -814,9 +740,7 @@
5833  {
5834         int blink = 0;
5835  
5836 -       if ((cs->subtyp == DIVA_IPAC_ISA) ||
5837 -           (cs->subtyp == DIVA_IPAC_PCI) ||
5838 -           (cs->subtyp == DIVA_IPACX_PCI)   )
5839 +       if ((cs->subtyp == DIVA_IPAC_ISA) || (cs->subtyp == DIVA_IPAC_PCI))
5840                 return;
5841         del_timer(&cs->hw.diva.tl);
5842         if (cs->hw.diva.status & DIVA_ASSIGN)
5843 @@ -859,12 +783,6 @@
5844                         release_io_diva(cs);
5845                         return(0);
5846                 case CARD_INIT:
5847 -                       if (cs->subtyp == DIVA_IPACX_PCI) {
5848 -                               ireg = (unsigned int *)cs->hw.diva.pci_cfg;
5849 -                               *ireg = PITA_INT0_ENABLE;
5850 -                         init_ipacx(cs, 3); // init chip and enable interrupts
5851 -        return (0);
5852 -                       }
5853                         if (cs->subtyp == DIVA_IPAC_PCI) {
5854                                 ireg = (unsigned int *)cs->hw.diva.pci_cfg;
5855                                 *ireg = PITA_INT0_ENABLE;
5856 @@ -901,9 +819,7 @@
5857                         }
5858                         break;
5859         }
5860 -       if ((cs->subtyp != DIVA_IPAC_ISA) && 
5861 -           (cs->subtyp != DIVA_IPAC_PCI) &&
5862 -           (cs->subtyp != DIVA_IPACX_PCI)   )
5863 +       if ((cs->subtyp != DIVA_IPAC_ISA) && (cs->subtyp != DIVA_IPAC_PCI))
5864                 diva_led_handler(cs);
5865         return(0);
5866  }
5867 @@ -911,40 +827,11 @@
5868  static struct pci_dev *dev_diva __initdata = NULL;
5869  static struct pci_dev *dev_diva_u __initdata = NULL;
5870  static struct pci_dev *dev_diva201 __initdata = NULL;
5871 -static struct pci_dev *dev_diva202 __initdata = NULL;
5872 -
5873 -#ifdef __ISAPNP__
5874 -static struct isapnp_device_id diva_ids[] __initdata = {
5875 -       { ISAPNP_VENDOR('G', 'D', 'I'), ISAPNP_FUNCTION(0x51),
5876 -         ISAPNP_VENDOR('G', 'D', 'I'), ISAPNP_FUNCTION(0x51), 
5877 -         (unsigned long) "Diva picola" },
5878 -       { ISAPNP_VENDOR('G', 'D', 'I'), ISAPNP_FUNCTION(0x51),
5879 -         ISAPNP_VENDOR('E', 'I', 'C'), ISAPNP_FUNCTION(0x51), 
5880 -         (unsigned long) "Diva picola" },
5881 -       { ISAPNP_VENDOR('G', 'D', 'I'), ISAPNP_FUNCTION(0x71),
5882 -         ISAPNP_VENDOR('G', 'D', 'I'), ISAPNP_FUNCTION(0x71), 
5883 -         (unsigned long) "Diva 2.0" },
5884 -       { ISAPNP_VENDOR('G', 'D', 'I'), ISAPNP_FUNCTION(0x71),
5885 -         ISAPNP_VENDOR('E', 'I', 'C'), ISAPNP_FUNCTION(0x71), 
5886 -         (unsigned long) "Diva 2.0" },
5887 -       { ISAPNP_VENDOR('G', 'D', 'I'), ISAPNP_FUNCTION(0xA1),
5888 -         ISAPNP_VENDOR('G', 'D', 'I'), ISAPNP_FUNCTION(0xA1), 
5889 -         (unsigned long) "Diva 2.01" },
5890 -       { ISAPNP_VENDOR('G', 'D', 'I'), ISAPNP_FUNCTION(0xA1),
5891 -         ISAPNP_VENDOR('E', 'I', 'C'), ISAPNP_FUNCTION(0xA1), 
5892 -         (unsigned long) "Diva 2.01" },
5893 -       { 0, }
5894 -};
5895 -
5896 -static struct isapnp_device_id *pdev = &diva_ids[0];
5897 -static struct pci_bus *pnp_c __devinitdata = NULL;
5898 -#endif
5899 -
5900  
5901  int __init
5902  setup_diva(struct IsdnCard *card)
5903  {
5904 -       int bytecnt = 8;
5905 +       int bytecnt;
5906         u_char val;
5907         struct IsdnCardState *cs = card->cs;
5908         char tmp[64];
5909 @@ -977,75 +864,8 @@
5910                         cs->hw.diva.hscx_adr = card->para[1] + DIVA_HSCX_ADR;
5911                 }
5912                 cs->irq = card->para[0];
5913 +               bytecnt = 8;
5914         } else {
5915 -#ifdef __ISAPNP__
5916 -               if (isapnp_present()) {
5917 -                       struct pci_bus *pb;
5918 -                       struct pci_dev *pd;
5919 -
5920 -                       while(pdev->card_vendor) {
5921 -                               if ((pb = isapnp_find_card(pdev->card_vendor,
5922 -                                       pdev->card_device, pnp_c))) {
5923 -                                       pnp_c = pb;
5924 -                                       pd = NULL;
5925 -                                       if ((pd = isapnp_find_dev(pnp_c,
5926 -                                               pdev->vendor, pdev->function, pd))) {
5927 -                                               printk(KERN_INFO "HiSax: %s detected\n",
5928 -                                                       (char *)pdev->driver_data);
5929 -                                               pd->prepare(pd);
5930 -                                               pd->deactivate(pd);
5931 -                                               pd->activate(pd);
5932 -                                               card->para[1] =
5933 -                                                       pd->resource[0].start;
5934 -                                               card->para[0] =
5935 -                                                       pd->irq_resource[0].start;
5936 -                                               if (!card->para[0] || !card->para[1]) {
5937 -                                                       printk(KERN_ERR "Diva PnP:some resources are missing %ld/%lx\n",
5938 -                                                               card->para[0], card->para[1]);
5939 -                                                       pd->deactivate(pd);
5940 -                                                       return(0);
5941 -                                               }
5942 -                                               cs->hw.diva.cfg_reg  = card->para[1];
5943 -                                               cs->irq = card->para[0];
5944 -                                               if (pdev->function == ISAPNP_FUNCTION(0xA1)) {
5945 -                                                       cs->subtyp = DIVA_IPAC_ISA;
5946 -                                                       cs->hw.diva.ctrl = 0;
5947 -                                                       cs->hw.diva.isac =
5948 -                                                               card->para[1] + DIVA_IPAC_DATA;
5949 -                                                       cs->hw.diva.hscx =
5950 -                                                               card->para[1] + DIVA_IPAC_DATA;
5951 -                                                       cs->hw.diva.isac_adr =
5952 -                                                               card->para[1] + DIVA_IPAC_ADR;
5953 -                                                       cs->hw.diva.hscx_adr =
5954 -                                                               card->para[1] + DIVA_IPAC_ADR;
5955 -                                                       test_and_set_bit(HW_IPAC, &cs->HW_Flags);
5956 -                                               } else {
5957 -                                                       cs->subtyp = DIVA_ISA;
5958 -                                                       cs->hw.diva.ctrl =
5959 -                                                               card->para[1] + DIVA_ISA_CTRL;
5960 -                                                       cs->hw.diva.isac =
5961 -                                                               card->para[1] + DIVA_ISA_ISAC_DATA;
5962 -                                                       cs->hw.diva.hscx =
5963 -                                                               card->para[1] + DIVA_HSCX_DATA;
5964 -                                                       cs->hw.diva.isac_adr =
5965 -                                                               card->para[1] + DIVA_ISA_ISAC_ADR;
5966 -                                                       cs->hw.diva.hscx_adr =
5967 -                                                               card->para[1] + DIVA_HSCX_ADR;
5968 -                                               }
5969 -                                               goto ready;
5970 -                                       } else {
5971 -                                               printk(KERN_ERR "Diva PnP: PnP error card found, no device\n");
5972 -                                               return(0);
5973 -                                       }
5974 -                               }
5975 -                               pdev++;
5976 -                               pnp_c=NULL;
5977 -                       } 
5978 -                       if (!pdev->card_vendor) {
5979 -                               printk(KERN_INFO "Diva PnP: no ISAPnP card found\n");
5980 -                       }
5981 -               }
5982 -#endif
5983  #if CONFIG_PCI
5984                 if (!pci_present()) {
5985                         printk(KERN_ERR "Diva: no PCI bus present\n");
5986 @@ -1059,14 +879,14 @@
5987                                 return(0);
5988                         cs->subtyp = DIVA_PCI;
5989                         cs->irq = dev_diva->irq;
5990 -                       cs->hw.diva.cfg_reg = pci_resource_start(dev_diva, 2);
5991 +                       cs->hw.diva.cfg_reg = pci_resource_start_io(dev_diva, 2);
5992                 } else if ((dev_diva_u = pci_find_device(PCI_VENDOR_ID_EICON,
5993                         PCI_DEVICE_ID_EICON_DIVA20_U, dev_diva_u))) {
5994                         if (pci_enable_device(dev_diva_u))
5995                                 return(0);
5996                         cs->subtyp = DIVA_PCI;
5997                         cs->irq = dev_diva_u->irq;
5998 -                       cs->hw.diva.cfg_reg = pci_resource_start(dev_diva_u, 2);
5999 +                       cs->hw.diva.cfg_reg = pci_resource_start_io(dev_diva_u, 2);
6000                 } else if ((dev_diva201 = pci_find_device(PCI_VENDOR_ID_EICON,
6001                         PCI_DEVICE_ID_EICON_DIVA201, dev_diva201))) {
6002                         if (pci_enable_device(dev_diva201))
6003 @@ -1074,19 +894,9 @@
6004                         cs->subtyp = DIVA_IPAC_PCI;
6005                         cs->irq = dev_diva201->irq;
6006                         cs->hw.diva.pci_cfg =
6007 -                               (ulong) ioremap(pci_resource_start(dev_diva201, 0), 4096);
6008 +                               (ulong) ioremap(pci_resource_start_mem(dev_diva201, 0), 4096);
6009                         cs->hw.diva.cfg_reg =
6010 -                               (ulong) ioremap(pci_resource_start(dev_diva201, 1), 4096);
6011 -               } else if ((dev_diva202 = pci_find_device(PCI_VENDOR_ID_EICON,
6012 -                       PCI_DEVICE_ID_EICON_DIVA202, dev_diva202))) {
6013 -                       if (pci_enable_device(dev_diva202))
6014 -                               return(0);
6015 -                       cs->subtyp = DIVA_IPACX_PCI;
6016 -                       cs->irq = dev_diva202->irq;
6017 -                       cs->hw.diva.pci_cfg =
6018 -                               (ulong) ioremap(pci_resource_start(dev_diva202, 0), 4096);
6019 -                       cs->hw.diva.cfg_reg =
6020 -                               (ulong) ioremap(pci_resource_start(dev_diva202, 1), 4096);
6021 +                               (ulong) ioremap(pci_resource_start_mem(dev_diva201, 1), 4096);
6022                 } else {
6023                         printk(KERN_WARNING "Diva: No PCI card found\n");
6024                         return(0);
6025 @@ -1107,8 +917,7 @@
6026                 printk(KERN_WARNING "Diva: unable to config DIVA PCI\n");
6027                 return (0);
6028  #endif /* CONFIG_PCI */
6029 -               if ((cs->subtyp == DIVA_IPAC_PCI) ||
6030 -                   (cs->subtyp == DIVA_IPACX_PCI)   ) {
6031 +               if (cs->subtyp == DIVA_IPAC_PCI) {
6032                         cs->hw.diva.ctrl = 0;
6033                         cs->hw.diva.isac = 0;
6034                         cs->hw.diva.hscx = 0;
6035 @@ -1125,23 +934,18 @@
6036                         bytecnt = 32;
6037                 }
6038         }
6039 -ready:
6040 +
6041         printk(KERN_INFO
6042                 "Diva: %s card configured at %#lx IRQ %d\n",
6043                 (cs->subtyp == DIVA_PCI) ? "PCI" :
6044                 (cs->subtyp == DIVA_ISA) ? "ISA" : 
6045 -               (cs->subtyp == DIVA_IPAC_ISA) ? "IPAC ISA" :
6046 -               (cs->subtyp == DIVA_IPAC_PCI) ? "IPAC PCI" : "IPACX PCI",
6047 +               (cs->subtyp == DIVA_IPAC_ISA) ? "IPAC ISA" : "IPAC PCI",
6048                 cs->hw.diva.cfg_reg, cs->irq);
6049 -       if ((cs->subtyp == DIVA_IPAC_PCI)  || 
6050 -           (cs->subtyp == DIVA_IPACX_PCI) || 
6051 -           (cs->subtyp == DIVA_PCI)         )
6052 -               printk(KERN_INFO "Diva: %s space at %#lx\n",
6053 -                       (cs->subtyp == DIVA_PCI) ? "PCI" :
6054 -                       (cs->subtyp == DIVA_IPAC_PCI) ? "IPAC PCI" : "IPACX PCI",
6055 +       if ((cs->subtyp == DIVA_IPAC_PCI) || (cs->subtyp == DIVA_PCI))
6056 +               printk(KERN_INFO "Diva: %s PCI space at %#lx\n",
6057 +                       (cs->subtyp == DIVA_PCI) ? "PCI" : "IPAC PCI",
6058                         cs->hw.diva.pci_cfg);
6059 -       if ((cs->subtyp != DIVA_IPAC_PCI) &&
6060 -           (cs->subtyp != DIVA_IPACX_PCI)   ) {
6061 +       if (cs->subtyp != DIVA_IPAC_PCI) {
6062                 if (check_region(cs->hw.diva.cfg_reg, bytecnt)) {
6063                         printk(KERN_WARNING
6064                                "HiSax: %s config port %lx-%lx already in use\n",
6065 @@ -1177,17 +981,6 @@
6066                 cs->irq_func = &diva_irq_ipac_pci;
6067                 val = memreadreg(cs->hw.diva.cfg_reg, IPAC_ID);
6068                 printk(KERN_INFO "Diva: IPAC version %x\n", val);
6069 -       } else if (cs->subtyp == DIVA_IPACX_PCI) {
6070 -               cs->readisac  = &MemReadISAC_IPACX;
6071 -               cs->writeisac = &MemWriteISAC_IPACX;
6072 -               cs->readisacfifo  = &MemReadISACfifo_IPACX;
6073 -               cs->writeisacfifo = &MemWriteISACfifo_IPACX;
6074 -               cs->BC_Read_Reg  = &MemReadHSCX_IPACX;
6075 -               cs->BC_Write_Reg = &MemWriteHSCX_IPACX;
6076 -               cs->BC_Send_Data = 0; // function located in ipacx module
6077 -               cs->irq_func = &diva_irq_ipacx_pci;
6078 -               printk(KERN_INFO "Diva: IPACX Design Id: %x\n", 
6079 -            MemReadISAC_IPACX(cs, IPACX_ID) &0x3F);
6080         } else { /* DIVA 2.0 */
6081                 cs->hw.diva.tl.function = (void *) diva_led_handler;
6082                 cs->hw.diva.tl.data = (long) cs;
6083 Index: linux-2.4.35.4/drivers/isdn/hisax/elsa.c
6084 ===================================================================
6085 --- linux-2.4.35.4.orig/drivers/isdn/hisax/elsa.c       2007-12-15 05:19:39.890694279 +0100
6086 +++ linux-2.4.35.4/drivers/isdn/hisax/elsa.c    2007-12-15 05:19:55.555586971 +0100
6087 @@ -1,4 +1,4 @@
6088 -/* $Id: elsa.c,v 1.1.4.1 2001/11/20 14:19:35 kai Exp $
6089 +/* $Id: elsa.c,v 2.32 2001/09/24 13:22:56 kai Exp $
6090   *
6091   * low level stuff for Elsa isdn cards
6092   *
6093 @@ -28,13 +28,13 @@
6094  #include "hscx.h"
6095  #include "isdnl1.h"
6096  #include <linux/pci.h>
6097 -#include <linux/isapnp.h>
6098 +#include <linux/isdn_compat.h>
6099  #include <linux/serial.h>
6100  #include <linux/serial_reg.h>
6101  
6102  extern const char *CardType[];
6103  
6104 -const char *Elsa_revision = "$Revision: 1.1.4.1 $";
6105 +const char *Elsa_revision = "$Revision: 2.32 $";
6106  const char *Elsa_Types[] =
6107  {"None", "PC", "PCC-8", "PCC-16", "PCF", "PCF-Pro",
6108   "PCMCIA", "QS 1000", "QS 3000", "Microlink PCI", "QS 3000 PCI", 
6109 @@ -864,21 +864,6 @@
6110  static         struct pci_dev *dev_qs1000 __devinitdata = NULL;
6111  static         struct pci_dev *dev_qs3000 __devinitdata = NULL;
6112  
6113 -#ifdef __ISAPNP__
6114 -static struct isapnp_device_id elsa_ids[] __initdata = {
6115 -       { ISAPNP_VENDOR('E', 'L', 'S'), ISAPNP_FUNCTION(0x0133),
6116 -         ISAPNP_VENDOR('E', 'L', 'S'), ISAPNP_FUNCTION(0x0133), 
6117 -         (unsigned long) "Elsa QS1000" },
6118 -       { ISAPNP_VENDOR('E', 'L', 'S'), ISAPNP_FUNCTION(0x0134),
6119 -         ISAPNP_VENDOR('E', 'L', 'S'), ISAPNP_FUNCTION(0x0134), 
6120 -         (unsigned long) "Elsa QS3000" },
6121 -       { 0, }
6122 -};
6123 -
6124 -static struct isapnp_device_id *pdev = &elsa_ids[0];
6125 -static struct pci_bus *pnp_c __devinitdata = NULL;
6126 -#endif
6127 -
6128  int __devinit
6129  setup_elsa(struct IsdnCard *card)
6130  {
6131 @@ -893,7 +878,6 @@
6132         cs->hw.elsa.ctrl_reg = 0;
6133         cs->hw.elsa.status = 0;
6134         cs->hw.elsa.MFlag = 0;
6135 -       cs->subtyp = 0;
6136         if (cs->typ == ISDN_CTYPE_ELSA) {
6137                 cs->hw.elsa.base = card->para[0];
6138                 printk(KERN_INFO "Elsa: Microlink IO probing\n");
6139 @@ -955,60 +939,9 @@
6140                         return (0);
6141                 }
6142         } else if (cs->typ == ISDN_CTYPE_ELSA_PNP) {
6143 -#ifdef __ISAPNP__
6144 -               if (!card->para[1] && isapnp_present()) {
6145 -                       struct pci_bus *pb;
6146 -                       struct pci_dev *pd;
6147 -
6148 -                       while(pdev->card_vendor) {
6149 -                               if ((pb = isapnp_find_card(pdev->card_vendor,
6150 -                                       pdev->card_device, pnp_c))) {
6151 -                                       pnp_c = pb;
6152 -                                       pd = NULL;
6153 -                                       if ((pd = isapnp_find_dev(pnp_c,
6154 -                                               pdev->vendor, pdev->function, pd))) {
6155 -                                               printk(KERN_INFO "HiSax: %s detected\n",
6156 -                                                       (char *)pdev->driver_data);
6157 -                                               pd->prepare(pd);
6158 -                                               pd->deactivate(pd);
6159 -                                               pd->activate(pd);
6160 -                                               card->para[1] =
6161 -                                                       pd->resource[0].start;
6162 -                                               card->para[0] =
6163 -                                                       pd->irq_resource[0].start;
6164 -                                               if (!card->para[0] || !card->para[1]) {
6165 -                                                       printk(KERN_ERR "Elsa PnP:some resources are missing %ld/%lx\n",
6166 -                                                               card->para[0], card->para[1]);
6167 -                                                       pd->deactivate(pd);
6168 -                                                       return(0);
6169 -                                               }
6170 -                                               if (pdev->function == ISAPNP_FUNCTION(0x133))
6171 -                                                       cs->subtyp = ELSA_QS1000;
6172 -                                               else
6173 -                                                       cs->subtyp = ELSA_QS3000;
6174 -                                               break;
6175 -                                       } else {
6176 -                                               printk(KERN_ERR "Elsa PnP: PnP error card found, no device\n");
6177 -                                               return(0);
6178 -                                       }
6179 -                               }
6180 -                               pdev++;
6181 -                               pnp_c=NULL;
6182 -                       } 
6183 -                       if (!pdev->card_vendor) {
6184 -                               printk(KERN_INFO "Elsa PnP: no ISAPnP card found\n");
6185 -                               return(0);
6186 -                       }
6187 -               }
6188 -#endif
6189 -               if (card->para[1] && card->para[0]) { 
6190 -                       cs->hw.elsa.base = card->para[1];
6191 -                       cs->irq = card->para[0];
6192 -                       if (!cs->subtyp)
6193 -                               cs->subtyp = ELSA_QS1000;
6194 -               } else {
6195 -                       printk(KERN_ERR "Elsa PnP: no parameter\n");
6196 -               }
6197 +               cs->hw.elsa.base = card->para[1];
6198 +               cs->irq = card->para[0];
6199 +               cs->subtyp = ELSA_QS1000;
6200                 cs->hw.elsa.cfg = cs->hw.elsa.base + ELSA_CONFIG;
6201                 cs->hw.elsa.ale = cs->hw.elsa.base + ELSA_ALE;
6202                 cs->hw.elsa.isac = cs->hw.elsa.base + ELSA_ISAC;
6203 @@ -1058,16 +991,16 @@
6204                                 return(0);
6205                         cs->subtyp = ELSA_QS1000PCI;
6206                         cs->irq = dev_qs1000->irq;
6207 -                       cs->hw.elsa.cfg = pci_resource_start(dev_qs1000, 1);
6208 -                       cs->hw.elsa.base = pci_resource_start(dev_qs1000, 3);
6209 +                       cs->hw.elsa.cfg = pci_resource_start_io(dev_qs1000, 1);
6210 +                       cs->hw.elsa.base = pci_resource_start_io(dev_qs1000, 3);
6211                 } else if ((dev_qs3000 = pci_find_device(PCI_VENDOR_ID_ELSA,
6212                         PCI_DEVICE_ID_ELSA_QS3000, dev_qs3000))) {
6213                         if (pci_enable_device(dev_qs3000))
6214                                 return(0);
6215                         cs->subtyp = ELSA_QS3000PCI;
6216                         cs->irq = dev_qs3000->irq;
6217 -                       cs->hw.elsa.cfg = pci_resource_start(dev_qs3000, 1);
6218 -                       cs->hw.elsa.base = pci_resource_start(dev_qs3000, 3);
6219 +                       cs->hw.elsa.cfg = pci_resource_start_io(dev_qs3000, 1);
6220 +                       cs->hw.elsa.base = pci_resource_start_io(dev_qs3000, 3);
6221                 } else {
6222                         printk(KERN_WARNING "Elsa: No PCI card found\n");
6223                         return(0);
6224 @@ -1123,7 +1056,6 @@
6225                         break;
6226                 case ELSA_PCFPRO:
6227                 case ELSA_PCF:
6228 -               case ELSA_QS3000:
6229                 case ELSA_QS3000PCI:
6230                         bytecnt = 16;
6231                         break;
6232 Index: linux-2.4.35.4/drivers/isdn/hisax/elsa_cs.c
6233 ===================================================================
6234 --- linux-2.4.35.4.orig/drivers/isdn/hisax/elsa_cs.c    2007-12-15 05:19:39.894694508 +0100
6235 +++ linux-2.4.35.4/drivers/isdn/hisax/elsa_cs.c 2007-12-15 05:19:55.555586971 +0100
6236 @@ -72,7 +72,7 @@
6237  MODULE_PARM(pc_debug, "i");
6238  #define DEBUG(n, args...) if (pc_debug>(n)) printk(KERN_DEBUG args);
6239  static char *version =
6240 -"elsa_cs.c $Revision: 1.1.4.1 $ $Date: 2001/11/20 14:19:35 $ (K.Lichtenwalder)";
6241 +"elsa_cs.c $Revision: 1.2 $ $Date: 2001/09/24 13:22:56 $ (K.Lichtenwalder)";
6242  #else
6243  #define DEBUG(n, args...)
6244  #endif
6245 Index: linux-2.4.35.4/drivers/isdn/hisax/elsa_ser.c
6246 ===================================================================
6247 --- linux-2.4.35.4.orig/drivers/isdn/hisax/elsa_ser.c   2007-12-15 05:19:39.902694963 +0100
6248 +++ linux-2.4.35.4/drivers/isdn/hisax/elsa_ser.c        2007-12-15 05:19:55.555586971 +0100
6249 @@ -1,4 +1,4 @@
6250 -/* $Id: elsa_ser.c,v 1.1.4.1 2001/11/20 14:19:35 kai Exp $
6251 +/* $Id: elsa_ser.c,v 2.14 2001/09/24 13:22:56 kai Exp $
6252   *
6253   * stuff for the serial modem on ELSA cards
6254   *
6255 @@ -396,6 +396,74 @@
6256         }
6257  }
6258  
6259 +#if 0
6260 +static inline void check_modem_status(struct IsdnCardState *cs)
6261 +{
6262 +       int     status;
6263 +       struct async_struct *info = cs->hw.elsa.info;
6264 +       struct  async_icount *icount;
6265 +       
6266 +       status = serial_inp(info, UART_MSR);
6267 +
6268 +       if (status & UART_MSR_ANY_DELTA) {
6269 +               icount = &info->state->icount;
6270 +               /* update input line counters */
6271 +               if (status & UART_MSR_TERI)
6272 +                       icount->rng++;
6273 +               if (status & UART_MSR_DDSR)
6274 +                       icount->dsr++;
6275 +               if (status & UART_MSR_DDCD) {
6276 +                       icount->dcd++;
6277 +               }
6278 +               if (status & UART_MSR_DCTS)
6279 +                       icount->cts++;
6280 +//             wake_up(&info->delta_msr_wait);
6281 +       }
6282 +
6283 +       if ((info->flags & ASYNC_CHECK_CD) && (status & UART_MSR_DDCD)) {
6284 +#if (defined(SERIAL_DEBUG_OPEN) || defined(SERIAL_DEBUG_INTR))
6285 +               printk("ttys%d CD now %s...", info->line,
6286 +                      (status & UART_MSR_DCD) ? "on" : "off");
6287 +#endif         
6288 +               if (status & UART_MSR_DCD)
6289 +//                     wake_up(&info->open_wait);
6290 +;
6291 +               else if (!((info->flags & ASYNC_CALLOUT_ACTIVE) &&
6292 +                          (info->flags & ASYNC_CALLOUT_NOHUP))) {
6293 +#ifdef SERIAL_DEBUG_OPEN
6294 +                       printk("doing serial hangup...");
6295 +#endif
6296 +                       if (info->tty)
6297 +                               tty_hangup(info->tty);
6298 +               }
6299 +       }
6300 +#if 0
6301 +       if (info->flags & ASYNC_CTS_FLOW) {
6302 +               if (info->tty->hw_stopped) {
6303 +                       if (status & UART_MSR_CTS) {
6304 +#if (defined(SERIAL_DEBUG_INTR) || defined(SERIAL_DEBUG_FLOW))
6305 +                               printk("CTS tx start...");
6306 +#endif
6307 +                               info->tty->hw_stopped = 0;
6308 +                               info->IER |= UART_IER_THRI;
6309 +                               serial_outp(info, UART_IER, info->IER);
6310 +//                             rs_sched_event(info, RS_EVENT_WRITE_WAKEUP);
6311 +                               return;
6312 +                       }
6313 +               } else {
6314 +                       if (!(status & UART_MSR_CTS)) {
6315 +#if (defined(SERIAL_DEBUG_INTR) || defined(SERIAL_DEBUG_FLOW))
6316 +                               printk("CTS tx stop...");
6317 +#endif
6318 +                               info->tty->hw_stopped = 1;
6319 +                               info->IER &= ~UART_IER_THRI;
6320 +                               serial_outp(info, UART_IER, info->IER);
6321 +                       }
6322 +               }
6323 +       }
6324 +#endif 0
6325 +}
6326 +#endif
6327  
6328  static void rs_interrupt_elsa(int irq, struct IsdnCardState *cs)
6329  {
6330 Index: linux-2.4.35.4/drivers/isdn/hisax/fsm.c
6331 ===================================================================
6332 --- linux-2.4.35.4.orig/drivers/isdn/hisax/fsm.c        2007-12-15 05:19:39.910695419 +0100
6333 +++ linux-2.4.35.4/drivers/isdn/hisax/fsm.c     2007-12-15 05:19:55.555586971 +0100
6334 @@ -1,4 +1,4 @@
6335 -/* $Id: fsm.c,v 1.1.4.1 2001/11/20 14:19:35 kai Exp $
6336 +/* $Id$
6337   *
6338   * Finite state machine
6339   *
6340 @@ -21,6 +21,14 @@
6341  
6342  #define FSM_TIMER_DEBUG 0
6343  
6344 +EXPORT_SYMBOL(FsmNew);
6345 +EXPORT_SYMBOL(FsmFree);
6346 +EXPORT_SYMBOL(FsmEvent);
6347 +EXPORT_SYMBOL(FsmChangeState);
6348 +EXPORT_SYMBOL(FsmInitTimer);
6349 +EXPORT_SYMBOL(FsmDelTimer);
6350 +EXPORT_SYMBOL(FsmRestartTimer);
6351 +
6352  int __init
6353  FsmNew(struct Fsm *fsm, struct FsmNode *fnlist, int fncount)
6354  {
6355 Index: linux-2.4.35.4/drivers/isdn/hisax/fsm.h
6356 ===================================================================
6357 --- linux-2.4.35.4.orig/drivers/isdn/hisax/fsm.h        2007-12-15 05:19:39.918695874 +0100
6358 +++ linux-2.4.35.4/drivers/isdn/hisax/fsm.h     2007-12-15 05:19:55.555586971 +0100
6359 @@ -1,4 +1,4 @@
6360 -/* $Id: fsm.h,v 1.1.2.1 2001/11/20 14:19:35 kai Exp $
6361 +/* $Id$
6362   *
6363   * Finite state machine
6364   *
6365 Index: linux-2.4.35.4/drivers/isdn/hisax/gazel.c
6366 ===================================================================
6367 --- linux-2.4.35.4.orig/drivers/isdn/hisax/gazel.c      2007-12-15 05:19:39.922696103 +0100
6368 +++ linux-2.4.35.4/drivers/isdn/hisax/gazel.c   2007-12-15 05:19:55.559587200 +0100
6369 @@ -1,4 +1,4 @@
6370 -/* $Id: gazel.c,v 1.1.4.1 2001/11/20 14:19:35 kai Exp $
6371 +/* $Id: gazel.c,v 2.19 2001/09/24 13:22:56 kai Exp $
6372   *
6373   * low level stuff for Gazel isdn cards
6374   *
6375 @@ -20,9 +20,10 @@
6376  #include "isdnl1.h"
6377  #include "ipac.h"
6378  #include <linux/pci.h>
6379 +#include <linux/isdn_compat.h>
6380  
6381  extern const char *CardType[];
6382 -const char *gazel_revision = "$Revision: 1.1.4.1 $";
6383 +const char *gazel_revision = "$Revision: 2.19 $";
6384  
6385  #define R647      1
6386  #define R685      2
6387 @@ -563,8 +564,8 @@
6388                         if (pci_enable_device(dev_tel))
6389                                 return 1;
6390                         pci_irq = dev_tel->irq;
6391 -                       pci_ioaddr0 = pci_resource_start(dev_tel, 1);
6392 -                       pci_ioaddr1 = pci_resource_start(dev_tel, 2);
6393 +                       pci_ioaddr0 = pci_resource_start_io(dev_tel, 1);
6394 +                       pci_ioaddr1 = pci_resource_start_io(dev_tel, 2);
6395                         found = 1;
6396                 }
6397                 if (found)
6398 Index: linux-2.4.35.4/drivers/isdn/hisax/hfc_2bds0.c
6399 ===================================================================
6400 --- linux-2.4.35.4.orig/drivers/isdn/hisax/hfc_2bds0.c  2007-12-15 05:19:39.930696558 +0100
6401 +++ linux-2.4.35.4/drivers/isdn/hisax/hfc_2bds0.c       2007-12-15 05:19:55.559587200 +0100
6402 @@ -1,4 +1,4 @@
6403 -/* $Id: hfc_2bds0.c,v 1.1.4.1 2001/11/20 14:19:35 kai Exp $
6404 +/* $Id: hfc_2bds0.c,v 1.18 2001/09/24 13:22:56 kai Exp $
6405   *
6406   * specific routines for CCD's HFC 2BDS0
6407   *
6408 @@ -616,6 +616,17 @@
6409  */
6410         if (!cs)
6411                 return;
6412 +#if 0  
6413 +       if (test_and_clear_bit(D_CLEARBUSY, &cs->event)) {
6414 +               if (cs->debug)
6415 +                       debugl1(cs, "D-Channel Busy cleared");
6416 +               stptr = cs->stlist;
6417 +               while (stptr != NULL) {
6418 +                       stptr->l1.l1l2(stptr, PH_PAUSE | CONFIRM, NULL);
6419 +                       stptr = stptr->next;
6420 +               }
6421 +       }
6422 +#endif
6423         if (test_and_clear_bit(D_L1STATECHANGE, &cs->event)) {
6424                 switch (cs->dc.hfcd.ph_state) {
6425                         case (0):
6426 @@ -1090,6 +1101,32 @@
6427                         cs->hw.hfcD.mst_m |= HFCD_MASTER;
6428                         cs->writeisac(cs, HFCD_MST_MODE, cs->hw.hfcD.mst_m);
6429                         break;
6430 +#if 0
6431 +               case (HW_TESTLOOP | REQUEST):
6432 +                       u_char val = 0;
6433 +                       if (1 & (int) arg)
6434 +                               val |= 0x0c;
6435 +                       if (2 & (int) arg)
6436 +                               val |= 0x3;
6437 +                       if (test_bit(HW_IOM1, &cs->HW_Flags)) {
6438 +                               /* IOM 1 Mode */
6439 +                               if (!val) {
6440 +                                       cs->writeisac(cs, ISAC_SPCR, 0xa);
6441 +                                       cs->writeisac(cs, ISAC_ADF1, 0x2);
6442 +                               } else {
6443 +                                       cs->writeisac(cs, ISAC_SPCR, val);
6444 +                                       cs->writeisac(cs, ISAC_ADF1, 0xa);
6445 +                               }
6446 +                       } else {
6447 +                               /* IOM 2 Mode */
6448 +                               cs->writeisac(cs, ISAC_SPCR, val);
6449 +                               if (val)
6450 +                                       cs->writeisac(cs, ISAC_ADF1, 0x8);
6451 +                               else
6452 +                                       cs->writeisac(cs, ISAC_ADF1, 0x0);
6453 +                       }
6454 +                       break;
6455 +#endif
6456                 default:
6457                         if (cs->debug & L1_DEB_WARN)
6458                                 debugl1(cs, "hfcd_l1hw unknown pr %4x", pr);
6459 @@ -1106,6 +1143,20 @@
6460  static void
6461  hfc_dbusy_timer(struct IsdnCardState *cs)
6462  {
6463 +#if 0
6464 +       struct PStack *stptr;
6465 +       if (test_bit(FLG_DBUSY_TIMER, &cs->HW_Flags)) {
6466 +               if (cs->debug)
6467 +                       debugl1(cs, "D-Channel Busy");
6468 +               test_and_set_bit(FLG_L1_DBUSY, &cs->HW_Flags);
6469 +               stptr = cs->stlist;
6470 +               
6471 +               while (stptr != NULL) {
6472 +                       stptr->l1.l1l2(stptr, PH_PAUSE | INDICATION, NULL);
6473 +                       stptr = stptr->next;
6474 +               }
6475 +       }
6476 +#endif
6477  }
6478  
6479  unsigned int __init
6480 Index: linux-2.4.35.4/drivers/isdn/hisax/hfc_2bds0.h
6481 ===================================================================
6482 --- linux-2.4.35.4.orig/drivers/isdn/hisax/hfc_2bds0.h  2007-12-15 05:19:39.938697014 +0100
6483 +++ linux-2.4.35.4/drivers/isdn/hisax/hfc_2bds0.h       2007-12-15 05:19:55.559587200 +0100
6484 @@ -1,4 +1,4 @@
6485 -/* $Id: hfc_2bds0.h,v 1.1.4.1 2001/11/20 14:19:35 kai Exp $
6486 +/* $Id: hfc_2bds0.h,v 1.6 2001/09/24 13:22:56 kai Exp $
6487   *
6488   * specific defines for CCD's HFC 2BDS0
6489   *
6490 Index: linux-2.4.35.4/drivers/isdn/hisax/hfc_2bs0.c
6491 ===================================================================
6492 --- linux-2.4.35.4.orig/drivers/isdn/hisax/hfc_2bs0.c   2007-12-15 05:19:39.946697472 +0100
6493 +++ linux-2.4.35.4/drivers/isdn/hisax/hfc_2bs0.c        2007-12-15 05:19:55.559587200 +0100
6494 @@ -1,4 +1,4 @@
6495 -/* $Id: hfc_2bs0.c,v 1.1.4.1 2001/11/20 14:19:35 kai Exp $
6496 +/* $Id: hfc_2bs0.c,v 1.20 2001/09/24 13:22:56 kai Exp $
6497   *
6498   * specific routines for CCD's HFC 2BS0
6499   *
6500 Index: linux-2.4.35.4/drivers/isdn/hisax/hfc_2bs0.h
6501 ===================================================================
6502 --- linux-2.4.35.4.orig/drivers/isdn/hisax/hfc_2bs0.h   2007-12-15 05:19:39.954697927 +0100
6503 +++ linux-2.4.35.4/drivers/isdn/hisax/hfc_2bs0.h        2007-12-15 05:19:55.563587427 +0100
6504 @@ -1,4 +1,4 @@
6505 -/* $Id: hfc_2bs0.h,v 1.1.4.1 2001/11/20 14:19:35 kai Exp $
6506 +/* $Id: hfc_2bs0.h,v 1.5 2001/09/24 13:22:56 kai Exp $
6507   *
6508   * specific defines for CCD's HFC 2BS0
6509   *
6510 Index: linux-2.4.35.4/drivers/isdn/hisax/hfc_pci.c
6511 ===================================================================
6512 --- linux-2.4.35.4.orig/drivers/isdn/hisax/hfc_pci.c    2007-12-15 05:19:39.958698154 +0100
6513 +++ linux-2.4.35.4/drivers/isdn/hisax/hfc_pci.c 2007-12-15 05:19:55.567587653 +0100
6514 @@ -1,4 +1,4 @@
6515 -/* $Id: hfc_pci.c,v 1.1.4.1 2001/11/20 14:19:35 kai Exp $
6516 +/* $Id: hfc_pci.c,v 1.48 2001/09/24 13:22:56 kai Exp $
6517   *
6518   * low level driver for CCD´s hfc-pci based cards
6519   *
6520 @@ -22,11 +22,12 @@
6521  #include "hfc_pci.h"
6522  #include "isdnl1.h"
6523  #include <linux/pci.h>
6524 +#include <linux/isdn_compat.h>
6525  #include <linux/interrupt.h>
6526  
6527  extern const char *CardType[];
6528  
6529 -static const char *hfcpci_revision = "$Revision: 1.1.4.1 $";
6530 +static const char *hfcpci_revision = "$Revision: 1.48 $";
6531  
6532  /* table entry in the PCI devices list */
6533  typedef struct {
6534 @@ -76,8 +77,6 @@
6535  {
6536         unsigned long flags;
6537  
6538 -       printk(KERN_INFO "HiSax: release hfcpci at %p\n",
6539 -               cs->hw.hfcpci.pci_io);
6540         save_flags(flags);
6541         cli();
6542         cs->hw.hfcpci.int_m2 = 0;       /* interrupt output off ! */
6543 @@ -88,11 +87,13 @@
6544         set_current_state(TASK_UNINTERRUPTIBLE);
6545         schedule_timeout((30 * HZ) / 1000);     /* Timeout 30ms */
6546         Write_hfc(cs, HFCPCI_CIRM, 0);  /* Reset Off */
6547 +#if CONFIG_PCI
6548         pcibios_write_config_word(cs->hw.hfcpci.pci_bus, cs->hw.hfcpci.pci_device_fn, PCI_COMMAND, 0);  /* disable memory mapped ports + busmaster */
6549 +#endif                         /* CONFIG_PCI */
6550         del_timer(&cs->hw.hfcpci.timer);
6551         kfree(cs->hw.hfcpci.share_start);
6552         cs->hw.hfcpci.share_start = NULL;
6553 -       iounmap((void *)cs->hw.hfcpci.pci_io);
6554 +       vfree(cs->hw.hfcpci.pci_io);
6555  }
6556  
6557  /********************************************************************************/
6558 @@ -687,10 +688,6 @@
6559                                 debugl1(cs, "hfcpci_fill_fifo_trans %d frame length %d discarded",
6560                                         bcs->channel, bcs->tx_skb->len);
6561  
6562 -                       if (bcs->st->lli.l1writewakeup &&
6563 -                           (PACKET_NOACK != bcs->tx_skb->pkt_type))
6564 -                               bcs->st->lli.l1writewakeup(bcs->st, bcs->tx_skb->len);
6565 -
6566                         dev_kfree_skb_any(bcs->tx_skb);
6567                         cli();
6568                         bcs->tx_skb = skb_dequeue(&bcs->squeue);        /* fetch next data */
6569 @@ -1146,6 +1143,20 @@
6570  static void
6571  hfcpci_dbusy_timer(struct IsdnCardState *cs)
6572  {
6573 +#if 0
6574 +       struct PStack *stptr;
6575 +       if (test_bit(FLG_DBUSY_TIMER, &cs->HW_Flags)) {
6576 +               if (cs->debug)
6577 +                       debugl1(cs, "D-Channel Busy");
6578 +               test_and_set_bit(FLG_L1_DBUSY, &cs->HW_Flags);
6579 +               stptr = cs->stlist;
6580 +
6581 +               while (stptr != NULL) {
6582 +                       stptr->l1.l1l2(stptr, PH_PAUSE | INDICATION, NULL);
6583 +                       stptr = stptr->next;
6584 +               }
6585 +       }
6586 +#endif
6587  }
6588  
6589  /*************************************/
6590 @@ -1550,6 +1561,17 @@
6591   */
6592         if (!cs)
6593                 return;
6594 +#if 0
6595 +       if (test_and_clear_bit(D_CLEARBUSY, &cs->event)) {
6596 +               if (cs->debug)
6597 +                       debugl1(cs, "D-Channel Busy cleared");
6598 +               stptr = cs->stlist;
6599 +               while (stptr != NULL) {
6600 +                       stptr->l1.l1l2(stptr, PH_PAUSE | CONFIRM, NULL);
6601 +                       stptr = stptr->next;
6602 +               }
6603 +       }
6604 +#endif
6605         if (test_and_clear_bit(D_L1STATECHANGE, &cs->event)) {
6606                 if (!cs->hw.hfcpci.nt_mode)
6607                         switch (cs->dc.hfcpci.ph_state) {
6608 @@ -1712,7 +1734,7 @@
6609                                 if (pci_enable_device(tmp_hfcpci))
6610                                         continue;
6611                                 pci_set_master(tmp_hfcpci);
6612 -                               if ((card->para[0]) && (card->para[0] != (tmp_hfcpci->resource[ 0].start & PCI_BASE_ADDRESS_IO_MASK)))
6613 +                               if ((card->para[0]) && (card->para[0] != (get_pcibase(tmp_hfcpci, 0) & PCI_BASE_ADDRESS_IO_MASK)))
6614                                         continue;
6615                                 else
6616                                         break;
6617 @@ -1729,7 +1751,7 @@
6618                                 printk(KERN_WARNING "HFC-PCI: No IRQ for PCI card found\n");
6619                                 return (0);
6620                         }
6621 -                       cs->hw.hfcpci.pci_io = (char *) dev_hfcpci->resource[ 1].start;
6622 +                       cs->hw.hfcpci.pci_io = (char *) get_pcibase(dev_hfcpci, 1);
6623                         printk(KERN_INFO "HiSax: HFC-PCI card manufacturer: %s card name: %s\n", id_list[i].vendor_name, id_list[i].card_name);
6624                 } else {
6625                         printk(KERN_WARNING "HFC-PCI: No PCI card found\n");
6626 @@ -1746,7 +1768,7 @@
6627                         printk(KERN_WARNING "HFC-PCI: Error allocating memory for FIFO!\n");
6628                         return 0;
6629                 }
6630 -               cs->hw.hfcpci.fifos = (void *)
6631 +               (ulong) cs->hw.hfcpci.fifos =
6632                     (((ulong) cs->hw.hfcpci.share_start) & ~0x7FFF) + 0x8000;
6633                 pcibios_write_config_dword(cs->hw.hfcpci.pci_bus,
6634                                        cs->hw.hfcpci.pci_device_fn, 0x80,
6635 Index: linux-2.4.35.4/drivers/isdn/hisax/hfc_pci.h
6636 ===================================================================
6637 --- linux-2.4.35.4.orig/drivers/isdn/hisax/hfc_pci.h    2007-12-15 05:19:39.966698612 +0100
6638 +++ linux-2.4.35.4/drivers/isdn/hisax/hfc_pci.h 2007-12-15 05:19:55.571587882 +0100
6639 @@ -1,4 +1,4 @@
6640 -/* $Id: hfc_pci.h,v 1.1.4.1 2001/11/20 14:19:35 kai Exp $
6641 +/* $Id: hfc_pci.h,v 1.10 2001/09/24 13:22:56 kai Exp $
6642   *
6643   * specific defines for CCD's HFC 2BDS0 PCI chips
6644   *
6645 Index: linux-2.4.35.4/drivers/isdn/hisax/hfc_sx.c
6646 ===================================================================
6647 --- linux-2.4.35.4.orig/drivers/isdn/hisax/hfc_sx.c     2007-12-15 05:19:39.974699067 +0100
6648 +++ linux-2.4.35.4/drivers/isdn/hisax/hfc_sx.c  2007-12-15 05:19:55.571587882 +0100
6649 @@ -1,4 +1,4 @@
6650 -/* $Id: hfc_sx.c,v 1.1.4.1 2001/11/20 14:19:35 kai Exp $
6651 +/* $Id: hfc_sx.c,v 1.12 2001/09/24 13:22:56 kai Exp $
6652   *
6653   * level driver for CCD´s hfc-s+/sp based cards
6654   *
6655 @@ -17,11 +17,10 @@
6656  #include "hfc_sx.h"
6657  #include "isdnl1.h"
6658  #include <linux/interrupt.h>
6659 -#include <linux/isapnp.h>
6660  
6661  extern const char *CardType[];
6662  
6663 -static const char *hfcsx_revision = "$Revision: 1.1.4.1 $";
6664 +static const char *hfcsx_revision = "$Revision: 1.12 $";
6665  
6666  /***************************************/
6667  /* IRQ-table for CCDs demo board       */
6668 @@ -940,6 +939,20 @@
6669  static void
6670  hfcsx_dbusy_timer(struct IsdnCardState *cs)
6671  {
6672 +#if 0
6673 +       struct PStack *stptr;
6674 +       if (test_bit(FLG_DBUSY_TIMER, &cs->HW_Flags)) {
6675 +               if (cs->debug)
6676 +                       debugl1(cs, "D-Channel Busy");
6677 +               test_and_set_bit(FLG_L1_DBUSY, &cs->HW_Flags);
6678 +               stptr = cs->stlist;
6679 +
6680 +               while (stptr != NULL) {
6681 +                       stptr->l1.l1l2(stptr, PH_PAUSE | INDICATION, NULL);
6682 +                       stptr = stptr->next;
6683 +               }
6684 +       }
6685 +#endif
6686  }
6687  
6688  /*************************************/
6689 @@ -1333,6 +1346,17 @@
6690   */
6691         if (!cs)
6692                 return;
6693 +#if 0
6694 +       if (test_and_clear_bit(D_CLEARBUSY, &cs->event)) {
6695 +               if (cs->debug)
6696 +                       debugl1(cs, "D-Channel Busy cleared");
6697 +               stptr = cs->stlist;
6698 +               while (stptr != NULL) {
6699 +                       stptr->l1.l1l2(stptr, PH_PAUSE | CONFIRM, NULL);
6700 +                       stptr = stptr->next;
6701 +               }
6702 +       }
6703 +#endif
6704         if (test_and_clear_bit(D_L1STATECHANGE, &cs->event)) {
6705                 if (!cs->hw.hfcsx.nt_mode)
6706                         switch (cs->dc.hfcsx.ph_state) {
6707 @@ -1461,17 +1485,7 @@
6708         return (0);
6709  }
6710  
6711 -#ifdef __ISAPNP__
6712 -static struct isapnp_device_id hfc_ids[] __initdata = {
6713 -       { ISAPNP_VENDOR('T', 'A', 'G'), ISAPNP_FUNCTION(0x2620),
6714 -         ISAPNP_VENDOR('T', 'A', 'G'), ISAPNP_FUNCTION(0x2620), 
6715 -         (unsigned long) "Teles 16.3c2" },
6716 -       { 0, }
6717 -};
6718  
6719 -static struct isapnp_device_id *hdev = &hfc_ids[0];
6720 -static struct pci_bus *pnp_c __devinitdata = NULL;
6721 -#endif
6722  
6723  int __devinit
6724  setup_hfcsx(struct IsdnCard *card)
6725 @@ -1482,45 +1496,6 @@
6726  
6727         strcpy(tmp, hfcsx_revision);
6728         printk(KERN_INFO "HiSax: HFC-SX driver Rev. %s\n", HiSax_getrev(tmp));
6729 -#ifdef __ISAPNP__
6730 -       if (!card->para[1] && isapnp_present()) {
6731 -               struct pci_bus *pb;
6732 -               struct pci_dev *pd;
6733 -
6734 -               while(hdev->card_vendor) {
6735 -                       if ((pb = isapnp_find_card(hdev->card_vendor,
6736 -                               hdev->card_device, pnp_c))) {
6737 -                               pnp_c = pb;
6738 -                               pd = NULL;
6739 -                               if ((pd = isapnp_find_dev(pnp_c,
6740 -                                       hdev->vendor, hdev->function, pd))) {
6741 -                                       printk(KERN_INFO "HiSax: %s detected\n",
6742 -                                               (char *)hdev->driver_data);
6743 -                                       pd->prepare(pd);
6744 -                                       pd->deactivate(pd);
6745 -                                       pd->activate(pd);
6746 -                                       card->para[1] = pd->resource[0].start;
6747 -                                       card->para[0] = pd->irq_resource[0].start;
6748 -                                       if (!card->para[0] || !card->para[1]) {
6749 -                                               printk(KERN_ERR "HFC PnP:some resources are missing %ld/%lx\n",
6750 -                                               card->para[0], card->para[1]);
6751 -                                               pd->deactivate(pd);
6752 -                                               return(0);
6753 -                                       }
6754 -                                       break;
6755 -                               } else {
6756 -                                       printk(KERN_ERR "HFC PnP: PnP error card found, no device\n");
6757 -                               }
6758 -                       }
6759 -                       hdev++;
6760 -                       pnp_c=NULL;
6761 -               } 
6762 -               if (!hdev->card_vendor) {
6763 -                       printk(KERN_INFO "HFC PnP: no ISAPnP card found\n");
6764 -                       return(0);
6765 -               }
6766 -       }
6767 -#endif
6768         cs->hw.hfcsx.base = card->para[1] & 0xfffe;
6769         cs->irq = card->para[0];
6770         cs->hw.hfcsx.int_s1 = 0;
6771 @@ -1603,3 +1578,7 @@
6772         cs->auxcmd = &hfcsx_auxcmd;
6773         return (1);
6774  }
6775 +
6776 +
6777 +
6778 +
6779 Index: linux-2.4.35.4/drivers/isdn/hisax/hfc_sx.h
6780 ===================================================================
6781 --- linux-2.4.35.4.orig/drivers/isdn/hisax/hfc_sx.h     2007-12-15 05:19:39.982699522 +0100
6782 +++ linux-2.4.35.4/drivers/isdn/hisax/hfc_sx.h  2007-12-15 05:19:55.571587882 +0100
6783 @@ -1,4 +1,4 @@
6784 -/* $Id: hfc_sx.h,v 1.1.4.1 2001/11/20 14:19:35 kai Exp $
6785 +/* $Id$
6786   *
6787   * specific defines for CCD's HFC 2BDS0 S+,SP chips
6788   *
6789 Index: linux-2.4.35.4/drivers/isdn/hisax/hfc_usb.c
6790 ===================================================================
6791 --- /dev/null   1970-01-01 00:00:00.000000000 +0000
6792 +++ linux-2.4.35.4/drivers/isdn/hisax/hfc_usb.c 2007-12-15 05:19:55.575588111 +0100
6793 @@ -0,0 +1,1189 @@
6794 +/* $Id: hfc_usb.c,v 2.3 2001/07/06 21:30:11 werner Exp $
6795 + *
6796 + *
6797 + *
6798 + * Author       (C) 2001 Werner Cornelius (werner@isdn-development.de)
6799 + *              modular driver for Colognechip HFC-USB chip
6800 + *              as plugin for HiSax isdn driver
6801 + *              type approval valid for HFC-S USB based TAs
6802 + *
6803 + * Copyright 2001  by Werner Cornelius (werner@isdn-development.de)
6804 + *
6805 + * This program is free software; you can redistribute it and/or modify
6806 + * it under the terms of the GNU General Public License as published by
6807 + * the Free Software Foundation; either version 2, or (at your option)
6808 + * any later version.
6809 + *
6810 + * This program is distributed in the hope that it will be useful,
6811 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
6812 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
6813 + * GNU General Public License for more details.
6814 + *
6815 + * You should have received a copy of the GNU General Public License
6816 + * along with this program; if not, write to the Free Software
6817 + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
6818 + *
6819 + */
6820 +
6821 +#include <linux/types.h>
6822 +#include <linux/stddef.h>
6823 +#include <linux/timer.h>
6824 +#include <linux/config.h>
6825 +#include <linux/isdn_compat.h>
6826 +#include <linux/init.h>
6827 +#include "hisax.h"
6828 +#include <linux/module.h>
6829 +#include <linux/kernel_stat.h>
6830 +#include <linux/tqueue.h>
6831 +#include <linux/usb.h>
6832 +#include <linux/kernel.h>
6833 +#include <linux/smp_lock.h>
6834 +#include <linux/sched.h>
6835 +#include "hisax_loadable.h"
6836 +
6837 +#define INCLUDE_INLINE_FUNCS
6838 +
6839 +/***********/
6840 +/* defines */
6841 +/***********/
6842 +#define HFC_CTRL_TIMEOUT 5     /* 5ms timeout writing/reading regs */
6843 +#define HFC_TIMER_T3     7000  /* timeout for l1 activation timer */
6844 +
6845 +#define HFCUSB_L1_STATECHANGE   0      /* L1 state changed */
6846 +#define HFCUSB_L1_DRX           1      /* D-frame received */
6847 +#define HFCUSB_L1_ERX           2      /* E-frame received */
6848 +#define HFCUSB_L1_DTX           4      /* D-frames completed */
6849 +
6850 +#define MAX_BCH_SIZE        2048       /* allowed B-channel packet size */
6851 +
6852 +#define HFCUSB_RX_THRESHOLD 64 /* threshold for fifo report bit rx */
6853 +#define HFCUSB_TX_THRESHOLD 64 /* threshold for fifo report bit tx */
6854 +
6855 +#define HFCUSB_CHIP_ID    0x16 /* Chip ID register index */
6856 +#define HFCUSB_CIRM       0x00 /* cirm register index */
6857 +#define HFCUSB_USB_SIZE   0x07 /* int length register */
6858 +#define HFCUSB_USB_SIZE_I 0x06 /* iso length register */
6859 +#define HFCUSB_F_CROSS    0x0b /* bit order register */
6860 +#define HFCUSB_CLKDEL     0x37 /* bit delay register */
6861 +#define HFCUSB_CON_HDLC   0xfa /* channel connect register */
6862 +#define HFCUSB_HDLC_PAR   0xfb
6863 +#define HFCUSB_SCTRL      0x31 /* S-bus control register (tx) */
6864 +#define HFCUSB_SCTRL_E    0x32 /* same for E and special funcs */
6865 +#define HFCUSB_SCTRL_R    0x33 /* S-bus control register (rx) */
6866 +#define HFCUSB_F_THRES    0x0c /* threshold register */
6867 +#define HFCUSB_FIFO       0x0f /* fifo select register */
6868 +#define HFCUSB_F_USAGE    0x1a /* fifo usage register */
6869 +#define HFCUSB_MST_MODE0  0x14
6870 +#define HFCUSB_MST_MODE1  0x15
6871 +#define HFCUSB_P_DATA     0x1f
6872 +#define HFCUSB_INC_RES_F  0x0e
6873 +#define HFCUSB_STATES     0x30
6874 +
6875 +#define HFCUSB_CHIPID 0x40     /* ID value of HFC-USB */
6876 +
6877 +/******************/
6878 +/* fifo registers */
6879 +/******************/
6880 +#define HFCUSB_NUM_FIFOS   8   /* maximum number of fifos */
6881 +#define HFCUSB_B1_TX       0   /* index for B1 transmit bulk/int */
6882 +#define HFCUSB_B1_RX       1   /* index for B1 receive bulk/int */
6883 +#define HFCUSB_B2_TX       2
6884 +#define HFCUSB_B2_RX       3
6885 +#define HFCUSB_D_TX        4
6886 +#define HFCUSB_D_RX        5
6887 +#define HFCUSB_PCM_TX      6
6888 +#define HFCUSB_PCM_RX      7
6889 +
6890 +/************/
6891 +/* LED mask */
6892 +/************/
6893 +#define LED_DRIVER         0x1
6894 +#define LED_L1             0x2
6895 +#define LED_BCH            0x4
6896 +
6897 +/**********/
6898 +/* macros */
6899 +/**********/
6900 +#define Write_hfc(a,b,c) usb_control_msg((a)->dev,(a)->ctrl_out_pipe,0,0x40,(c),(b),0,0,HFC_CTRL_TIMEOUT)
6901 +#define Read_hfc(a,b,c) usb_control_msg((a)->dev,(a)->ctrl_in_pipe,1,0xC0,0,(b),(c),1,HFC_CTRL_TIMEOUT)
6902 +
6903 +#ifdef COMPAT_HAS_USB_IDTAB
6904 +/****************************************/
6905 +/* data defining the devices to be used */
6906 +/****************************************/
6907 +static __devinitdata const struct usb_device_id hfc_usb_idtab[3] = {
6908 +       {USB_DEVICE(0x959, 0x2bd0)},    /* Colognechip ROM */
6909 +       {USB_DEVICE(0x7b0, 0x0006)},    /* USB TA 128 */
6910 +       {}                      /* end with an all-zeroes entry */
6911 +};
6912 +#endif
6913 +
6914 +/*************************************************/
6915 +/* entry and size of output/input control buffer */
6916 +/*************************************************/
6917 +#define HFC_CTRL_BUFSIZE 32
6918 +typedef struct {
6919 +       __u8 hfc_reg;           /* register number */
6920 +       __u8 reg_val;           /* value to be written (or read) */
6921 +} ctrl_buft;
6922 +
6923 +/***************************************************************/
6924 +/* structure defining input+output fifos (interrupt/bulk mode) */
6925 +/***************************************************************/
6926 +struct hfcusb_data;            /* forward definition */
6927 +typedef struct {
6928 +       int fifonum;            /* fifo index attached to this structure */
6929 +       __u8 fifo_mask;         /* mask for this fifo */
6930 +       int active;             /* fifo is currently active */
6931 +       struct hfcusb_data *hfc;        /* pointer to main structure */
6932 +       int pipe;               /* address of endpoint */
6933 +       __u8 usb_maxlen;        /* maximum length for usb transfer */
6934 +       int max_size;           /* maximum size of receive/send packet */
6935 +       int transmode;          /* transparent mode selected */
6936 +       int framenum;           /* number of frame when last tx completed */
6937 +       int rx_offset;          /* offset inside rx buffer */
6938 +       int next_complete;      /* complete marker */
6939 +       __u8 *act_ptr;          /* pointer to next data */
6940 +       __u8 intervall;         /* interrupt interval */
6941 +       struct sk_buff *buff;   /* actual used buffer */
6942 +       urb_t urb;              /* transfer structure for usb routines */
6943 +       __u8 buffer[128];       /* buffer incoming/outgoing data */
6944 +} usb_fifo;
6945 +
6946 +/*********************************************/
6947 +/* structure holding all data for one device */
6948 +/*********************************************/
6949 +typedef struct hfcusb_data {
6950 +       struct hisax_drvreg regd;       /* register data and callbacks */
6951 +       struct usb_device *dev; /* our device */
6952 +       int if_used;            /* used interface number */
6953 +       int alt_used;           /* used alternate config */
6954 +       int ctrl_paksize;       /* control pipe packet size */
6955 +       int ctrl_in_pipe, ctrl_out_pipe;        /* handles for control pipe */
6956 +
6957 +       /* control pipe background handling */
6958 +       ctrl_buft ctrl_buff[HFC_CTRL_BUFSIZE];  /* buffer holding queued data */
6959 +       volatile int ctrl_in_idx, ctrl_out_idx, ctrl_cnt;       /* input/output pointer + count */
6960 +       urb_t ctrl_urb;         /* transfer structure for control channel */
6961 +       devrequest ctrl_write;  /* buffer for control write request */
6962 +       devrequest ctrl_read;   /* same for read request */
6963 +
6964 +       volatile __u8 dfifo_fill;       /* value read from tx d-fifo */
6965 +       volatile __u8 active_fifos;     /* fifos currently active as bit mask */
6966 +       volatile __u8 threshold_mask;   /* threshold actually reported */
6967 +       volatile __u8 service_request;  /* fifo needs service from task */
6968 +       volatile __u8 ctrl_fifo;        /* last selected fifo */
6969 +       volatile __u8 bch_enables;      /* or mask for sctrl_r and sctrl register values */
6970 +        volatile __u8 led_req;          /* request status of adapters leds */ 
6971 +        volatile __u8 led_act;          /* active status of adapters leds */ 
6972 +       usb_fifo fifos[HFCUSB_NUM_FIFOS];       /* structure holding all fifo data */
6973 +
6974 +       /* layer 1 activation/deactivation handling */
6975 +       volatile __u8 l1_state; /* actual l1 state */
6976 +       volatile ulong l1_event;        /* event mask */
6977 +       struct tq_struct l1_tq; /* l1 bh structure */
6978 +       struct timer_list t3_timer;     /* timer for activation/deactivation */
6979 +       struct timer_list t4_timer;     /* timer for activation/deactivation */
6980 +} hfcusb_data;
6981 +
6982 +#if 0
6983 +static void
6984 +usb_dump_urb(purb_t purb)
6985 +{
6986 +       printk("urb                   :%p\n", purb);
6987 +       printk("next                  :%p\n", purb->next);
6988 +       printk("dev                   :%p\n", purb->dev);
6989 +       printk("pipe                  :%08X\n", purb->pipe);
6990 +       printk("status                :%d\n", purb->status);
6991 +       printk("transfer_flags        :%08X\n", purb->transfer_flags);
6992 +       printk("transfer_buffer       :%p\n", purb->transfer_buffer);
6993 +       printk("transfer_buffer_length:%d\n",
6994 +              purb->transfer_buffer_length);
6995 +       printk("actual_length         :%d\n", purb->actual_length);
6996 +       printk("setup_packet          :%p\n", purb->setup_packet);
6997 +       printk("start_frame           :%d\n", purb->start_frame);
6998 +       printk("number_of_packets     :%d\n", purb->number_of_packets);
6999 +       printk("interval              :%d\n", purb->interval);
7000 +       printk("error_count           :%d\n", purb->error_count);
7001 +       printk("context               :%p\n", purb->context);
7002 +       printk("complete              :%p\n", purb->complete);
7003 +}
7004 +#endif
7005 +
7006 +/*************************************************************************/
7007 +/* bottom half handler for L1 activation/deactiavtaion + D-chan + E-chan */
7008 +/*************************************************************************/
7009 +static void
7010 +usb_l1d_bh(hfcusb_data * hfc)
7011 +{
7012 +
7013 +       while (hfc->l1_event) {
7014 +               if (test_and_clear_bit
7015 +                   (HFCUSB_L1_STATECHANGE, &hfc->l1_event)) {
7016 +                       if (hfc->l1_state == 7)
7017 +                           hfc->led_req |= LED_L1;
7018 +                       else
7019 +                           hfc->led_req &= ~LED_L1;
7020 +                       if ((hfc->l1_state == 7) ||
7021 +                           (hfc->l1_state == 3))
7022 +                           hfc->regd.dch_l1l2(hfc->regd.arg_hisax,
7023 +                                              (hfc->l1_state ==
7024 +                                               7) ? (PH_ACTIVATE |
7025 +                                                     INDICATION)
7026 +                                              : (PH_DEACTIVATE | INDICATION),
7027 +                                              NULL);
7028 +               }
7029 +               if (test_and_clear_bit(HFCUSB_L1_DRX, &hfc->l1_event)) {
7030 +                       hfc->regd.dch_l1l2(hfc->regd.arg_hisax,
7031 +                                          PH_DATA | INDICATION,
7032 +                                          (void *) 0);
7033 +               }
7034 +               if (test_and_clear_bit(HFCUSB_L1_ERX, &hfc->l1_event)) {
7035 +                       hfc->regd.dch_l1l2(hfc->regd.arg_hisax,
7036 +                                          PH_DATA | INDICATION,
7037 +                                          (void *) 1);
7038 +               }
7039 +               if (test_and_clear_bit(HFCUSB_L1_DTX, &hfc->l1_event)) {
7040 +                       hfc->regd.dch_l1l2(hfc->regd.arg_hisax,
7041 +                                          PH_DATA | CONFIRM, NULL);
7042 +               }
7043 +       }                       /* while */
7044 +}                              /* usb_l1d_bh */
7045 +
7046 +/******************************************************/
7047 +/* start next background transfer for control channel */
7048 +/******************************************************/
7049 +static void
7050 +ctrl_start_transfer(hfcusb_data * hfc)
7051 +{
7052 +
7053 +       if (hfc->ctrl_cnt) {
7054 +               switch (hfc->ctrl_buff[hfc->ctrl_out_idx].hfc_reg) {
7055 +                       case HFCUSB_F_USAGE:
7056 +                               hfc->ctrl_urb.pipe = hfc->ctrl_in_pipe;
7057 +                               hfc->ctrl_urb.setup_packet =
7058 +                                   (u_char *) & hfc->ctrl_read;
7059 +                               hfc->ctrl_urb.transfer_buffer_length = 1;
7060 +                               hfc->ctrl_read.index =
7061 +                                   hfc->ctrl_buff[hfc->ctrl_out_idx].
7062 +                                   hfc_reg;
7063 +                               hfc->ctrl_urb.transfer_buffer =
7064 +                                   (char *) &hfc->dfifo_fill;
7065 +                               break;
7066 +
7067 +                       default:        /* write register */
7068 +                               hfc->ctrl_urb.pipe = hfc->ctrl_out_pipe;
7069 +                               hfc->ctrl_urb.setup_packet =
7070 +                                   (u_char *) & hfc->ctrl_write;
7071 +                               hfc->ctrl_urb.transfer_buffer = NULL;
7072 +                               hfc->ctrl_urb.transfer_buffer_length = 0;
7073 +                               hfc->ctrl_write.index =
7074 +                                   hfc->ctrl_buff[hfc->ctrl_out_idx].
7075 +                                   hfc_reg;
7076 +                               hfc->ctrl_write.value =
7077 +                                   hfc->ctrl_buff[hfc->ctrl_out_idx].
7078 +                                   reg_val;
7079 +                               break;
7080 +               }
7081 +               usb_submit_urb(&hfc->ctrl_urb); /* start transfer */
7082 +       }
7083 +}                              /* ctrl_start_transfer */
7084 +
7085 +/************************************/
7086 +/* queue a control transfer request */
7087 +/* return 0 on success.             */
7088 +/************************************/
7089 +static int
7090 +queue_control_request(hfcusb_data * hfc, __u8 reg, __u8 val)
7091 +{
7092 +       ctrl_buft *buf;
7093 +
7094 +       if (hfc->ctrl_cnt >= HFC_CTRL_BUFSIZE)
7095 +               return (1);     /* no space left */
7096 +       buf = hfc->ctrl_buff + hfc->ctrl_in_idx;        /* pointer to new index */
7097 +       buf->hfc_reg = reg;
7098 +       buf->reg_val = val;
7099 +       if (++hfc->ctrl_in_idx >= HFC_CTRL_BUFSIZE)
7100 +               hfc->ctrl_in_idx = 0;   /* pointer wrap */
7101 +       if (++hfc->ctrl_cnt == 1)
7102 +               ctrl_start_transfer(hfc);
7103 +       return (0);
7104 +}                              /* queue_control_request */
7105 +
7106 +/**************************************/
7107 +/* called when timer t3 or t4 expires */
7108 +/**************************************/
7109 +static void
7110 +l1_timer_expire(hfcusb_data * hfc)
7111 +{
7112 +    if (timer_pending(&hfc->t4_timer))
7113 +       del_timer(&hfc->t4_timer);
7114 +    queue_control_request(hfc, HFCUSB_STATES, 0x40);
7115 +    test_and_set_bit(HFCUSB_L1_STATECHANGE,
7116 +                    &hfc->l1_event);
7117 +    queue_task(&hfc->l1_tq, &tq_immediate);
7118 +    mark_bh(IMMEDIATE_BH);
7119 +} /* l1_timer_expire */
7120 +
7121 +/**************************************************/
7122 +/* (re)fills a tx-fifo urb. Queuing is done later */
7123 +/**************************************************/
7124 +static void
7125 +fill_tx_urb(usb_fifo * fifo)
7126 +{
7127 +       struct sk_buff *skb;
7128 +       long flags;
7129 +       int i, ii = 0;
7130 +
7131 +       fifo->urb.dev = fifo->hfc->dev;
7132 +       if ((fifo->buff)
7133 +           && (fifo->urb.transfer_buffer_length < fifo->usb_maxlen)) {
7134 +               switch (fifo->fifonum) {
7135 +                       case HFCUSB_B1_TX:
7136 +                       case HFCUSB_B2_TX:
7137 +                               skb = fifo->buff;
7138 +                               fifo->buff = NULL;
7139 +                               fifo->hfc->regd.bch_l1l2(fifo->hfc->regd.
7140 +                                                        arg_hisax,
7141 +                                                        (fifo->fifonum ==
7142 +                                                         HFCUSB_B1_TX) ? 0
7143 +                                                        : 1,
7144 +                                                        (PH_DATA |
7145 +                                                         CONFIRM),
7146 +                                                        (void *) skb);
7147 +                               fifo->hfc->service_request |=
7148 +                                   fifo->fifo_mask;
7149 +                               return;
7150 +                       case HFCUSB_D_TX:
7151 +                               dev_kfree_skb_any(fifo->buff);
7152 +                               fifo->buff = NULL;
7153 +                               save_flags(flags);
7154 +                               cli();
7155 +                               fifo->hfc->dfifo_fill = 0xff;   /* currently invalid data */
7156 +                               queue_control_request(fifo->hfc,
7157 +                                                     HFCUSB_FIFO,
7158 +                                                     HFCUSB_D_TX);
7159 +                               queue_control_request(fifo->hfc,
7160 +                                                     HFCUSB_F_USAGE, 0);
7161 +                               restore_flags(flags);
7162 +                               return;
7163 +                       default:
7164 +                               return; /* error, invalid fifo */
7165 +               }
7166 +       }
7167 +
7168 +       /* check if new buffer needed */
7169 +       if (!fifo->buff) {
7170 +               switch (fifo->fifonum) {
7171 +                       case HFCUSB_B1_TX:
7172 +                               if (fifo->hfc->regd.bsk[0])
7173 +                                       fifo->buff = *fifo->hfc->regd.bsk[0];   /* B1-channel tx buffer */
7174 +                               break;
7175 +                       case HFCUSB_B2_TX:
7176 +                               if (fifo->hfc->regd.bsk[1])
7177 +                                       fifo->buff = *fifo->hfc->regd.bsk[1];   /* B2-channel tx buffer */
7178 +                               break;
7179 +                       case HFCUSB_D_TX:
7180 +                               if (fifo->hfc->regd.dsq)
7181 +                                       fifo->buff = skb_dequeue(fifo->hfc->regd.dsq);  /* D-channel tx queue */
7182 +                               break;
7183 +                       default:
7184 +                               return; /* error, invalid fifo */
7185 +               }
7186 +               if (!fifo->buff) {
7187 +                       fifo->active = 0;       /* we are inactive now */
7188 +                       fifo->hfc->active_fifos &= ~fifo->fifo_mask;
7189 +                       if (fifo->fifonum == HFCUSB_D_TX) {
7190 +                               test_and_set_bit(HFCUSB_L1_DTX,
7191 +                                                &fifo->hfc->l1_event);
7192 +                               queue_task(&fifo->hfc->l1_tq,
7193 +                                          &tq_immediate);
7194 +                               mark_bh(IMMEDIATE_BH);
7195 +                       }
7196 +                       return;
7197 +               }
7198 +               fifo->act_ptr = fifo->buff->data;       /* start of data */
7199 +               fifo->active = 1;
7200 +               ii = 1;
7201 +               fifo->hfc->active_fifos |= fifo->fifo_mask;
7202 +               fifo->hfc->service_request &= ~fifo->fifo_mask;
7203 +       }
7204 +       /* fillup the send buffer */
7205 +       i = fifo->buff->len - (fifo->act_ptr - fifo->buff->data);       /* remaining length */
7206 +       fifo->buffer[0] = !fifo->transmode;     /* not eof */
7207 +       if (i > (fifo->usb_maxlen - ii)) {
7208 +               i = fifo->usb_maxlen - ii;
7209 +       }
7210 +       if (i)
7211 +               memcpy(fifo->buffer + ii, fifo->act_ptr, i);
7212 +       fifo->urb.transfer_buffer_length = i + ii;
7213 +        fifo->rx_offset = ii;
7214 +}                              /* fill_tx_urb */
7215 +
7216 +/************************************************/
7217 +/* transmit completion routine for all tx fifos */
7218 +/************************************************/
7219 +static void
7220 +tx_complete(purb_t urb)
7221 +{
7222 +       usb_fifo *fifo = (usb_fifo *) urb->context;     /* pointer to our fifo */
7223 +
7224 +       fifo->hfc->service_request &= ~fifo->fifo_mask; /* no further handling */
7225 +       fifo->framenum = usb_get_current_frame_number(fifo->hfc->dev);
7226 +
7227 +       /* check for deactivation or error */
7228 +       if ((!fifo->active) || (urb->status)) {
7229 +               fifo->hfc->active_fifos &= ~fifo->fifo_mask;    /* we are inactive */
7230 +               fifo->active = 0;
7231 +               if ((fifo->buff) && (fifo->fifonum == HFCUSB_D_TX)) {
7232 +                       dev_kfree_skb_any(fifo->buff);
7233 +               }
7234 +               fifo->buff = NULL;
7235 +               return;
7236 +       }
7237 +       fifo->act_ptr += (urb->transfer_buffer_length - fifo->rx_offset);       /* adjust pointer */
7238 +       fill_tx_urb(fifo);      /* refill the urb */
7239 +       fifo->hfc->threshold_mask |= fifo->fifo_mask;   /* assume threshold reached */
7240 +       if (fifo->buff)
7241 +               fifo->hfc->service_request |= fifo->fifo_mask;  /* need to restart */
7242 +}                              /* tx_complete */
7243 +
7244 +/***********************************************/
7245 +/* receive completion routine for all rx fifos */
7246 +/***********************************************/
7247 +static void
7248 +rx_complete(purb_t urb)
7249 +{
7250 +       usb_fifo *fifo = (usb_fifo *) urb->context;     /* pointer to our fifo */
7251 +       hfcusb_data *hfc = fifo->hfc;
7252 +       usb_fifo *txfifo;
7253 +       __u8 last_state;
7254 +       int i, ii, currcnt, hdlci;
7255 +       struct sk_buff *skb;
7256 +
7257 +       urb->dev = hfc->dev; /* security init */
7258 +       if ((!fifo->active) || (urb->status)) {
7259 +               hfc->service_request &= ~fifo->fifo_mask;       /* no further handling */
7260 +               hfc->active_fifos &= ~fifo->fifo_mask;  /* we are inactive */
7261 +               fifo->urb.interval = 0; /* cancel automatic rescheduling */
7262 +               if (fifo->buff) {
7263 +                       dev_kfree_skb_any(fifo->buff);
7264 +                       fifo->buff = NULL;
7265 +               }
7266 +               return;
7267 +       }
7268 +
7269 +       /* first check for any status changes */
7270 +       if ((urb->actual_length < fifo->rx_offset)
7271 +           || (urb->actual_length > fifo->usb_maxlen))
7272 +               return;         /* error condition */
7273 +
7274 +       if (fifo->rx_offset) {
7275 +               hfc->threshold_mask = fifo->buffer[1];  /* update threshold status */
7276 +               fifo->next_complete = fifo->buffer[0] & 1;
7277 +               if ((fifo->fifonum == HFCUSB_D_RX) &&
7278 +                   (hfc->led_req != hfc->led_act))
7279 +                   queue_control_request(hfc, HFCUSB_P_DATA, hfc->led_req);
7280 +
7281 +               /* check if rescheduling needed */
7282 +               if ((i =
7283 +                    hfc->service_request & hfc->active_fifos & ~hfc->
7284 +                    threshold_mask)) {
7285 +                       currcnt =
7286 +                           usb_get_current_frame_number(hfc->dev);
7287 +                       txfifo = hfc->fifos + HFCUSB_B1_TX;
7288 +                       ii = 3;
7289 +                       while (ii--) {
7290 +                               if ((i & txfifo->fifo_mask)
7291 +                                   && (currcnt != txfifo->framenum)) {
7292 +                                       hfc->service_request &=
7293 +                                           ~txfifo->fifo_mask;
7294 +                                       if (!txfifo->buff)
7295 +                                               fill_tx_urb(txfifo);
7296 +                                       if (txfifo->buff)
7297 +                                               usb_submit_urb(&txfifo->
7298 +                                                              urb);
7299 +                               }
7300 +                               txfifo += 2;
7301 +                       }
7302 +               }
7303 +
7304 +               /* handle l1 events */
7305 +               if ((fifo->buffer[0] >> 4) != hfc->l1_state) {
7306 +                       last_state = hfc->l1_state;
7307 +                       hfc->l1_state = fifo->buffer[0] >> 4;   /* update status */
7308 +                       if (timer_pending(&hfc->t4_timer))
7309 +                           del_timer(&hfc->t4_timer);
7310 +                       if (((hfc->l1_state == 3) && 
7311 +                            ((last_state == 7) || 
7312 +                             (last_state == 8))) || 
7313 +                           ((timer_pending(&hfc->t3_timer) &&
7314 +                           (hfc->l1_state == 8)))) {
7315 +                           hfc->t4_timer.expires = jiffies + 2;
7316 +                           add_timer(&hfc->t4_timer);
7317 +                       } else { 
7318 +                               if (timer_pending(&hfc->t3_timer)
7319 +                                   && (hfc->l1_state == 7))
7320 +                                       del_timer(&hfc->t3_timer);      /* no longer needed */
7321 +                               test_and_set_bit(HFCUSB_L1_STATECHANGE,
7322 +                                                &hfc->l1_event);
7323 +                               queue_task(&hfc->l1_tq, &tq_immediate);
7324 +                               mark_bh(IMMEDIATE_BH);
7325 +                       }
7326 +               }
7327 +       }
7328 +
7329 +       /* check the length for data and move if present */
7330 +       if (fifo->next_complete || (urb->actual_length > fifo->rx_offset)) {
7331 +               i = fifo->buff->len + urb->actual_length - fifo->rx_offset;     /* new total length */
7332 +               hdlci = (fifo->transmode) ? 0 : 3;
7333 +               if (i <= (fifo->max_size + hdlci)) {
7334 +                       memcpy(fifo->act_ptr,
7335 +                              fifo->buffer + fifo->rx_offset,
7336 +                              urb->actual_length - fifo->rx_offset);
7337 +                       fifo->act_ptr +=
7338 +                           (urb->actual_length - fifo->rx_offset);
7339 +                       fifo->buff->len +=
7340 +                           (urb->actual_length - fifo->rx_offset);
7341 +               } else
7342 +                       fifo->buff->len = fifo->max_size + 4;   /* mark frame as to long */
7343 +               if (fifo->next_complete && (urb->actual_length < fifo->usb_maxlen)) {
7344 +                   /* the frame is complete */
7345 +                   fifo->next_complete = 0;
7346 +                   if (((!*(fifo->act_ptr - 1)) || fifo->transmode) &&
7347 +                       (fifo->buff->len >= (hdlci + 1))
7348 +                       && (fifo->buff->len <=
7349 +                           (fifo->max_size + hdlci)) &&
7350 +                       ((skb = dev_alloc_skb(fifo->max_size + hdlci)) != NULL)) {
7351 +                       fifo->buff->len -= hdlci;       /* adjust size */
7352 +                       switch (fifo->fifonum) {
7353 +                           case HFCUSB_D_RX:
7354 +                               skb_queue_tail(hfc->regd.
7355 +                                              drq,
7356 +                                              fifo->buff);
7357 +                               test_and_set_bit
7358 +                                   (HFCUSB_L1_DRX,
7359 +                                    &hfc->l1_event);
7360 +                               queue_task(&hfc->l1_tq,
7361 +                                          &tq_immediate);
7362 +                               mark_bh(IMMEDIATE_BH);
7363 +                               break;
7364 +
7365 +                           case HFCUSB_B1_RX:
7366 +                               if (hfc->regd.brq[0]) {
7367 +                                   skb_queue_tail
7368 +                                       (hfc->regd.
7369 +                                        brq[0],
7370 +                                        fifo->buff);
7371 +                                   hfc->regd.
7372 +                                       bch_l1l2(hfc->
7373 +                                                regd.
7374 +                                                arg_hisax,
7375 +                                                0,
7376 +                                                PH_DATA
7377 +                                                |
7378 +                                                INDICATION,
7379 +                                                (void *)
7380 +                                                fifo->
7381 +                                                buff);
7382 +                               } else
7383 +                                   dev_kfree_skb_any
7384 +                                       (fifo->buff);
7385 +                               break;
7386 +                               
7387 +                           case HFCUSB_B2_RX:
7388 +                               if (hfc->regd.brq[1]) {
7389 +                                   skb_queue_tail
7390 +                                       (hfc->regd.
7391 +                                        brq[1],
7392 +                                        fifo->buff);
7393 +                                   hfc->regd.
7394 +                                       bch_l1l2(hfc->
7395 +                                                regd.
7396 +                                                arg_hisax,
7397 +                                                1,
7398 +                                                PH_DATA
7399 +                                                |
7400 +                                                INDICATION,
7401 +                                                (void
7402 +                                                 *)
7403 +                                                fifo->
7404 +                                                buff);
7405 +                               } else
7406 +                                   dev_kfree_skb_any
7407 +                                       (fifo->buff);
7408 +                               break;
7409 +
7410 +                           case HFCUSB_PCM_RX:
7411 +                               skb_queue_tail(&hfc->regd.
7412 +                                              erq,
7413 +                                              fifo->buff);
7414 +                               test_and_set_bit
7415 +                                   (HFCUSB_L1_ERX,
7416 +                                    &hfc->l1_event);
7417 +                               queue_task(&hfc->l1_tq,
7418 +                                          &tq_immediate);
7419 +                               mark_bh(IMMEDIATE_BH);
7420 +                               break;
7421 +
7422 +                           default:
7423 +                               dev_kfree_skb_any(fifo->
7424 +                                                 buff);
7425 +                               break;
7426 +                       }
7427 +                       fifo->buff = skb;
7428 +                   } 
7429 +                   fifo->buff->len = 0;        /* reset counter */
7430 +                   fifo->act_ptr = fifo->buff->data;   /* and pointer */
7431 +               }
7432 +       }
7433 +       fifo->rx_offset = (urb->actual_length < fifo->usb_maxlen) ? 2 : 0;
7434 +}                              /* rx_complete */
7435 +
7436 +/***************************************************/
7437 +/* start the interrupt transfer for the given fifo */
7438 +/***************************************************/
7439 +static void
7440 +start_rx_fifo(usb_fifo * fifo)
7441 +{
7442 +       if (fifo->buff)
7443 +               return;         /* still active */
7444 +       if (!
7445 +           (fifo->buff =
7446 +            dev_alloc_skb(fifo->max_size + (fifo->transmode ? 0 : 3))))
7447 +               return;
7448 +       fifo->act_ptr = fifo->buff->data;
7449 +       FILL_INT_URB(&fifo->urb, fifo->hfc->dev, fifo->pipe, fifo->buffer,
7450 +                    fifo->usb_maxlen, rx_complete, fifo, fifo->intervall);
7451 +       fifo->next_complete = 0;
7452 +       fifo->rx_offset = 2;
7453 +       fifo->active = 1;       /* must be marked active */
7454 +       fifo->hfc->active_fifos |= fifo->fifo_mask;
7455 +       if (usb_submit_urb(&fifo->urb)) {
7456 +               fifo->active = 0;
7457 +               fifo->hfc->active_fifos &= ~fifo->fifo_mask;
7458 +               dev_kfree_skb_any(fifo->buff);
7459 +               fifo->buff = NULL;
7460 +       }
7461 +}                              /* start_rx_fifo */
7462 +
7463 +/***************************************************************/
7464 +/* control completion routine handling background control cmds */
7465 +/***************************************************************/
7466 +static void
7467 +ctrl_complete(purb_t urb)
7468 +{
7469 +       hfcusb_data *hfc = (hfcusb_data *) urb->context;
7470 +
7471 +       urb->dev = hfc->dev;
7472 +       if (hfc->ctrl_cnt) {
7473 +               switch (hfc->ctrl_buff[hfc->ctrl_out_idx].hfc_reg) {
7474 +                       case HFCUSB_FIFO:
7475 +                               hfc->ctrl_fifo =
7476 +                                   hfc->ctrl_buff[hfc->ctrl_out_idx].
7477 +                                   reg_val;
7478 +                               break;
7479 +                       case HFCUSB_F_USAGE:
7480 +                               if (!hfc->dfifo_fill) {
7481 +                                       fill_tx_urb(hfc->fifos +
7482 +                                                   HFCUSB_D_TX);
7483 +                                       if (hfc->fifos[HFCUSB_D_TX].buff)
7484 +                                               usb_submit_urb(&hfc->
7485 +                                                              fifos
7486 +                                                              [HFCUSB_D_TX].
7487 +                                                              urb);
7488 +                               } else {
7489 +                                       queue_control_request(hfc,
7490 +                                                             HFCUSB_FIFO,
7491 +                                                             HFCUSB_D_TX);
7492 +                                       queue_control_request(hfc,
7493 +                                                             HFCUSB_F_USAGE,
7494 +                                                             0);
7495 +                               }
7496 +                               break;
7497 +                       case HFCUSB_SCTRL_R:
7498 +                               switch (hfc->ctrl_fifo) {
7499 +                                       case HFCUSB_B1_RX:
7500 +                                               if (hfc->bch_enables & 1)
7501 +                                                       start_rx_fifo(hfc->
7502 +                                                                     fifos
7503 +                                                                     +
7504 +                                                                     HFCUSB_B1_RX);
7505 +                                               break;
7506 +                                       case HFCUSB_B2_RX:
7507 +                                               if (hfc->bch_enables & 2)
7508 +                                                       start_rx_fifo(hfc->
7509 +                                                                     fifos
7510 +                                                                     +
7511 +                                                                     HFCUSB_B2_RX);
7512 +                                               break;
7513 +                               }
7514 +                               if (hfc->bch_enables & 3)
7515 +                                   hfc->led_req |= LED_BCH;
7516 +                               else
7517 +                                   hfc->led_req &= ~LED_BCH;
7518 +                               break;
7519 +                       case HFCUSB_P_DATA:
7520 +                               hfc->led_act =
7521 +                                   hfc->ctrl_buff[hfc->ctrl_out_idx].
7522 +                                   reg_val;
7523 +                               break;
7524 +               }
7525 +               hfc->ctrl_cnt--;        /* decrement actual count */
7526 +               if (++hfc->ctrl_out_idx >= HFC_CTRL_BUFSIZE)
7527 +                       hfc->ctrl_out_idx = 0;  /* pointer wrap */
7528 +               ctrl_start_transfer(hfc);       /* start next transfer */
7529 +       }
7530 +}                              /* ctrl_complete */
7531 +
7532 +/*****************************************/
7533 +/* Layer 1 + D channel access from HiSax */
7534 +/*****************************************/
7535 +static void
7536 +hfcusb_l1_access(void *drvarg, int pr, void *arg)
7537 +{
7538 +       hfcusb_data *hfc = (hfcusb_data *) drvarg;
7539 +
7540 +       switch (pr) {
7541 +               case (PH_DATA | REQUEST):
7542 +               case (PH_PULL | INDICATION):
7543 +                       skb_queue_tail(hfc->regd.dsq,
7544 +                                      (struct sk_buff *) arg);
7545 +                       if (!hfc->fifos[HFCUSB_D_TX].active
7546 +                           && !hfc->dfifo_fill) {
7547 +                               fill_tx_urb(hfc->fifos + HFCUSB_D_TX);
7548 +                               hfc->active_fifos |=
7549 +                                   hfc->fifos[HFCUSB_D_TX].fifo_mask;
7550 +                               usb_submit_urb(&hfc->fifos[HFCUSB_D_TX].
7551 +                                              urb);
7552 +                       }
7553 +                       break;
7554 +               case (PH_ACTIVATE | REQUEST):
7555 +                   switch (hfc->l1_state) {
7556 +                       case 6:
7557 +                       case 8:
7558 +                               hfc->regd.dch_l1l2(hfc->regd.arg_hisax,
7559 +                                                  (PH_DEACTIVATE |
7560 +                                                  INDICATION), NULL);
7561 +
7562 +                               break;
7563 +                       case 7:
7564 +                               hfc->regd.dch_l1l2(hfc->regd.arg_hisax,
7565 +                                                  (PH_ACTIVATE |
7566 +                                                  INDICATION), NULL);
7567 +
7568 +                               break;
7569 +                       default:
7570 +                               queue_control_request(hfc, HFCUSB_STATES, 0x60);        /* start activation */
7571 +                               hfc->t3_timer.expires =
7572 +                                   jiffies + (HFC_TIMER_T3 * HZ) / 1000;
7573 +                               if (!timer_pending(&hfc->t3_timer))
7574 +                                       add_timer(&hfc->t3_timer);
7575 +                               break;
7576 +                   }
7577 +                   break;
7578 +
7579 +               case (PH_DEACTIVATE | REQUEST):
7580 +                       queue_control_request(hfc, HFCUSB_STATES, 0x40);        /* start deactivation */
7581 +                       break;
7582 +               default:
7583 +                       printk(KERN_INFO "unknown hfcusb l1_access 0x%x\n",
7584 +                              pr);
7585 +                       break;
7586 +       }
7587 +}                              /* hfcusb_l1_access */
7588 +
7589 +/*******************************/
7590 +/* B channel access from HiSax */
7591 +/*******************************/
7592 +static void
7593 +hfcusb_bch_access(void *drvarg, int chan, int pr, void *arg)
7594 +{
7595 +       hfcusb_data *hfc = (hfcusb_data *) drvarg;
7596 +       usb_fifo *fifo = hfc->fifos + (chan ? HFCUSB_B2_TX : HFCUSB_B1_TX);
7597 +       long flags;
7598 +
7599 +       switch (pr) {
7600 +               case (PH_DATA | REQUEST):
7601 +               case (PH_PULL | INDICATION):
7602 +                       save_flags(flags);
7603 +                       cli();
7604 +                       if (!fifo->active) {
7605 +                               fill_tx_urb(fifo);
7606 +                               hfc->active_fifos |= fifo->fifo_mask;
7607 +                               usb_submit_urb(&fifo->urb);
7608 +                       }
7609 +                       restore_flags(flags);
7610 +                       break;
7611 +               case (PH_ACTIVATE | REQUEST):
7612 +                       if (!((int) arg)) {
7613 +                               hfc->bch_enables &= ~(1 << chan);
7614 +                               if (fifo->active) {
7615 +                                       fifo->active = 0;
7616 +                                       usb_unlink_urb(&fifo->urb);
7617 +                               }
7618 +                               save_flags(flags);
7619 +                               cli();
7620 +                               queue_control_request(hfc, HFCUSB_FIFO,
7621 +                                                     fifo->fifonum);
7622 +                               queue_control_request(hfc,
7623 +                                                     HFCUSB_INC_RES_F, 2);
7624 +                               queue_control_request(hfc, HFCUSB_CON_HDLC,
7625 +                                                     9);
7626 +                               queue_control_request(hfc, HFCUSB_SCTRL,
7627 +                                                     0x40 +
7628 +                                                     hfc->bch_enables);
7629 +                               queue_control_request(hfc, HFCUSB_SCTRL_R,
7630 +                                                     hfc->bch_enables);
7631 +                               restore_flags(flags);
7632 +                               fifo++;
7633 +                               if (fifo->active) {
7634 +                                       fifo->active = 0;
7635 +                                       usb_unlink_urb(&fifo->urb);
7636 +                               }
7637 +                               return; /* fifo deactivated */
7638 +                       }
7639 +                       fifo->transmode = ((int) arg == L1_MODE_TRANS);
7640 +                       fifo->max_size =
7641 +                           ((fifo->transmode) ? fifo->
7642 +                            usb_maxlen : MAX_BCH_SIZE);
7643 +                       (fifo + 1)->transmode = fifo->transmode;
7644 +                       (fifo + 1)->max_size = fifo->max_size;
7645 +                       hfc->bch_enables |= (1 << chan);
7646 +                       save_flags(flags);
7647 +                       cli();
7648 +                       queue_control_request(hfc, HFCUSB_FIFO,
7649 +                                             fifo->fifonum);
7650 +                       queue_control_request(hfc, HFCUSB_CON_HDLC,
7651 +                                             ((!fifo->
7652 +                                               transmode) ? 9 : 11));
7653 +                       queue_control_request(hfc, HFCUSB_INC_RES_F, 2);
7654 +                       queue_control_request(hfc, HFCUSB_SCTRL,
7655 +                                             0x40 + hfc->bch_enables);
7656 +                       if ((int) arg == L1_MODE_HDLC)
7657 +                               queue_control_request(hfc, HFCUSB_CON_HDLC,
7658 +                                                     8);
7659 +                       queue_control_request(hfc, HFCUSB_FIFO,
7660 +                                             fifo->fifonum + 1);
7661 +                       queue_control_request(hfc, HFCUSB_CON_HDLC,
7662 +                                             ((!fifo->
7663 +                                               transmode) ? 8 : 10));
7664 +                       queue_control_request(hfc, HFCUSB_INC_RES_F, 2);
7665 +                       queue_control_request(hfc, HFCUSB_SCTRL_R,
7666 +                                             hfc->bch_enables);
7667 +                       restore_flags(flags);
7668 +
7669 +                       break;
7670 +
7671 +               default:
7672 +                       printk(KERN_INFO
7673 +                              "unknown hfcusb bch_access chan %d 0x%x\n",
7674 +                              chan, pr);
7675 +                       break;
7676 +       }
7677 +}                              /* hfcusb_bch_access */
7678 +
7679 +/***************************************************************************/
7680 +/* usb_init is called once when a new matching device is detected to setup */
7681 +/* main parmeters. It registers the driver at the main hisax module.       */
7682 +/* on success 0 is returned.                                               */
7683 +/***************************************************************************/
7684 +static int
7685 +usb_init(hfcusb_data * hfc)
7686 +{
7687 +       usb_fifo *fifo;
7688 +       int i;
7689 +       u_char b;
7690 +
7691 +       /* check the chip id */
7692 +       if ((Read_hfc(hfc, HFCUSB_CHIP_ID, &b) != 1) ||
7693 +           (b != HFCUSB_CHIPID)) {
7694 +               printk(KERN_INFO "HFC-USB: Invalid chip id 0x%02x\n", b);
7695 +               return (1);
7696 +       }
7697 +
7698 +       /* first set the needed config, interface and alternate */
7699 +       usb_set_configuration(hfc->dev, 1);
7700 +       usb_set_interface(hfc->dev, hfc->if_used, hfc->alt_used);
7701 +
7702 +        /* init the led state request */
7703 +       hfc->led_req = LED_DRIVER;
7704 +
7705 +       /* now we initialise the chip */
7706 +       Write_hfc(hfc, HFCUSB_CIRM, 0x10);      /* aux = output, reset off */
7707 +       Write_hfc(hfc, HFCUSB_P_DATA, 0);       /* leds = off */
7708 +       Write_hfc(hfc, HFCUSB_USB_SIZE,
7709 +                 (hfc->fifos[HFCUSB_B1_TX].usb_maxlen >> 3) |
7710 +                 ((hfc->fifos[HFCUSB_B1_RX].usb_maxlen >> 3) << 4));
7711 +
7712 +       /* enable PCM/GCI master mode */
7713 +       Write_hfc(hfc, HFCUSB_MST_MODE1, 0);    /* set default values */
7714 +       Write_hfc(hfc, HFCUSB_MST_MODE0, 1);    /* enable master mode */
7715 +
7716 +       /* init the fifos */
7717 +       Write_hfc(hfc, HFCUSB_F_THRES, (HFCUSB_TX_THRESHOLD >> 3) |
7718 +                 ((HFCUSB_RX_THRESHOLD >> 3) << 4));
7719 +
7720 +       for (i = 0, fifo = hfc->fifos + i; i < HFCUSB_NUM_FIFOS;
7721 +            i++, fifo++) {
7722 +               Write_hfc(hfc, HFCUSB_FIFO, i); /* select the desired fifo */
7723 +
7724 +               fifo->transmode = 0;    /* hdlc mode selected */
7725 +               fifo->buff = NULL;      /* init buffer pointer */
7726 +               fifo->max_size =
7727 +                   (i <= HFCUSB_B2_RX) ? MAX_BCH_SIZE : MAX_DFRAME_LEN;
7728 +               Write_hfc(hfc, HFCUSB_HDLC_PAR, ((i <= HFCUSB_B2_RX) ? 0 : 2)); /* data length */
7729 +               Write_hfc(hfc, HFCUSB_CON_HDLC, ((i & 1) ? 0x08 : 0x09));       /* rx hdlc, tx fill 1 */
7730 +               Write_hfc(hfc, HFCUSB_INC_RES_F, 2);    /* reset the fifo */
7731 +       }
7732 +
7733 +       Write_hfc(hfc, HFCUSB_CLKDEL, 0x0f);    /* clock delay value */
7734 +       Write_hfc(hfc, HFCUSB_STATES, 3 | 0x10);        /* set deactivated mode */
7735 +       Write_hfc(hfc, HFCUSB_STATES, 3);       /* enable state machine */
7736 +
7737 +       Write_hfc(hfc, HFCUSB_SCTRL_R, 0);      /* disable both B receivers */
7738 +       Write_hfc(hfc, HFCUSB_SCTRL, 0x40);     /* disable B transmitters + cap mode */
7739 +
7740 +       /* init the l1 timer */
7741 +       init_timer(&hfc->t3_timer);
7742 +       hfc->t3_timer.data = (long) hfc;
7743 +       hfc->t3_timer.function = (void *) l1_timer_expire;
7744 +       hfc->t4_timer.data = (long) hfc;
7745 +       hfc->t4_timer.function = (void *) l1_timer_expire;
7746 +       hfc->l1_tq.routine = (void *) (void *) usb_l1d_bh;
7747 +       hfc->l1_tq.sync = 0;
7748 +       hfc->l1_tq.data = hfc;
7749 +
7750 +       /* init the background control machinery */
7751 +       hfc->ctrl_read.requesttype = 0xc0;
7752 +       hfc->ctrl_read.request = 1;
7753 +       hfc->ctrl_read.length = 1;
7754 +       hfc->ctrl_write.requesttype = 0x40;
7755 +       hfc->ctrl_write.request = 0;
7756 +       hfc->ctrl_write.length = 0;
7757 +       FILL_CONTROL_URB(&hfc->ctrl_urb, hfc->dev, hfc->ctrl_out_pipe,
7758 +                        (u_char *) & hfc->ctrl_write, NULL, 0,
7759 +                        ctrl_complete, hfc);
7760 +
7761 +       /* init the TX-urbs */
7762 +       fifo = hfc->fifos + HFCUSB_D_TX;
7763 +       FILL_BULK_URB(&fifo->urb, hfc->dev, fifo->pipe,
7764 +                     (u_char *) fifo->buffer, 0, tx_complete, fifo);
7765 +       fifo = hfc->fifos + HFCUSB_B1_TX;
7766 +       FILL_BULK_URB(&fifo->urb, hfc->dev, fifo->pipe,
7767 +                     (u_char *) fifo->buffer, 0, tx_complete, fifo);
7768 +       fifo = hfc->fifos + HFCUSB_B2_TX;
7769 +       FILL_BULK_URB(&fifo->urb, hfc->dev, fifo->pipe,
7770 +                     (u_char *) fifo->buffer, 0, tx_complete, fifo);
7771 +
7772 +       /* init the E-buffer */
7773 +       skb_queue_head_init(&hfc->regd.erq);
7774 +
7775 +       /* now register ourself at hisax */
7776 +       hfc->regd.version = HISAX_LOAD_VERSION; /* set our version */
7777 +       hfc->regd.cmd = HISAX_LOAD_REGISTER;    /* register command */
7778 +       hfc->regd.argl1 = (void *) hfc; /* argument for our local routine */
7779 +       hfc->regd.dch_l2l1 = hfcusb_l1_access;
7780 +       hfc->regd.bch_l2l1 = hfcusb_bch_access;
7781 +       hfc->regd.drvname = "hfc_usb";
7782 +       if (hisax_register_hfcusb(&hfc->regd)) {
7783 +               printk(KERN_INFO "HFC-USB failed to register at hisax\n");
7784 +               Write_hfc(hfc, HFCUSB_CIRM, 0x08);      /* aux = input, reset on */
7785 +               return (1);
7786 +       }
7787 +
7788 +       /* startup the D- and E-channel fifos */
7789 +       start_rx_fifo(hfc->fifos + HFCUSB_D_RX);        /* D-fifo */
7790 +       if (hfc->fifos[HFCUSB_PCM_RX].pipe)
7791 +               start_rx_fifo(hfc->fifos + HFCUSB_PCM_RX);      /* E-fifo */
7792 +
7793 +       return (0);
7794 +}                              /* usb_init */
7795 +
7796 +/*************************************************/
7797 +/* function called to probe a new plugged device */
7798 +/*************************************************/
7799 +static void *
7800 +hfc_usb_probe(struct usb_device *dev, unsigned int interface
7801 +#ifdef COMPAT_HAS_USB_IDTAB
7802 +             , const struct usb_device_id *id_table)
7803 +#else
7804 +    )
7805 +#endif
7806 +{
7807 +       hfcusb_data *context;
7808 +       struct usb_interface *ifp = dev->actconfig->interface + interface;
7809 +       struct usb_interface_descriptor *ifdp =
7810 +           ifp->altsetting + ifp->act_altsetting;
7811 +       struct usb_endpoint_descriptor *epd;
7812 +       int i, idx, ep_msk;
7813 +
7814 +#ifdef COMPAT_HAS_USB_IDTAB
7815 +       if (id_table && (dev->descriptor.idVendor == id_table->idVendor) &&
7816 +           (dev->descriptor.idProduct == id_table->idProduct) &&
7817 +#else
7818 +       if ((((dev->descriptor.idVendor == 0x959) &&
7819 +           (dev->descriptor.idProduct == 0x2bd0)) ||
7820 +           ((dev->descriptor.idVendor == 0x7b0) &&
7821 +           (dev->descriptor.idProduct == 0x0006))) &&
7822 +#endif
7823 +           (ifdp->bNumEndpoints >= 6) && (ifdp->bNumEndpoints <= 16)) {
7824 +               if (!(context = kmalloc(sizeof(hfcusb_data), GFP_KERNEL))) {
7825 +                       return (NULL);  /* got no mem */
7826 +               };
7827 +               memset(context, 0, sizeof(hfcusb_data));        /* clear the structure */
7828 +               i = ifdp->bNumEndpoints;        /* get number of endpoints */
7829 +               ep_msk = 0;     /* none found */
7830 +               epd = ifdp->endpoint;   /* first endpoint descriptor */
7831 +               while (i-- && ((ep_msk & 0xcf) != 0xcf)) {
7832 +
7833 +                       idx = (((epd->bEndpointAddress & 0x7f) - 1) << 1);      /* get endpoint base */
7834 +                       if (idx < 7) {
7835 +                               switch (epd->bmAttributes) {
7836 +                                       case USB_ENDPOINT_XFER_INT:
7837 +                                               if (!
7838 +                                                   (epd->
7839 +                                                    bEndpointAddress &
7840 +                                                    0x80))
7841 +                                                       break;  /* only interrupt in allowed */
7842 +                                               idx++;  /* input index is odd */
7843 +                                               context->fifos[idx].pipe =
7844 +                                                   usb_rcvintpipe(dev,
7845 +                                                                  epd->
7846 +                                                                  bEndpointAddress);
7847 +                                               break;
7848 +
7849 +                                       case USB_ENDPOINT_XFER_BULK:
7850 +                                               if (epd->
7851 +                                                   bEndpointAddress &
7852 +                                                   0x80)
7853 +                                                       break;  /* only bulk out allowed */
7854 +                                               context->fifos[idx].pipe =
7855 +                                                   usb_sndbulkpipe(dev,
7856 +                                                                   epd->
7857 +                                                                   bEndpointAddress);
7858 +                                               break;
7859 +                                       default:
7860 +                                               context->fifos[idx].pipe = 0;   /* reset data */
7861 +                               }       /* switch attribute */
7862 +
7863 +                               if (context->fifos[idx].pipe) {
7864 +                                       context->fifos[idx].fifonum = idx;
7865 +                                       context->fifos[idx].fifo_mask =
7866 +                                           1 << idx;
7867 +                                       context->fifos[idx].hfc = context;
7868 +                                       context->fifos[idx].usb_maxlen =
7869 +                                           epd->wMaxPacketSize;
7870 +                                       context->fifos[idx].intervall =
7871 +                                           epd->bInterval;
7872 +                                       ep_msk |= (1 << idx);
7873 +                               } else
7874 +                                       ep_msk &= ~(1 << idx);
7875 +                       }       /* idx < 7 */
7876 +                       epd++;
7877 +               }
7878 +
7879 +               if ((ep_msk & 0x3f) != 0x3f) {
7880 +                       kfree(context);
7881 +                       return (NULL);
7882 +               }
7883 +               MOD_INC_USE_COUNT;      /* lock our module */
7884 +               context->dev = dev;     /* save device */
7885 +               context->if_used = interface;   /* save used interface */
7886 +               context->alt_used = ifp->act_altsetting;        /* and alternate config */
7887 +               context->ctrl_paksize = dev->descriptor.bMaxPacketSize0;        /* control size */
7888 +
7889 +               /* create the control pipes needed for register access */
7890 +               context->ctrl_in_pipe = usb_rcvctrlpipe(context->dev, 0);
7891 +               context->ctrl_out_pipe = usb_sndctrlpipe(context->dev, 0);
7892 +
7893 +               /* init the chip and register the driver */
7894 +               if (usb_init(context)) {
7895 +                       kfree(context);
7896 +                       MOD_DEC_USE_COUNT;
7897 +                       return (NULL);
7898 +               }
7899 +
7900 +               printk(KERN_INFO
7901 +                      "HFC-USB: New device if=%d alt=%d registered\n",
7902 +                      context->if_used, context->alt_used);
7903 +               return (context);
7904 +       }
7905 +
7906 +       return (NULL);          /* no matching entry */
7907 +}                              /* hfc_usb_probe */
7908 +
7909 +/****************************************************/
7910 +/* function called when an active device is removed */
7911 +/****************************************************/
7912 +static void
7913 +hfc_usb_disconnect(struct usb_device *usbdev, void *drv_context)
7914 +{
7915 +       hfcusb_data *context = drv_context;
7916 +       int i;
7917 +       struct sk_buff *skb;
7918 +
7919 +       /* tell all fifos to terminate */
7920 +       for (i = 0; i < HFCUSB_NUM_FIFOS; i++)
7921 +               if (context->fifos[i].active) {
7922 +                       context->fifos[i].active = 0;
7923 +                       usb_unlink_urb(&context->fifos[i].urb);
7924 +               }
7925 +       while (context->active_fifos) {
7926 +               set_current_state(TASK_INTERRUPTIBLE);
7927 +               /* Timeout 10ms */
7928 +               schedule_timeout((10 * HZ) / 1000);
7929 +       }
7930 +       if (timer_pending(&context->t3_timer))
7931 +               del_timer(&context->t3_timer);
7932 +       context->regd.release_driver(context->regd.arg_hisax);
7933 +       while ((skb = skb_dequeue(&context->regd.erq)) != NULL)
7934 +               dev_kfree_skb_any(skb);
7935 +
7936 +       kfree(context);         /* free our structure again */
7937 +       MOD_DEC_USE_COUNT;      /* and decrement the usage counter */
7938 +}                              /* hfc_usb_disconnect */
7939 +
7940 +/************************************/
7941 +/* our driver information structure */
7942 +/************************************/
7943 +static struct usb_driver hfc_drv = {
7944 +       name:"hfc_usb",
7945 +#ifdef COMPAT_HAS_USB_IDTAB
7946 +       id_table:hfc_usb_idtab,
7947 +#endif
7948 +       probe:hfc_usb_probe,
7949 +       disconnect:hfc_usb_disconnect,
7950 +};
7951 +
7952 +static void __exit
7953 +hfc_usb_exit(void)
7954 +{
7955 +
7956 +       usb_deregister(&hfc_drv);       /* release our driver */
7957 +       printk(KERN_INFO "HFC-USB module removed\n");
7958 +}
7959 +
7960 +static int __init
7961 +hfc_usb_init(void)
7962 +{
7963 +       struct hisax_drvreg drv;
7964 +
7965 +       drv.version = HISAX_LOAD_VERSION;       /* set our version */
7966 +       drv.cmd = HISAX_LOAD_CHKVER;    /* check command only */
7967 +       if (hisax_register_hfcusb(&drv)) {
7968 +               printk(KERN_INFO "HFC-USB <-> hisax version conflict\n");
7969 +               return (-1);    /* unable to register */
7970 +       }
7971 +       if (usb_register(&hfc_drv)) {
7972 +               printk(KERN_INFO
7973 +                      "Unable to register HFC-USB module at usb stack\n");
7974 +               return (-1);    /* unable to register */
7975 +       }
7976 +
7977 +       printk(KERN_INFO "HFC-USB module loaded\n");
7978 +       return (0);
7979 +}
7980 +
7981 +module_init(hfc_usb_init);
7982 +module_exit(hfc_usb_exit);
7983 Index: linux-2.4.35.4/drivers/isdn/hisax/hfc_usbr.c
7984 ===================================================================
7985 --- /dev/null   1970-01-01 00:00:00.000000000 +0000
7986 +++ linux-2.4.35.4/drivers/isdn/hisax/hfc_usbr.c        2007-12-15 05:19:55.575588111 +0100
7987 @@ -0,0 +1,471 @@
7988 +/* $Id: hfc_usbr.c,v 2.5 2001/07/06 21:30:11 werner Exp $
7989 +
7990 + * hfc_usb.c  low level driver for CCD´s hfc-usb single chip controllers
7991 + *            type approval valid for HFC-S USB based TAs
7992 + *
7993 + * Author     Werner Cornelius (werner@isdn-development.de)
7994 + *
7995 + * Copyright 2001  by Werner Cornelius (werner@isdn4linux.de)
7996 + *
7997 + * This program is free software; you can redistribute it and/or modify
7998 + * it under the terms of the GNU General Public License as published by
7999 + * the Free Software Foundation; either version 2, or (at your option)
8000 + * any later version.
8001 + *
8002 + * This program is distributed in the hope that it will be useful,
8003 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
8004 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
8005 + * GNU General Public License for more details.
8006 + *
8007 + * You should have received a copy of the GNU General Public License
8008 + * along with this program; if not, write to the Free Software
8009 + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
8010 + *
8011 + */
8012 +
8013 +#define __NO_VERSION__
8014 +#include <linux/init.h>
8015 +#include "hisax.h"
8016 +#include "isdnl1.h"
8017 +#include "hisax_loadable.h"
8018 +
8019 +extern const char *CardType[];
8020 +
8021 +static const char *hfcusb_revision = "$Revision: 2.5 $";
8022 +
8023 +/*********************************/
8024 +/* schedule a new b_channel task */
8025 +/*********************************/
8026 +static void
8027 +hfcusb_sched_event(struct BCState *bcs, int event)
8028 +{
8029 +       bcs->event |= 1 << event;
8030 +       queue_task(&bcs->tqueue, &tq_immediate);
8031 +       mark_bh(IMMEDIATE_BH);
8032 +}
8033 +
8034 +/************************************************/
8035 +/* select a b-channel entry matching and active */
8036 +/************************************************/
8037 +static
8038 +struct BCState *
8039 +Sel_BCS(struct IsdnCardState *cs, int channel)
8040 +{
8041 +       if (cs->bcs[0].mode && (cs->bcs[0].channel == channel))
8042 +               return (&cs->bcs[0]);
8043 +       else if (cs->bcs[1].mode && (cs->bcs[1].channel == channel))
8044 +               return (&cs->bcs[1]);
8045 +       else
8046 +               return (NULL);
8047 +}
8048 +
8049 +/**********************************************/
8050 +/* transfer function (D-channel from l2 to l1 */
8051 +/**********************************************/
8052 +static void
8053 +hfcusb_d_l2l1(struct PStack *st, int pr, void *arg)
8054 +{
8055 +       struct IsdnCardState *cs = st->l1.hardware;
8056 +       struct hisax_drvreg *drv = cs->hw.hfcusb.drv;
8057 +
8058 +       if (drv) {
8059 +               switch (pr) {
8060 +                       case (PH_DATA | REQUEST):
8061 +                       case (PH_PULL | INDICATION):
8062 +                               cs->hw.hfcusb.dch_tx_busy = 1;
8063 +                               break;
8064 +                       case (PH_PULL | REQUEST):
8065 +                               if (!cs->hw.hfcusb.dch_tx_busy) {
8066 +                                       test_and_clear_bit(FLG_L1_PULL_REQ,
8067 +                                                          &st->l1.Flags);
8068 +                                       st->l1.l1l2(st, PH_PULL | CONFIRM,
8069 +                                                   NULL);
8070 +                               } else
8071 +                                       test_and_set_bit(FLG_L1_PULL_REQ,
8072 +                                                        &st->l1.Flags);
8073 +                               return;
8074 +               }
8075 +               drv->dch_l2l1(drv, pr, arg);
8076 +       } else
8077 +               debugl1(cs, "hfcusb l2l1 called without existing driver");
8078 +}                              /* hfcusb_d_l2l1 */
8079 +
8080 +/*****************************/
8081 +/* E-channel receive routine */
8082 +/*****************************/
8083 +static void
8084 +EChannel_proc_rcv(struct IsdnCardState *cs)
8085 +{
8086 +       u_char *ptr;
8087 +       struct sk_buff *skb;
8088 +       struct hisax_drvreg *usbdrv =
8089 +           (struct hisax_drvreg *) cs->hw.hfcusb.drv;
8090 +
8091 +
8092 +       while ((skb = skb_dequeue(&usbdrv->erq)) != NULL) {
8093 +               if (cs->debug & DEB_DLOG_HEX) {
8094 +                       ptr = cs->dlog;
8095 +                       if ((skb->len) < MAX_DLOG_SPACE / 3 - 10) {
8096 +                               *ptr++ = 'E';
8097 +                               *ptr++ = 'C';
8098 +                               *ptr++ = 'H';
8099 +                               *ptr++ = 'O';
8100 +                               *ptr++ = ':';
8101 +                               ptr += QuickHex(ptr, skb->data, skb->len);
8102 +                               ptr--;
8103 +                               *ptr++ = '\n';
8104 +                               *ptr = 0;
8105 +                               HiSax_putstatus(cs, NULL, cs->dlog);
8106 +                       } else
8107 +                               HiSax_putstatus(cs, "LogEcho: ",
8108 +                                               "warning Frame too big (%d)",
8109 +                                               skb->len);
8110 +               }
8111 +               dev_kfree_skb_any(skb);
8112 +       }
8113 +}
8114 +
8115 +/******************************************/
8116 +/* transfer function called from L1 to L2 */
8117 +/******************************************/
8118 +static void
8119 +hfcusb_d_l1l2(void *cs1, int pr, void *arg)
8120 +{
8121 +       struct IsdnCardState *cs = (struct IsdnCardState *) cs1;
8122 +
8123 +       switch (pr) {
8124 +               case (PH_DATA | INDICATION):
8125 +                       if (!((int) arg))
8126 +                               DChannel_proc_rcv(cs);
8127 +                       else
8128 +                               EChannel_proc_rcv(cs);
8129 +                       break;
8130 +
8131 +               case (PH_DATA | CONFIRM):
8132 +                       cs->hw.hfcusb.dch_tx_busy = 0;
8133 +                       DChannel_proc_xmt(cs);
8134 +                       break;
8135 +
8136 +               case (PH_ACTIVATE | INDICATION):
8137 +               case (PH_ACTIVATE | CONFIRM):
8138 +                       cs->stlist->l1.l1l2(cs->stlist, pr, arg);
8139 +                       if (cs->debug & L1_DEB_ISAC)
8140 +                               debugl1(cs, "layer 1 activated");
8141 +                       break;
8142 +
8143 +               case (PH_DEACTIVATE | INDICATION):
8144 +               case (PH_DEACTIVATE | CONFIRM):
8145 +                       cs->stlist->l1.l1l2(cs->stlist, pr, arg);
8146 +                       if (cs->debug & L1_DEB_ISAC)
8147 +                               debugl1(cs, "layer 1 deactivated");
8148 +                       break;
8149 +
8150 +               default:
8151 +                       debugl1(cs, "unknown l1 msg 0x%x ", pr);
8152 +       }
8153 +}                              /* hfcusb_d_l1l2 */
8154 +
8155 +
8156 +/******************************************/
8157 +/* transfer function called from L1 to L2 */
8158 +/******************************************/
8159 +static void
8160 +hfcusb_b_l1l2(void *cs1, int chan, int pr, void *arg)
8161 +{
8162 +       struct IsdnCardState *cs = (struct IsdnCardState *) cs1;
8163 +       struct BCState *bcs = Sel_BCS(cs, chan);
8164 +
8165 +       switch (pr) {
8166 +               case (PH_DATA | INDICATION):
8167 +                       if (!bcs)
8168 +                               return;
8169 +                       hfcusb_sched_event(bcs, B_RCVBUFREADY);
8170 +                       break;
8171 +
8172 +               case (PH_DATA | CONFIRM):
8173 +                       if (!bcs)
8174 +                               return;
8175 +                       bcs->tx_cnt -= bcs->tx_skb->len;
8176 +                       if (bcs->st->lli.l1writewakeup &&
8177 +                           (PACKET_NOACK != bcs->tx_skb->pkt_type))
8178 +                               bcs->st->lli.l1writewakeup(bcs->st,
8179 +                                                          bcs->tx_skb->
8180 +                                                          len);
8181 +                       dev_kfree_skb_any(bcs->tx_skb);
8182 +                       bcs->tx_skb = skb_dequeue(&bcs->squeue);
8183 +                       break;
8184 +
8185 +               case (PH_ACTIVATE | INDICATION):
8186 +               case (PH_ACTIVATE | CONFIRM):
8187 +                       cs->stlist->l1.l1l2(cs->stlist, pr, arg);
8188 +                       if (cs->debug & L1_DEB_ISAC)
8189 +                               debugl1(cs, "layer 1 activated");
8190 +                       break;
8191 +
8192 +               case (PH_DEACTIVATE | INDICATION):
8193 +               case (PH_DEACTIVATE | CONFIRM):
8194 +                       cs->stlist->l1.l1l2(cs->stlist, pr, arg);
8195 +                       if (cs->debug & L1_DEB_ISAC)
8196 +                               debugl1(cs, "layer 1 deactivated");
8197 +                       break;
8198 +
8199 +               default:
8200 +                       debugl1(cs, "unknown l1 b msg 0x%x ", pr);
8201 +       }
8202 +}                              /* hfcusb_b_l1l2 */
8203 +
8204 +
8205 +/***********************************************/
8206 +/* called during init setting l1 stack pointer */
8207 +/***********************************************/
8208 +void
8209 +setstack_hfcusb(struct PStack *st, struct IsdnCardState *cs)
8210 +{
8211 +       st->l2.l2l1 = hfcusb_d_l2l1;
8212 +}
8213 +
8214 +/**************************************/
8215 +/* send B-channel data if not blocked */
8216 +/**************************************/
8217 +static void
8218 +hfcusb_send_data(struct BCState *bcs)
8219 +{
8220 +       struct IsdnCardState *cs = bcs->cs;
8221 +       struct hisax_drvreg *drv =
8222 +           (struct hisax_drvreg *) cs->hw.hfcusb.drv;
8223 +
8224 +       if (!drv)
8225 +               return;
8226 +       drv->bch_l2l1(drv->argl1, bcs->channel, PH_DATA | REQUEST,
8227 +                     bcs->tx_skb);
8228 +}
8229 +
8230 +/***************************************************************/
8231 +/* activate/deactivate hardware for selected channels and mode */
8232 +/***************************************************************/
8233 +void
8234 +mode_hfcusb(struct BCState *bcs, int mode, int bc)
8235 +{
8236 +       struct IsdnCardState *cs = bcs->cs;
8237 +       struct hisax_drvreg *drv = cs->hw.hfcusb.drv;
8238 +
8239 +       if (!drv)
8240 +               return;
8241 +       if (cs->debug & L1_DEB_HSCX)
8242 +               debugl1(cs, "HFCUSB bchannel mode %d bchan %d/%d",
8243 +                       mode, bc, bcs->channel);
8244 +       bcs->mode = mode;
8245 +       bcs->channel = bc;
8246 +       if (mode) {
8247 +               drv->bsk[bc] = &bcs->tx_skb;
8248 +               drv->brq[bc] = &bcs->rqueue;
8249 +       }
8250 +       drv->bch_l2l1(drv->argl1, bc, PH_ACTIVATE | REQUEST,
8251 +                     (void *) mode);
8252 +       if (!mode) {
8253 +               drv->bsk[bc] = NULL;
8254 +               drv->brq[bc] = NULL;
8255 +       }
8256 +}
8257 +
8258 +/******************************/
8259 +/* Layer2 -> Layer 1 Transfer */
8260 +/******************************/
8261 +static void
8262 +hfcusb_b_l2l1(struct PStack *st, int pr, void *arg)
8263 +{
8264 +       struct sk_buff *skb = arg;
8265 +       struct hisax_drvreg *drv = st->l1.bcs->cs->hw.hfcusb.drv;
8266 +       long flags;
8267 +
8268 +       switch (pr) {
8269 +               case (PH_DATA | REQUEST):
8270 +                       save_flags(flags);
8271 +                       cli();
8272 +                       if (st->l1.bcs->tx_skb) {
8273 +                               skb_queue_tail(&st->l1.bcs->squeue, skb);
8274 +                               restore_flags(flags);
8275 +                       } else {
8276 +                               st->l1.bcs->tx_skb = skb;
8277 +                               st->l1.bcs->cs->BC_Send_Data(st->l1.bcs);
8278 +                               restore_flags(flags);
8279 +                       }
8280 +                       break;
8281 +               case (PH_PULL | INDICATION):
8282 +                       if (st->l1.bcs->tx_skb) {
8283 +                               printk(KERN_WARNING
8284 +                                      "hfc_l2l1: this shouldn't happen\n");
8285 +                               break;
8286 +                       }
8287 +                       save_flags(flags);
8288 +                       cli();
8289 +                       st->l1.bcs->tx_skb = skb;
8290 +                       st->l1.bcs->cs->BC_Send_Data(st->l1.bcs);
8291 +                       restore_flags(flags);
8292 +                       break;
8293 +               case (PH_PULL | REQUEST):
8294 +                       if (!st->l1.bcs->tx_skb) {
8295 +                               test_and_clear_bit(FLG_L1_PULL_REQ,
8296 +                                                  &st->l1.Flags);
8297 +                               st->l1.l1l2(st, PH_PULL | CONFIRM, NULL);
8298 +                       } else
8299 +                               test_and_set_bit(FLG_L1_PULL_REQ,
8300 +                                                &st->l1.Flags);
8301 +                       break;
8302 +               case (PH_ACTIVATE | REQUEST):
8303 +                       if (drv) {
8304 +                               test_and_set_bit(BC_FLG_ACTIV,
8305 +                                                &st->l1.bcs->Flag);
8306 +                               mode_hfcusb(st->l1.bcs, st->l1.mode,
8307 +                                           st->l1.bc);
8308 +                               l1_msg_b(st, pr, arg);
8309 +                       }
8310 +                       break;
8311 +               case (PH_DEACTIVATE | REQUEST):
8312 +                       l1_msg_b(st, pr, arg);
8313 +                       break;
8314 +               case (PH_DEACTIVATE | CONFIRM):
8315 +                       test_and_clear_bit(BC_FLG_ACTIV,
8316 +                                          &st->l1.bcs->Flag);
8317 +                       test_and_clear_bit(BC_FLG_BUSY, &st->l1.bcs->Flag);
8318 +                       mode_hfcusb(st->l1.bcs, 0, st->l1.bc);
8319 +                       st->l1.l1l2(st, PH_DEACTIVATE | CONFIRM, NULL);
8320 +                       break;
8321 +       }
8322 +}
8323 +
8324 +/******************************************/
8325 +/* deactivate B-channel access and queues */
8326 +/******************************************/
8327 +static void
8328 +close_hfcusb(struct BCState *bcs)
8329 +{
8330 +       mode_hfcusb(bcs, 0, bcs->channel);
8331 +       if (test_and_clear_bit(BC_FLG_INIT, &bcs->Flag)) {
8332 +               skb_queue_purge(&bcs->rqueue);
8333 +               skb_queue_purge(&bcs->squeue);
8334 +               if (bcs->tx_skb) {
8335 +                       dev_kfree_skb_any(bcs->tx_skb);
8336 +                       bcs->tx_skb = NULL;
8337 +                       test_and_clear_bit(BC_FLG_BUSY, &bcs->Flag);
8338 +               }
8339 +       }
8340 +}
8341 +
8342 +/*************************************/
8343 +/* init B-channel queues and control */
8344 +/*************************************/
8345 +static int
8346 +open_hfcusbstate(struct IsdnCardState *cs, struct BCState *bcs)
8347 +{
8348 +       if (!test_and_set_bit(BC_FLG_INIT, &bcs->Flag)) {
8349 +               skb_queue_head_init(&bcs->rqueue);
8350 +               skb_queue_head_init(&bcs->squeue);
8351 +       }
8352 +       bcs->tx_skb = NULL;
8353 +       test_and_clear_bit(BC_FLG_BUSY, &bcs->Flag);
8354 +       bcs->event = 0;
8355 +       bcs->tx_cnt = 0;
8356 +       return (0);
8357 +}
8358 +
8359 +/*********************************/
8360 +/* inits the stack for B-channel */
8361 +/*********************************/
8362 +static int
8363 +setstack_2b(struct PStack *st, struct BCState *bcs)
8364 +{
8365 +       bcs->channel = st->l1.bc;
8366 +       if (open_hfcusbstate(st->l1.hardware, bcs))
8367 +               return (-1);
8368 +       st->l1.bcs = bcs;
8369 +       st->l2.l2l1 = hfcusb_b_l2l1;
8370 +       setstack_manager(st);
8371 +       bcs->st = st;
8372 +       setstack_l1_B(st);
8373 +       return (0);
8374 +}
8375 +
8376 +/********************************/
8377 +/* called for card init message */
8378 +/********************************/
8379 +void __devinit
8380 +inithfcusb(struct IsdnCardState *cs)
8381 +{
8382 +       cs->setstack_d = setstack_hfcusb;
8383 +       cs->BC_Send_Data = &hfcusb_send_data;
8384 +       cs->bcs[0].BC_SetStack = setstack_2b;
8385 +       cs->bcs[1].BC_SetStack = setstack_2b;
8386 +       cs->bcs[0].BC_Close = close_hfcusb;
8387 +       cs->bcs[1].BC_Close = close_hfcusb;
8388 +       mode_hfcusb(cs->bcs, 0, 0);
8389 +       mode_hfcusb(cs->bcs + 1, 0, 1);
8390 +}
8391 +
8392 +
8393 +
8394 +/*******************************************/
8395 +/* handle card messages from control layer */
8396 +/*******************************************/
8397 +static int
8398 +hfcusb_card_msg(struct IsdnCardState *cs, int mt, void *arg)
8399 +{
8400 +       if (cs->debug & L1_DEB_ISAC)
8401 +               debugl1(cs, "HFCUSB: card_msg %x", mt);
8402 +       switch (mt) {
8403 +               case CARD_INIT:
8404 +                       inithfcusb(cs);
8405 +                       return (0);
8406 +               case CARD_RELEASE:
8407 +               case CARD_RESET:
8408 +               case CARD_TEST:
8409 +                       return (0);
8410 +       }
8411 +       return (0);
8412 +}
8413 +
8414 +
8415 +extern void
8416 + HiSax_closecard(int cardnr);
8417 +/*****************************/
8418 +/* release a driver instance */
8419 +/* called when hardware is   */
8420 +/* no longer present.        */
8421 +/*****************************/
8422 +static void
8423 +release_hfcdrv(void *arg)
8424 +{
8425 +       struct IsdnCardState *cs = (struct IsdnCardState *) arg;
8426 +
8427 +       cs->hw.hfcusb.drv = NULL;       /* disable any further use of driver */
8428 +       HiSax_closecard(cs->cardnr);
8429 +}                              /* release_hfcdrv */
8430 +
8431 +/*********************************************/
8432 +/* called once when a new device is detected */
8433 +/* initialises local data                    */
8434 +/*********************************************/
8435 +int
8436 +setup_hfc_usb(struct IsdnCard *card)
8437 +{
8438 +       struct IsdnCardState *cs = card->cs;
8439 +       char tmp[64];
8440 +       struct hisax_drvreg *usbdrv =
8441 +           (struct hisax_drvreg *) cs->hw.hfcusb.drv;
8442 +
8443 +       if (!usbdrv)
8444 +               return (0);     /* no driver data present */
8445 +
8446 +       strcpy(tmp, hfcusb_revision);
8447 +       printk(KERN_INFO "HiSax: HFC-USB driver Rev. %s\n",
8448 +              HiSax_getrev(tmp));
8449 +
8450 +       usbdrv->release_driver = &release_hfcdrv;       /* release routine */
8451 +       usbdrv->arg_hisax = (void *) cs;        /* parameter for calling */
8452 +       usbdrv->dch_l1l2 = &hfcusb_d_l1l2;      /* access from L1 to HiSax */
8453 +       usbdrv->bch_l1l2 = &hfcusb_b_l1l2;
8454 +       usbdrv->drq = &cs->rq;
8455 +       usbdrv->dsq = &cs->sq;
8456 +       cs->cardmsg = &hfcusb_card_msg;
8457 +       return (1);             /* success */
8458 +}
8459 Index: linux-2.4.35.4/drivers/isdn/hisax/hfcscard.c
8460 ===================================================================
8461 --- linux-2.4.35.4.orig/drivers/isdn/hisax/hfcscard.c   2007-12-15 05:19:39.998700433 +0100
8462 +++ linux-2.4.35.4/drivers/isdn/hisax/hfcscard.c        2007-12-15 05:19:55.575588111 +0100
8463 @@ -1,4 +1,4 @@
8464 -/* $Id: hfcscard.c,v 1.1.4.1 2001/11/20 14:19:35 kai Exp $
8465 +/* $Id: hfcscard.c,v 1.10 2001/09/24 13:22:56 kai Exp $
8466   *
8467   * low level stuff for hfcs based cards (Teles3c, ACER P10)
8468   *
8469 @@ -12,14 +12,13 @@
8470  
8471  #define __NO_VERSION__
8472  #include <linux/init.h>
8473 -#include <linux/isapnp.h>
8474  #include "hisax.h"
8475  #include "hfc_2bds0.h"
8476  #include "isdnl1.h"
8477  
8478  extern const char *CardType[];
8479  
8480 -static const char *hfcs_revision = "$Revision: 1.1.4.1 $";
8481 +static const char *hfcs_revision = "$Revision: 1.10 $";
8482  
8483  static void
8484  hfcs_interrupt(int intno, void *dev_id, struct pt_regs *regs)
8485 @@ -140,36 +139,6 @@
8486         return(0);
8487  }
8488  
8489 -#ifdef __ISAPNP__
8490 -static struct isapnp_device_id hfc_ids[] __initdata = {
8491 -       { ISAPNP_VENDOR('A', 'N', 'X'), ISAPNP_FUNCTION(0x1114),
8492 -         ISAPNP_VENDOR('A', 'N', 'X'), ISAPNP_FUNCTION(0x1114), 
8493 -         (unsigned long) "Acer P10" },
8494 -       { ISAPNP_VENDOR('B', 'I', 'L'), ISAPNP_FUNCTION(0x0002),
8495 -         ISAPNP_VENDOR('B', 'I', 'L'), ISAPNP_FUNCTION(0x0002), 
8496 -         (unsigned long) "Billion 2" },
8497 -       { ISAPNP_VENDOR('B', 'I', 'L'), ISAPNP_FUNCTION(0x0001),
8498 -         ISAPNP_VENDOR('B', 'I', 'L'), ISAPNP_FUNCTION(0x0001), 
8499 -         (unsigned long) "Billion 1" },
8500 -       { ISAPNP_VENDOR('T', 'A', 'G'), ISAPNP_FUNCTION(0x7410),
8501 -         ISAPNP_VENDOR('T', 'A', 'G'), ISAPNP_FUNCTION(0x7410), 
8502 -         (unsigned long) "IStar PnP" },
8503 -       { ISAPNP_VENDOR('T', 'A', 'G'), ISAPNP_FUNCTION(0x2610),
8504 -         ISAPNP_VENDOR('T', 'A', 'G'), ISAPNP_FUNCTION(0x2610), 
8505 -         (unsigned long) "Teles 16.3c" },
8506 -       { ISAPNP_VENDOR('S', 'F', 'M'), ISAPNP_FUNCTION(0x0001),
8507 -         ISAPNP_VENDOR('S', 'F', 'M'), ISAPNP_FUNCTION(0x0001), 
8508 -         (unsigned long) "Tornado Tipa C" },
8509 -       { ISAPNP_VENDOR('K', 'Y', 'E'), ISAPNP_FUNCTION(0x0001),
8510 -         ISAPNP_VENDOR('K', 'Y', 'E'), ISAPNP_FUNCTION(0x0001), 
8511 -         (unsigned long) "Genius Speed Surfer" },
8512 -       { 0, }
8513 -};
8514 -
8515 -static struct isapnp_device_id *hdev = &hfc_ids[0];
8516 -static struct pci_bus *pnp_c __devinitdata = NULL;
8517 -#endif
8518 -
8519  int __init
8520  setup_hfcs(struct IsdnCard *card)
8521  {
8522 @@ -178,46 +147,6 @@
8523  
8524         strcpy(tmp, hfcs_revision);
8525         printk(KERN_INFO "HiSax: HFC-S driver Rev. %s\n", HiSax_getrev(tmp));
8526 -
8527 -#ifdef __ISAPNP__
8528 -       if (!card->para[1] && isapnp_present()) {
8529 -               struct pci_bus *pb;
8530 -               struct pci_dev *pd;
8531 -
8532 -               while(hdev->card_vendor) {
8533 -                       if ((pb = isapnp_find_card(hdev->card_vendor,
8534 -                               hdev->card_device, pnp_c))) {
8535 -                               pnp_c = pb;
8536 -                               pd = NULL;
8537 -                               if ((pd = isapnp_find_dev(pnp_c,
8538 -                                       hdev->vendor, hdev->function, pd))) {
8539 -                                       printk(KERN_INFO "HiSax: %s detected\n",
8540 -                                               (char *)hdev->driver_data);
8541 -                                       pd->prepare(pd);
8542 -                                       pd->deactivate(pd);
8543 -                                       pd->activate(pd);
8544 -                                       card->para[1] = pd->resource[0].start;
8545 -                                       card->para[0] = pd->irq_resource[0].start;
8546 -                                       if (!card->para[0] || !card->para[1]) {
8547 -                                               printk(KERN_ERR "HFC PnP:some resources are missing %ld/%lx\n",
8548 -                                               card->para[0], card->para[1]);
8549 -                                               pd->deactivate(pd);
8550 -                                               return(0);
8551 -                                       }
8552 -                                       break;
8553 -                               } else {
8554 -                                       printk(KERN_ERR "HFC PnP: PnP error card found, no device\n");
8555 -                               }
8556 -                       }
8557 -                       hdev++;
8558 -                       pnp_c=NULL;
8559 -               } 
8560 -               if (!hdev->card_vendor) {
8561 -                       printk(KERN_INFO "HFC PnP: no ISAPnP card found\n");
8562 -                       return(0);
8563 -               }
8564 -       }
8565 -#endif
8566         cs->hw.hfcD.addr = card->para[1] & 0xfffe;
8567         cs->irq = card->para[0];
8568         cs->hw.hfcD.cip = 0;
8569 Index: linux-2.4.35.4/drivers/isdn/hisax/hisax.h
8570 ===================================================================
8571 --- linux-2.4.35.4.orig/drivers/isdn/hisax/hisax.h      2007-12-15 05:19:40.006700891 +0100
8572 +++ linux-2.4.35.4/drivers/isdn/hisax/hisax.h   2007-12-15 05:19:55.579588340 +0100
8573 @@ -1,4 +1,4 @@
8574 -/* $Id: hisax.h,v 1.1.4.2 2001/12/09 19:15:28 kai Exp $
8575 +/* $Id: hisax.h,v 2.64 2001/09/24 13:22:56 kai Exp $
8576   *
8577   * Basic declarations, defines and prototypes
8578   *
8579 @@ -24,7 +24,9 @@
8580  #include <linux/isdnif.h>
8581  #include <linux/tty.h>
8582  #include <linux/serial_reg.h>
8583 +#ifndef COMPAT_NO_SOFTNET
8584  #include <linux/netdevice.h>
8585 +#endif
8586  
8587  #define ERROR_STATISTIC
8588  
8589 @@ -68,9 +70,6 @@
8590  #define DL_DATA                0x0220
8591  #define DL_FLUSH       0x0224
8592  #define DL_UNIT_DATA   0x0230
8593 -
8594 -#define MDL_BC_RELEASE  0x0278  // Formula-n enter:now
8595 -#define MDL_BC_ASSIGN   0x027C  // Formula-n enter:now
8596  #define MDL_ASSIGN     0x0280
8597  #define MDL_REMOVE     0x0284
8598  #define MDL_ERROR      0x0288
8599 @@ -472,8 +471,6 @@
8600  #define BC_FLG_FTI_RUN 13
8601  #define BC_FLG_LL_OK   14
8602  #define BC_FLG_LL_CONN 15
8603 -#define BC_FLG_FTI_FTS 16
8604 -#define BC_FLG_FRH_WAIT        17
8605  
8606  #define L1_MODE_NULL   0
8607  #define L1_MODE_TRANS  1
8608 @@ -695,6 +692,13 @@
8609         struct timer_list timer;
8610  };
8611  
8612 +#ifdef CONFIG_HISAX_HFC_USB
8613 +struct hfcUSB_hw {  
8614 +        void *drv; /* pointer to driver structure */
8615 +        int dch_tx_busy;
8616 +};
8617 +#endif
8618 +
8619  struct hfcSX_hw {
8620          unsigned long base;
8621         unsigned char cirm;
8622 @@ -838,17 +842,6 @@
8623         int ph_state;
8624  };
8625  
8626 -struct amd7930_chip {
8627 -       u_char lmr1;
8628 -       u_char ph_state;
8629 -       u_char old_state;
8630 -       u_char flg_t3;
8631 -       unsigned int tx_xmtlen;
8632 -       struct timer_list timer3;
8633 -       void (*ph_command) (struct IsdnCardState *, u_char, char *);
8634 -       void (*setIrqMask) (struct IsdnCardState *, u_char);
8635 -};
8636 -
8637  struct icc_chip {
8638         int ph_state;
8639         u_char *mon_tx;
8640 @@ -902,6 +895,9 @@
8641                 struct njet_hw njet;
8642                 struct hfcD_hw hfcD;
8643                 struct hfcPCI_hw hfcpci;
8644 +#ifdef CONFIG_HISAX_HFC_USB
8645 +               struct hfcUSB_hw hfcusb;
8646 +#endif
8647                 struct hfcSX_hw hfcsx;
8648                 struct ix1_hw niccy;
8649                 struct isurf_hw isurf;
8650 @@ -945,7 +941,6 @@
8651                 struct hfcpci_chip hfcpci;
8652                 struct hfcsx_chip hfcsx;
8653                 struct w6692_chip w6692;
8654 -               struct amd7930_chip amd7930;
8655                 struct icc_chip icc;
8656         } dc;
8657         u_char *rcvbuf;
8658 @@ -967,6 +962,8 @@
8659  #define  MON0_TX       4
8660  #define  MON1_TX       8
8661  
8662 +#define         HISAX_MAX_CARDS        8
8663 +
8664  #define  ISDN_CTYPE_16_0       1
8665  #define  ISDN_CTYPE_8_0                2
8666  #define  ISDN_CTYPE_16_3       3
8667 @@ -1006,8 +1003,8 @@
8668  #define  ISDN_CTYPE_HFC_SX      37
8669  #define  ISDN_CTYPE_NETJET_U   38
8670  #define  ISDN_CTYPE_HFC_SP_PCMCIA      39
8671 -#define  ISDN_CTYPE_DYNAMIC     40
8672 -#define  ISDN_CTYPE_ENTERNOW   41
8673 +#define  ISDN_CTYPE_HFC_USB     40
8674 +#define  ISDN_CTYPE_DYNAMIC     41
8675  #define  ISDN_CTYPE_COUNT      41
8676  
8677  
8678 @@ -1267,10 +1264,6 @@
8679  #define CARD_NETJET_U 0
8680  #endif
8681  
8682 -#ifdef CONFIG_HISAX_ENTERNOW_PCI
8683 -#define CARD_FN_ENTERNOW_PCI 1
8684 -#endif
8685 -
8686  #define TEI_PER_CARD 1
8687  
8688  /* L1 Debug */
8689 Index: linux-2.4.35.4/drivers/isdn/hisax/hisax_debug.h
8690 ===================================================================
8691 --- linux-2.4.35.4.orig/drivers/isdn/hisax/hisax_debug.h        2007-12-15 05:19:40.014701347 +0100
8692 +++ linux-2.4.35.4/drivers/isdn/hisax/hisax_debug.h     2007-12-15 05:19:55.579588340 +0100
8693 @@ -28,7 +28,7 @@
8694  
8695  #define DBG(level, format, arg...) do { \
8696  if (level & __debug_variable) \
8697 -printk(KERN_DEBUG "%s: " format "\n" , __FUNCTION__ , ## arg); \
8698 +printk(KERN_DEBUG __FUNCTION__ ": " format "\n" , ## arg); \
8699  } while (0)
8700  
8701  #define DBG_PACKET(level,data,count) \
8702 Index: linux-2.4.35.4/drivers/isdn/hisax/hisax_fcpcipnp.c
8703 ===================================================================
8704 --- linux-2.4.35.4.orig/drivers/isdn/hisax/hisax_fcpcipnp.c     2007-12-15 05:19:40.018701573 +0100
8705 +++ linux-2.4.35.4/drivers/isdn/hisax/hisax_fcpcipnp.c  2007-12-15 05:19:55.579588340 +0100
8706 @@ -20,22 +20,19 @@
8707   *
8708   * o POWER PC
8709   * o clean up debugging
8710 - * o tx_skb at PH_DEACTIVATE time
8711   */
8712  
8713  #include <linux/version.h>
8714  #include <linux/module.h>
8715  #include <linux/init.h>
8716  #include <linux/pci.h>
8717 -#include <linux/isapnp.h>
8718 +#include "hisax_isapnp.h"
8719  #include <linux/kmod.h>
8720  #include <linux/slab.h>
8721  #include <linux/skbuff.h>
8722  #include <linux/netdevice.h>
8723 -
8724 -#include <asm/io.h>
8725 -
8726  #include "hisax_fcpcipnp.h"
8727 +#include "hisax_isac.h"
8728  
8729  // debugging cruft
8730  #define __debug_variable debug
8731 @@ -46,10 +43,14 @@
8732  MODULE_PARM(debug, "i");
8733  #endif
8734  
8735 -MODULE_AUTHOR("Kai Germaschewski <kai.germaschewski@gmx.de>/Karsten Keil <kkeil@suse.de>");
8736 +MODULE_AUTHOR("Kai Germaschewski <kai.germaschewski@gmx.de>");
8737  MODULE_DESCRIPTION("AVM Fritz!PCI/PnP ISDN driver");
8738  
8739 -static struct pci_device_id fcpci_ids[] __devinitdata = {
8740 +#ifndef PCI_DEVICE_ID_AVM_A1_V2
8741 +#define PCI_DEVICE_ID_AVM_A1_V2 0x0e00
8742 +#endif
8743 +
8744 +static struct pci_device_id fcpci_ids[] __initdata = {
8745         { PCI_VENDOR_ID_AVM, PCI_DEVICE_ID_AVM_A1   , PCI_ANY_ID, PCI_ANY_ID,
8746           0, 0, (unsigned long) "Fritz!Card PCI" },
8747         { PCI_VENDOR_ID_AVM, PCI_DEVICE_ID_AVM_A1_V2, PCI_ANY_ID, PCI_ANY_ID,
8748 @@ -58,7 +59,7 @@
8749  };
8750  MODULE_DEVICE_TABLE(pci, fcpci_ids);
8751  
8752 -static struct isapnp_device_id fcpnp_ids[] __devinitdata = {
8753 +static struct isapnp_device_id fcpnp_ids[] __initdata = {
8754         { ISAPNP_VENDOR('A', 'V', 'M'), ISAPNP_FUNCTION(0x0900),
8755           ISAPNP_VENDOR('A', 'V', 'M'), ISAPNP_FUNCTION(0x0900), 
8756           (unsigned long) "Fritz!Card PnP" },
8757 @@ -68,7 +69,8 @@
8758  
8759  static int protocol = 2;       /* EURO-ISDN Default */
8760  MODULE_PARM(protocol, "i");
8761 -MODULE_LICENSE("GPL");
8762 +
8763 +static LIST_HEAD(adapter_list);
8764  
8765  // ----------------------------------------------------------------------
8766  
8767 @@ -147,7 +149,7 @@
8768         outb(idx, adapter->io + AVM_INDEX);
8769         val = inb(adapter->io + AVM_DATA + (offset & 0xf));
8770         spin_unlock_irqrestore(&adapter->hw_lock, flags);
8771 -       DBG(0x1000, " port %#x, value %#x",
8772 +       DBG(0x1000, __FUNCTION__ " port %#x, value %#x",
8773             offset, val);
8774         return val;
8775  }
8776 @@ -160,7 +162,7 @@
8777                 AVM_IDX_ISAC_REG_HIGH : AVM_IDX_ISAC_REG_LOW;
8778         unsigned long flags;
8779  
8780 -       DBG(0x1000, " port %#x, value %#x",
8781 +       DBG(0x1000, __FUNCTION__ " port %#x, value %#x",
8782             offset, value);
8783         spin_lock_irqsave(&adapter->hw_lock, flags);
8784         outb(idx, adapter->io + AVM_INDEX);
8785 @@ -240,7 +242,7 @@
8786         outl(offset, adapter->io + AVM_ISACSX_INDEX);
8787         val = inl(adapter->io + AVM_ISACSX_DATA);
8788         spin_unlock_irqrestore(&adapter->hw_lock, flags);
8789 -       DBG(0x1000, " port %#x, value %#x",
8790 +       DBG(0x1000, __FUNCTION__ " port %#x, value %#x",
8791             offset, val);
8792  
8793         return val;
8794 @@ -252,7 +254,7 @@
8795         struct fritz_adapter *adapter = isac->priv;
8796         unsigned long flags;
8797  
8798 -       DBG(0x1000, " port %#x, value %#x",
8799 +       DBG(0x1000, __FUNCTION__ " port %#x, value %#x",
8800             offset, value);
8801         spin_lock_irqsave(&adapter->hw_lock, flags);
8802         outl(offset, adapter->io + AVM_ISACSX_INDEX);
8803 @@ -375,6 +377,9 @@
8804  
8805         DBG(0x40, "hdlc_fill_fifo");
8806  
8807 +       if (!skb)
8808 +               BUG();
8809 +
8810         if (skb->len == 0)
8811                 BUG();
8812  
8813 @@ -515,7 +520,6 @@
8814         }
8815         skb_push(bcs->tx_skb, bcs->tx_cnt);
8816         bcs->tx_cnt = 0;
8817 -       hdlc_fill_fifo(bcs);
8818  }
8819  
8820  static inline void hdlc_xpr_irq(struct fritz_bcs *bcs)
8821 @@ -536,7 +540,7 @@
8822         dev_kfree_skb_irq(skb);
8823  }
8824  
8825 -static void hdlc_irq_one(struct fritz_bcs *bcs, u32 stat)
8826 +static void hdlc_irq(struct fritz_bcs *bcs, u32 stat)
8827  {
8828         DBG(0x10, "ch%d stat %#x", bcs->channel, stat);
8829         if (stat & HDLC_INT_RPR) {
8830 @@ -553,7 +557,7 @@
8831         }
8832  }
8833  
8834 -static inline void hdlc_irq(struct fritz_adapter *adapter)
8835 +static inline void hdlc_interrupt(struct fritz_adapter *adapter)
8836  {
8837         int nr;
8838         u32 stat;
8839 @@ -562,7 +566,7 @@
8840                 stat = adapter->read_hdlc_status(adapter, nr);
8841                 DBG(0x10, "HDLC %c stat %#x", 'A' + nr, stat);
8842                 if (stat & HDLC_INT_MASK)
8843 -                       hdlc_irq_one(&adapter->bcs[nr], stat);
8844 +                       hdlc_irq(&adapter->bcs[nr], stat);
8845         }
8846  }
8847  
8848 @@ -584,14 +588,14 @@
8849                 adapter->write_ctrl(bcs, 5);
8850                 break;
8851         case L1_MODE_TRANS:
8852 +               bcs->ctrl.sr.mode = HDLC_MODE_TRANS;
8853 +               adapter->write_ctrl(bcs, 5);
8854 +               bcs->ctrl.sr.cmd = HDLC_CMD_XRS;
8855 +               adapter->write_ctrl(bcs, 1);
8856 +               bcs->ctrl.sr.cmd = 0;
8857 +               break;
8858         case L1_MODE_HDLC:
8859 -               bcs->rcvidx = 0;
8860 -               bcs->tx_cnt = 0;
8861 -               bcs->tx_skb = NULL;
8862 -               if (mode == L1_MODE_TRANS)
8863 -                       bcs->ctrl.sr.mode = HDLC_MODE_TRANS;
8864 -               else
8865 -                       bcs->ctrl.sr.mode = HDLC_MODE_ITF_FLG;
8866 +               bcs->ctrl.sr.mode = HDLC_MODE_ITF_FLG;
8867                 adapter->write_ctrl(bcs, 5);
8868                 bcs->ctrl.sr.cmd = HDLC_CMD_XRS;
8869                 adapter->write_ctrl(bcs, 1);
8870 @@ -645,10 +649,10 @@
8871                 return;
8872         DBG(2, "STATUS0 %#x", val);
8873         if (val & AVM_STATUS0_IRQ_ISAC)
8874 -               isacsx_irq(&adapter->isac);
8875 +               isacsx_interrupt(&adapter->isac);
8876  
8877         if (val & AVM_STATUS0_IRQ_HDLC)
8878 -               hdlc_irq(adapter);
8879 +               hdlc_interrupt(adapter);
8880  }
8881  
8882  static void fcpci_irq(int intno, void *dev, struct pt_regs *regs)
8883 @@ -662,10 +666,10 @@
8884                 return;
8885         DBG(2, "sval %#x", sval);
8886         if (!(sval & AVM_STATUS0_IRQ_ISAC))
8887 -               isac_irq(&adapter->isac);
8888 +               isac_interrupt(&adapter->isac);
8889  
8890         if (!(sval & AVM_STATUS0_IRQ_HDLC))
8891 -               hdlc_irq(adapter);
8892 +               hdlc_interrupt(adapter);
8893  }
8894  
8895  // ----------------------------------------------------------------------
8896 @@ -681,11 +685,6 @@
8897  {
8898         outb(AVM_STATUS0_DIS_TIMER | AVM_STATUS0_RES_TIMER | 
8899              AVM_STATUS0_ENA_IRQ, adapter->io + AVM_STATUS0);
8900 -
8901 -       outb(AVM_STATUS1_ENA_IOM | adapter->irq, 
8902 -            adapter->io + AVM_STATUS1);
8903 -       set_current_state(TASK_UNINTERRUPTIBLE);
8904 -       schedule_timeout(50*HZ / 1000); /* Timeout 50ms */
8905  }
8906  
8907  // ----------------------------------------------------------------------
8908 @@ -693,6 +692,7 @@
8909  static int __devinit fcpcipnp_setup(struct fritz_adapter *adapter)
8910  {
8911         u32 val = 0;
8912 +       struct pci_dev *pdev = adapter->pci_dev;
8913         int retval;
8914  
8915         DBG(1,"");
8916 @@ -700,21 +700,21 @@
8917         isac_init(&adapter->isac); // FIXME is this okay now
8918  
8919         retval = -EBUSY;
8920 -       if (!request_region(adapter->io, 32, "fcpcipnp"))
8921 +       if (!request_region(adapter->io, 32, "hisax_fcpcipnp"))
8922                 goto err;
8923  
8924         switch (adapter->type) {
8925         case AVM_FRITZ_PCIV2:
8926 -               retval = request_irq(adapter->irq, fcpci2_irq, SA_SHIRQ, 
8927 -                                    "fcpcipnp", adapter);
8928 +               retval = request_irq(pdev->irq, fcpci2_irq, SA_SHIRQ, 
8929 +                                    "hisax_fcpcipnp", adapter);
8930                 break;
8931         case AVM_FRITZ_PCI:
8932 -               retval = request_irq(adapter->irq, fcpci_irq, SA_SHIRQ,
8933 -                                    "fcpcipnp", adapter);
8934 +               retval = request_irq(pdev->irq, fcpci_irq, SA_SHIRQ,
8935 +                                    "hisax_fcpcipnp", adapter);
8936                 break;
8937         case AVM_FRITZ_PNP:
8938 -               retval = request_irq(adapter->irq, fcpci_irq, 0,
8939 -                                    "fcpcipnp", adapter);
8940 +               retval = request_irq(pdev->irq, fcpci_irq, 0,
8941 +                                    "hisax_fcpcipnp", adapter);
8942                 break;
8943         }
8944         if (retval)
8945 @@ -808,11 +808,23 @@
8946  
8947  static void __devexit fcpcipnp_release(struct fritz_adapter *adapter)
8948  {
8949 +       struct pci_dev *pdev = adapter->pci_dev;
8950 +
8951         DBG(1,"");
8952  
8953         outb(0, adapter->io + AVM_STATUS0);
8954 -       free_irq(adapter->irq, adapter);
8955 +       free_irq(pdev->irq, adapter);
8956         release_region(adapter->io, 32);
8957 +
8958 +       switch (adapter->type) {
8959 +       case AVM_FRITZ_PCI:
8960 +       case AVM_FRITZ_PCIV2:
8961 +               pci_disable_device(pdev);
8962 +               break;
8963 +       case AVM_FRITZ_PNP:
8964 +               pdev->deactivate(pdev);
8965 +               break;
8966 +       }
8967  }
8968  
8969  // ----------------------------------------------------------------------
8970 @@ -830,6 +842,8 @@
8971  
8972         memset(adapter, 0, sizeof(struct fritz_adapter));
8973  
8974 +       adapter->pci_dev = pdev;
8975 +
8976         SET_MODULE_OWNER(&adapter->isac.hisax_d_if);
8977         adapter->isac.hisax_d_if.ifc.priv = &adapter->isac;
8978         adapter->isac.hisax_d_if.ifc.l2l1 = isac_d_l2l1;
8979 @@ -840,6 +854,7 @@
8980                 adapter->bcs[i].b_if.ifc.priv = &adapter->bcs[i];
8981                 adapter->bcs[i].b_if.ifc.l2l1 = fritz_b_l2l1;
8982         }
8983 +       list_add(&adapter->list, &adapter_list);
8984  
8985         pci_set_drvdata(pdev, adapter);
8986  
8987 @@ -854,6 +869,7 @@
8988  static void delete_adapter(struct fritz_adapter *adapter)
8989  {
8990         hisax_unregister(&adapter->isac.hisax_d_if);
8991 +       list_del(&adapter->list);
8992         kfree(adapter);
8993  }
8994  
8995 @@ -863,12 +879,15 @@
8996         struct fritz_adapter *adapter;
8997         int retval;
8998  
8999 +       printk(KERN_INFO "hisax_fcpcipnp: found adapter %s at %s\n",
9000 +              (char *) ent->driver_data, pdev->slot_name);
9001 +
9002         retval = -ENOMEM;
9003         adapter = new_adapter(pdev);
9004         if (!adapter)
9005                 goto err;
9006  
9007 -       if (pdev->device == PCI_DEVICE_ID_AVM_A1_V2) 
9008 +       if (pdev->device == 0x0e00) 
9009                 adapter->type = AVM_FRITZ_PCIV2;
9010         else
9011                 adapter->type = AVM_FRITZ_PCI;
9012 @@ -876,12 +895,7 @@
9013         retval = pci_enable_device(pdev);
9014         if (retval)
9015                 goto err_free;
9016 -
9017         adapter->io = pci_resource_start(pdev, 1);
9018 -       adapter->irq = pdev->irq;
9019 -
9020 -       printk(KERN_INFO "hisax_fcpcipnp: found adapter %s at %s\n",
9021 -              (char *) ent->driver_data, pdev->slot_name);
9022  
9023         retval = fcpcipnp_setup(adapter);
9024         if (retval)
9025 @@ -901,6 +915,9 @@
9026         struct fritz_adapter *adapter;
9027         int retval;
9028  
9029 +       printk(KERN_INFO "hisax_fcpcipnp: found adapter %s\n",
9030 +              (char *) ent->driver_data);
9031 +
9032         retval = -ENOMEM;
9033         adapter = new_adapter(pdev);
9034         if (!adapter)
9035 @@ -912,11 +929,8 @@
9036         pdev->deactivate(pdev); // why?
9037         pdev->activate(pdev);
9038         adapter->io = pdev->resource[0].start;
9039 -       adapter->irq = pdev->irq_resource[0].start;
9040 -
9041 -       printk(KERN_INFO "hisax_fcpcipnp: found adapter %s at IO %#x irq %d\n",
9042 -              (char *) ent->driver_data, adapter->io, adapter->irq);
9043 -
9044 +       pdev->irq = pdev->irq_resource[0].start;
9045 +       
9046         retval = fcpcipnp_setup(adapter);
9047         if (retval)
9048                 goto err_free;
9049 @@ -929,43 +943,35 @@
9050         return retval;
9051  }
9052  
9053 -static void __devexit fcpci_remove(struct pci_dev *pdev)
9054 -{
9055 -       struct fritz_adapter *adapter = pci_get_drvdata(pdev);
9056 -
9057 -       fcpcipnp_release(adapter);
9058 -       pci_disable_device(pdev);
9059 -       delete_adapter(adapter);
9060 -}
9061 -
9062 -static void __devexit fcpnp_remove(struct pci_dev *pdev)
9063 +static void __devexit fcpcipnp_remove(struct pci_dev *pdev)
9064  {
9065         struct fritz_adapter *adapter = pci_get_drvdata(pdev);
9066  
9067         fcpcipnp_release(adapter);
9068 -       pdev->deactivate(pdev);
9069         delete_adapter(adapter);
9070  }
9071  
9072  static struct pci_driver fcpci_driver = {
9073 -       name:     "fcpci",
9074 -       probe:    fcpci_probe,
9075 -       remove:   __devexit_p(fcpci_remove),
9076 +       name: "fcpci",
9077 +       probe: fcpci_probe,
9078 +       remove: fcpcipnp_remove,
9079         id_table: fcpci_ids,
9080  };
9081  
9082  static struct isapnp_driver fcpnp_driver = {
9083 -       name:     "fcpnp",
9084 -       probe:    fcpnp_probe,
9085 -       remove:   __devexit_p(fcpnp_remove),
9086 +       name: "fcpnp",
9087 +       probe: fcpnp_probe,
9088 +       remove: fcpcipnp_remove,
9089         id_table: fcpnp_ids,
9090  };
9091  
9092 -static int __init hisax_fcpcipnp_init(void)
9093 +static LIST_HEAD(isapnp_drivers);
9094 +
9095 +static int __init hisax_fcpci_init(void)
9096  {
9097         int retval, pci_nr_found;
9098  
9099 -       printk(KERN_INFO "hisax_fcpcipnp: Fritz!Card PCI/PCIv2/PnP ISDN driver v0.0.1\n");
9100 +       printk(KERN_INFO "hisax_fcpcipnp: Fritz!PCI/PnP ISDN driver v0.0.1\n");
9101  
9102         retval = pci_register_driver(&fcpci_driver);
9103         if (retval < 0)
9104 @@ -976,15 +982,14 @@
9105         if (retval < 0)
9106                 goto out_unregister_pci;
9107  
9108 -#if !defined(CONFIG_HOTPLUG) || defined(MODULE)
9109 +#if !defined(CONFIG_HOTPLUG) && defined(MODULE)
9110         if (pci_nr_found + retval == 0) {
9111                 retval = -ENODEV;
9112                 goto out_unregister_isapnp;
9113 -       }
9114  #endif
9115         return 0;
9116  
9117 -#if !defined(CONFIG_HOTPLUG) || defined(MODULE)
9118 +#if !defined(CONFIG_HOTPLUG) && defined(MODULE)
9119   out_unregister_isapnp:
9120         isapnp_unregister_driver(&fcpnp_driver);
9121  #endif
9122 @@ -994,11 +999,15 @@
9123         return retval;
9124  }
9125  
9126 -static void __exit hisax_fcpcipnp_exit(void)
9127 +static void __exit hisax_fcpci_exit(void)
9128  {
9129         isapnp_unregister_driver(&fcpnp_driver);
9130         pci_unregister_driver(&fcpci_driver);
9131  }
9132  
9133 -module_init(hisax_fcpcipnp_init);
9134 -module_exit(hisax_fcpcipnp_exit);
9135 +module_init(hisax_fcpci_init);
9136 +module_exit(hisax_fcpci_exit);
9137 +
9138 +#ifdef __ISAPNP__
9139 +#include "hisax_isapnp.c"
9140 +#endif
9141 Index: linux-2.4.35.4/drivers/isdn/hisax/hisax_fcpcipnp.h
9142 ===================================================================
9143 --- linux-2.4.35.4.orig/drivers/isdn/hisax/hisax_fcpcipnp.h     2007-12-15 05:19:40.026702031 +0100
9144 +++ linux-2.4.35.4/drivers/isdn/hisax/hisax_fcpcipnp.h  2007-12-15 05:19:55.579588340 +0100
9145 @@ -43,10 +43,12 @@
9146  };
9147  
9148  struct fritz_adapter {
9149 +       struct list_head list;
9150 +       struct pci_dev *pci_dev;
9151 +
9152         int type;
9153         spinlock_t hw_lock;
9154         unsigned int io;
9155 -       unsigned int irq;
9156         struct isac isac;
9157  
9158         struct fritz_bcs bcs[2];
9159 Index: linux-2.4.35.4/drivers/isdn/hisax/hisax_isac.c
9160 ===================================================================
9161 --- linux-2.4.35.4.orig/drivers/isdn/hisax/hisax_isac.c 2007-12-15 05:19:40.034702487 +0100
9162 +++ linux-2.4.35.4/drivers/isdn/hisax/hisax_isac.c      2007-12-15 05:19:55.583588567 +0100
9163 @@ -34,7 +34,7 @@
9164  static int debug = 1;
9165  MODULE_PARM(debug, "i");
9166  
9167 -static char *ISACVer[] = {
9168 +static char *ISACVer[] __devinitdata = {
9169    "2086/2186 V1.1", 
9170    "2085 B1", 
9171    "2085 B2",
9172 @@ -42,10 +42,6 @@
9173  };
9174  #endif
9175  
9176 -MODULE_AUTHOR("Kai Germaschewski <kai.germaschewski@gmx.de>/Karsten Keil <kkeil@suse.de>");
9177 -MODULE_DESCRIPTION("ISAC/ISAC-SX driver");
9178 -MODULE_LICENSE("GPL");
9179 -
9180  #define DBG_WARN      0x0001
9181  #define DBG_IRQ       0x0002
9182  #define DBG_L1M       0x0004
9183 @@ -438,7 +434,7 @@
9184         va_end(args);
9185  }
9186  
9187 -static void isac_version(struct isac *cs)
9188 +static void __devinit isac_version(struct isac *cs)
9189  {
9190         int val;
9191  
9192 @@ -602,7 +598,7 @@
9193         }
9194  }
9195  
9196 -void isac_irq(struct isac *isac)
9197 +void isac_interrupt(struct isac *isac)
9198  {
9199         unsigned char val;
9200  
9201 @@ -635,8 +631,6 @@
9202         if (val & ISAC_ISTA_SIN) {
9203                 DBG(DBG_WARN, "SIN");
9204         }
9205 -       isac->write_isac(isac, ISAC_MASK, 0xff);
9206 -       isac->write_isac(isac, ISAC_MASK, 0x00);
9207  }
9208  
9209  // ======================================================================
9210 @@ -742,7 +736,7 @@
9211         }
9212  }
9213  
9214 -void isacsx_irq(struct isac *isac)
9215 +void isacsx_interrupt(struct isac *isac)
9216  {
9217         unsigned char val;
9218  
9219 @@ -755,7 +749,7 @@
9220                 isacsx_cic_interrupt(isac);
9221  }
9222  
9223 -void isac_init(struct isac *isac)
9224 +void __devinit isac_init(struct isac *isac)
9225  {
9226         isac->tx_skb = NULL;
9227         isac->l1m.fsm = &l1fsm;
9228 @@ -770,7 +764,7 @@
9229         FsmInitTimer(&isac->l1m, &isac->timer);
9230  }
9231  
9232 -void isac_setup(struct isac *isac)
9233 +void __devinit isac_setup(struct isac *isac)
9234  {
9235         int val, eval;
9236  
9237 @@ -781,7 +775,7 @@
9238  
9239         isac->write_isac(isac, ISAC_MASK, 0xff);
9240         isac->mocr = 0xaa;
9241 -       if (test_bit(ISAC_IOM1, &isac->flags)) {
9242 +       if (test_bit(HW_IOM1, &isac->flags)) {
9243                 /* IOM 1 Mode */
9244                 isac->write_isac(isac, ISAC_ADF2, 0x0);
9245                 isac->write_isac(isac, ISAC_SPCR, 0xa);
9246 @@ -817,7 +811,7 @@
9247         FsmEvent(&isac->l1m, (val >> 2) & 0xf, NULL);
9248  
9249         isac->write_isac(isac, ISAC_MASK, 0x0);
9250 -       // RESET Receiver and Transmitter
9251 +       /* RESET Receiver and Transmitter */
9252         isac->write_isac(isac, ISAC_CMDR, ISAC_CMDR_XRES | ISAC_CMDR_RRES);
9253  }
9254  
9255 @@ -888,10 +882,10 @@
9256  EXPORT_SYMBOL(isac_d_l2l1);
9257  
9258  EXPORT_SYMBOL(isacsx_setup);
9259 -EXPORT_SYMBOL(isacsx_irq);
9260 +EXPORT_SYMBOL(isacsx_interrupt);
9261  
9262  EXPORT_SYMBOL(isac_setup);
9263 -EXPORT_SYMBOL(isac_irq);
9264 +EXPORT_SYMBOL(isac_interrupt);
9265  
9266  module_init(hisax_isac_init);
9267  module_exit(hisax_isac_exit);
9268 Index: linux-2.4.35.4/drivers/isdn/hisax/hisax_isac.h
9269 ===================================================================
9270 --- linux-2.4.35.4.orig/drivers/isdn/hisax/hisax_isac.h 2007-12-15 05:19:40.042702942 +0100
9271 +++ linux-2.4.35.4/drivers/isdn/hisax/hisax_isac.h      2007-12-15 05:19:55.583588567 +0100
9272 @@ -8,7 +8,7 @@
9273  #define TIMER3_VALUE 7000
9274  #define MAX_DFRAME_LEN_L1 300
9275  
9276 -#define ISAC_IOM1      0
9277 +#define HW_IOM1        0
9278  
9279  struct isac {
9280         void *priv;
9281 @@ -37,9 +37,9 @@
9282  void isac_d_l2l1(struct hisax_if *hisax_d_if, int pr, void *arg);
9283  
9284  void isac_setup(struct isac *isac);
9285 -void isac_irq(struct isac *isac);
9286 +void isac_interrupt(struct isac *isac);
9287  
9288  void isacsx_setup(struct isac *isac);
9289 -void isacsx_irq(struct isac *isac);
9290 +void isacsx_interrupt(struct isac *isac);
9291  
9292  #endif
9293 Index: linux-2.4.35.4/drivers/isdn/hisax/hisax_isapnp.c
9294 ===================================================================
9295 --- /dev/null   1970-01-01 00:00:00.000000000 +0000
9296 +++ linux-2.4.35.4/drivers/isdn/hisax/hisax_isapnp.c    2007-12-15 05:19:55.583588567 +0100
9297 @@ -0,0 +1,105 @@
9298 +// FIXME copied
9299 +static const struct isapnp_device_id *
9300 +isapnp_match_device(const struct isapnp_device_id *ids, struct pci_dev *dev)
9301 +{
9302 +       DBG(1,"");
9303 +
9304 +       while (ids->card_vendor || ids->card_device) {
9305 +               if ((ids->card_vendor == ISAPNP_ANY_ID || ids->card_vendor == dev->bus->vendor) &&
9306 +                   (ids->card_device == ISAPNP_ANY_ID || ids->card_device == dev->bus->device) &&
9307 +                    (ids->vendor == ISAPNP_ANY_ID || ids->vendor == dev->vendor) &&
9308 +                    (ids->function == ISAPNP_ANY_ID || ids->function == dev->device))
9309 +                       return ids;
9310 +               ids++;
9311 +       }
9312 +       return NULL;
9313 +}
9314 +
9315 +/**
9316 + * pci_dev_driver - get the pci_driver of a device
9317 + * @dev: the device to query
9318 + *
9319 + * Returns the appropriate pci_driver structure or %NULL if there is no 
9320 + * registered driver for the device.
9321 + */
9322 +struct pci_driver *isapnp_dev_driver(const struct pci_dev *dev)
9323 +{
9324 +       return dev->driver;
9325 +}
9326 +
9327 +static int isapnp_announce_device(struct isapnp_driver *drv, struct pci_dev *dev)
9328 +{
9329 +       const struct isapnp_device_id *id;
9330 +       int ret = 0;
9331 +
9332 +       DBG(1,"");
9333 +
9334 +       if (drv->id_table) {
9335 +               id = isapnp_match_device(drv->id_table, dev);
9336 +               if (!id) {
9337 +                       ret = 0;
9338 +                       goto out;
9339 +               }
9340 +       } else
9341 +               id = NULL;
9342 +
9343 +//     dev_probe_lock();
9344 +       if (drv->probe(dev, id) >= 0) {
9345 +               dev->driver = (struct pci_driver *) drv;
9346 +               ret = 1;
9347 +       }
9348 +//     dev_probe_unlock();
9349 +out:
9350 +       return ret;
9351 +}
9352 +
9353 +/**
9354 + * FIXME pci_register_driver - register a new pci driver
9355 + * @drv: the driver structure to register
9356 + * 
9357 + * Adds the driver structure to the list of registered drivers
9358 + * Returns the number of pci devices which were claimed by the driver
9359 + * during registration.  The driver remains registered even if the
9360 + * return value is zero.
9361 + */
9362 +int isapnp_register_driver(struct isapnp_driver *drv)
9363 +{
9364 +       struct pci_dev *dev;
9365 +       int count = 0;
9366 +
9367 +       DBG(1,"");
9368 +
9369 +       list_add_tail(&drv->node, &isapnp_drivers);
9370 +       isapnp_for_each_dev(dev) {
9371 +               if (!isapnp_dev_driver(dev))
9372 +                       count += isapnp_announce_device(drv, dev);
9373 +       }
9374 +       return count;
9375 +}
9376 +
9377 +/**
9378 + * pci_unregister_driver - unregister a pci driver
9379 + * @drv: the driver structure to unregister
9380 + * 
9381 + * Deletes the driver structure from the list of registered PCI drivers,
9382 + * gives it a chance to clean up by calling its remove() function for
9383 + * each device it was responsible for, and marks those devices as
9384 + * driverless.
9385 + */
9386 +
9387 +void isapnp_unregister_driver(struct isapnp_driver *drv)
9388 +{
9389 +       struct pci_dev *dev;
9390 +
9391 +       DBG(1,"");
9392 +
9393 +       list_del(&drv->node);
9394 +       isapnp_for_each_dev(dev) {
9395 +               if (dev->driver == (struct pci_driver *) drv) {
9396 +                       if (drv->remove)
9397 +                               drv->remove(dev);
9398 +                       dev->driver = NULL;
9399 +               }
9400 +       }
9401 +}
9402 +
9403 Index: linux-2.4.35.4/drivers/isdn/hisax/hisax_isapnp.h
9404 ===================================================================
9405 --- /dev/null   1970-01-01 00:00:00.000000000 +0000
9406 +++ linux-2.4.35.4/drivers/isdn/hisax/hisax_isapnp.h    2007-12-15 05:19:55.583588567 +0100
9407 @@ -0,0 +1,33 @@
9408 +#ifndef __HISAX_ISAPNP_H__
9409 +#define __HISAX_ISAPNP_H__
9410 +
9411 +#include <linux/isapnp.h>
9412 +
9413 +#ifdef COMPAT_NEED_ISAPNP_DRIVER
9414 +struct isapnp_driver {
9415 +       struct list_head node;
9416 +       char *name;
9417 +       const struct isapnp_device_id *id_table;        /* NULL if wants all devices */
9418 +       int  (*probe)  (struct pci_dev *dev, const struct isapnp_device_id *id);        /* New device inserted */
9419 +       void (*remove) (struct pci_dev *dev);   /* Device removed (NULL if not a hot-plug capable driver) */
9420 +};
9421 +#endif
9422 +#ifdef __ISAPNP__
9423 +
9424 +int isapnp_register_driver(struct isapnp_driver *drv);
9425 +void isapnp_unregister_driver(struct isapnp_driver *drv);
9426 +
9427 +#else
9428 +
9429 +static inline int isapnp_register_driver(struct isapnp_driver *drv) 
9430 +{ 
9431 +       return 0;
9432 +}
9433 +
9434 +static inline void isapnp_unregister_driver(struct isapnp_driver *drv) 
9435 +{ 
9436 +}
9437 +
9438 +#endif
9439 +
9440 +#endif
9441 Index: linux-2.4.35.4/drivers/isdn/hisax/hisax_loadable.h
9442 ===================================================================
9443 --- /dev/null   1970-01-01 00:00:00.000000000 +0000
9444 +++ linux-2.4.35.4/drivers/isdn/hisax/hisax_loadable.h  2007-12-15 05:19:55.583588567 +0100
9445 @@ -0,0 +1,74 @@
9446 +/* $Id: hisax_loadable.h,v 2.1 2001/06/08 22:19:16 werner Exp $
9447 + *
9448 + *
9449 + * Author       (C) 2001 Werner Cornelius (werner@isdn-development.de)
9450 + *              modular driver for Colognechip HFC-USB chip
9451 + *              as plugin for HiSax isdn driver
9452 + *
9453 + * Copyright 2001  by Werner Cornelius (werner@isdn4linux.de)
9454 + *
9455 + * This program is free software; you can redistribute it and/or modify
9456 + * it under the terms of the GNU General Public License as published by
9457 + * the Free Software Foundation; either version 2, or (at your option)
9458 + * any later version.
9459 + *
9460 + * This program is distributed in the hope that it will be useful,
9461 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
9462 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
9463 + * GNU General Public License for more details.
9464 + *
9465 + * You should have received a copy of the GNU General Public License
9466 + * along with this program; if not, write to the Free Software
9467 + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
9468 + *
9469 + */
9470 +
9471 +#include <linux/types.h>
9472 +#include <linux/skbuff.h>
9473 +
9474 +/***************************************/
9475 +/* additional defines for l1 constants */
9476 +/***************************************/
9477 +#define B1_DATA       0x1f0
9478 +#define B1_SETMODE    0x1f4
9479 +#define B2_DATA       0x1f8
9480 +#define B2_SETMODE    0x1fc
9481 +
9482 +
9483 +/********************************************************/
9484 +/* structure used for register and release of L1 driver */
9485 +/********************************************************/
9486 +struct hisax_drvreg {
9487 +       int version;            /* actual version for check */
9488 +       int cmd;                /* command code */
9489 +
9490 +       /* function pointers set by hisax during register call */
9491 +       void (*release_driver) (void *arg_hisax);       /* set by hisax, release function for driver */
9492 +       void (*dch_l1l2) (void *arg_hisax, int pr, void *arg);  /* set by hisax, notify dch+l1 events */
9493 +       void (*bch_l1l2) (void *arg_hisax, int chan, int pr, void *arg);        /* set by hisax, notify bch events */
9494 +       void *arg_hisax;        /* argument when calling hisax main */
9495 +       struct sk_buff_head *drq;       /* pointer to D-receive queue */
9496 +       struct sk_buff_head *dsq;       /* pointer to D-send queue */
9497 +       struct sk_buff_head erq;        /* E-receive queue */
9498 +       struct sk_buff_head *brq[2];    /* pointer to B-receive queues */
9499 +       struct sk_buff **bsk[2];        /* pointer to B-transmit buffer */
9500 +
9501 +       /* function pointers set by l1 driver before calling the register function */
9502 +       void (*dch_l2l1) (void *argl1, int pr, void *arg);      /* function dch+l1 from hisax -> l1 */
9503 +       void (*bch_l2l1) (void *argl1, int chan, int pr, void *arg);    /* function bch from hisax -> l1 */
9504 +       void *argl1;            /* pointer to l1 data structure when calling l1 */
9505 +
9506 +       char *drvname;          /* driver name for hisax usage */
9507 +};
9508 +
9509 +/**************************/
9510 +/* constants and commands */
9511 +/**************************/
9512 +#define HISAX_LOAD_VERSION  4  /* change when interface changes */
9513 +#define HISAX_LOAD_CHKVER   0  /* check version command (returns 0 on success) */
9514 +#define HISAX_LOAD_REGISTER 1  /* register the L1 driver and return 0 on success */
9515 +
9516 +/***************************************/
9517 +/* definition of the register function */
9518 +/***************************************/
9519 +extern int hisax_register_hfcusb(struct hisax_drvreg *l1drv);
9520 Index: linux-2.4.35.4/drivers/isdn/hisax/hscx.c
9521 ===================================================================
9522 --- linux-2.4.35.4.orig/drivers/isdn/hisax/hscx.c       2007-12-15 05:19:40.066704311 +0100
9523 +++ linux-2.4.35.4/drivers/isdn/hisax/hscx.c    2007-12-15 05:19:55.583588567 +0100
9524 @@ -1,4 +1,4 @@
9525 -/* $Id: hscx.c,v 1.1.4.1 2001/11/20 14:19:36 kai Exp $
9526 +/* $Id: hscx.c,v 1.24 2001/09/24 13:22:56 kai Exp $
9527   *
9528   * HSCX specific routines
9529   *
9530 Index: linux-2.4.35.4/drivers/isdn/hisax/hscx.h
9531 ===================================================================
9532 --- linux-2.4.35.4.orig/drivers/isdn/hisax/hscx.h       2007-12-15 05:19:40.070704537 +0100
9533 +++ linux-2.4.35.4/drivers/isdn/hisax/hscx.h    2007-12-15 05:19:55.587588793 +0100
9534 @@ -1,4 +1,4 @@
9535 -/* $Id: hscx.h,v 1.1.4.1 2001/11/20 14:19:36 kai Exp $
9536 +/* $Id: hscx.h,v 1.8 2001/09/24 13:22:56 kai Exp $
9537   *
9538   * HSCX specific defines
9539   *
9540 Index: linux-2.4.35.4/drivers/isdn/hisax/hscx_irq.c
9541 ===================================================================
9542 --- linux-2.4.35.4.orig/drivers/isdn/hisax/hscx_irq.c   2007-12-15 05:19:40.078704992 +0100
9543 +++ linux-2.4.35.4/drivers/isdn/hisax/hscx_irq.c        2007-12-15 05:19:55.587588793 +0100
9544 @@ -1,4 +1,4 @@
9545 -/* $Id: hscx_irq.c,v 1.1.4.1 2001/11/20 14:19:36 kai Exp $
9546 +/* $Id: hscx_irq.c,v 1.18 2001/09/24 13:22:56 kai Exp $
9547   *
9548   * low level b-channel stuff for Siemens HSCX
9549   *
9550 Index: linux-2.4.35.4/drivers/isdn/hisax/icc.c
9551 ===================================================================
9552 --- linux-2.4.35.4.orig/drivers/isdn/hisax/icc.c        2007-12-15 05:19:40.086705450 +0100
9553 +++ linux-2.4.35.4/drivers/isdn/hisax/icc.c     2007-12-15 05:19:55.587588793 +0100
9554 @@ -1,4 +1,4 @@
9555 -/* $Id: icc.c,v 1.1.4.1 2001/11/20 14:19:36 kai Exp $
9556 +/* $Id: icc.c,v 1.8 2001/09/24 13:22:56 kai Exp $
9557   *
9558   * ICC specific routines
9559   *
9560 Index: linux-2.4.35.4/drivers/isdn/hisax/icc.h
9561 ===================================================================
9562 --- linux-2.4.35.4.orig/drivers/isdn/hisax/icc.h        2007-12-15 05:19:40.094705906 +0100
9563 +++ linux-2.4.35.4/drivers/isdn/hisax/icc.h     2007-12-15 05:19:55.587588793 +0100
9564 @@ -1,4 +1,4 @@
9565 -/* $Id: icc.h,v 1.1.4.1 2001/11/20 14:19:36 kai Exp $
9566 +/* $Id: icc.h,v 1.4 2001/09/24 13:22:56 kai Exp $
9567   *
9568   * ICC specific routines
9569   *
9570 Index: linux-2.4.35.4/drivers/isdn/hisax/ipac.h
9571 ===================================================================
9572 --- linux-2.4.35.4.orig/drivers/isdn/hisax/ipac.h       2007-12-15 05:19:40.098706132 +0100
9573 +++ linux-2.4.35.4/drivers/isdn/hisax/ipac.h    2007-12-15 05:19:55.587588793 +0100
9574 @@ -1,4 +1,4 @@
9575 -/* $Id: ipac.h,v 1.1.4.1 2001/11/20 14:19:36 kai Exp $
9576 +/* $Id: ipac.h,v 1.7 2001/09/24 13:22:56 kai Exp $
9577   *
9578   * IPAC specific defines
9579   *
9580 Index: linux-2.4.35.4/drivers/isdn/hisax/isac.c
9581 ===================================================================
9582 --- linux-2.4.35.4.orig/drivers/isdn/hisax/isac.c       2007-12-15 05:19:40.106706590 +0100
9583 +++ linux-2.4.35.4/drivers/isdn/hisax/isac.c    2007-12-15 05:19:55.591589021 +0100
9584 @@ -1,4 +1,4 @@
9585 -/* $Id: isac.c,v 1.1.4.1 2001/11/20 14:19:36 kai Exp $
9586 +/* $Id: isac.c,v 1.31 2001/09/24 13:22:56 kai Exp $
9587   *
9588   * ISAC specific routines
9589   *
9590 Index: linux-2.4.35.4/drivers/isdn/hisax/isac.h
9591 ===================================================================
9592 --- linux-2.4.35.4.orig/drivers/isdn/hisax/isac.h       2007-12-15 05:19:40.118707272 +0100
9593 +++ linux-2.4.35.4/drivers/isdn/hisax/isac.h    2007-12-15 05:19:55.591589021 +0100
9594 @@ -1,4 +1,4 @@
9595 -/* $Id: isac.h,v 1.1.4.1 2001/11/20 14:19:36 kai Exp $
9596 +/* $Id: isac.h,v 1.9 2001/09/24 13:22:56 kai Exp $
9597   *
9598   * ISAC specific defines
9599   *
9600 Index: linux-2.4.35.4/drivers/isdn/hisax/isar.c
9601 ===================================================================
9602 --- linux-2.4.35.4.orig/drivers/isdn/hisax/isar.c       2007-12-15 05:19:40.130707956 +0100
9603 +++ linux-2.4.35.4/drivers/isdn/hisax/isar.c    2007-12-15 05:19:55.595589250 +0100
9604 @@ -1,4 +1,4 @@
9605 -/* $Id: isar.c,v 1.1.4.1 2001/11/20 14:19:36 kai Exp $
9606 +/* $Id: isar.c,v 1.22 2001/09/23 12:00:05 keil Exp $
9607   *
9608   * isar.c   ISAR (Siemens PSB 7110) specific routines
9609   *
9610 @@ -21,12 +21,10 @@
9611  #define DLE    0x10
9612  #define ETX    0x03
9613  
9614 -#define FAXMODCNT      13
9615 -const  u_char  faxmodulation[] = {3,24,48,72,73,74,96,97,98,121,122,145,146};
9616 -static u_int   modmask = 0x1fff;
9617 -static int     frm_extra_delay = 2;
9618 -static int     para_TOA = 6;
9619 -const   u_char  *FC1_CMD[] = {"FAE", "FTS", "FRS", "FTM", "FRM", "FTH", "FRH", "CTRL" };
9620 +
9621 +const u_char faxmodulation_s[] = "3,24,48,72,73,74,96,97,98,121,122,145,146"; 
9622 +const u_char faxmodulation[] = {3,24,48,72,73,74,96,97,98,121,122,145,146}; 
9623 +#define FAXMODCNT 13
9624  
9625  void isar_setup(struct IsdnCardState *cs);
9626  static void isar_pump_cmd(struct BCState *bcs, u_char cmd, u_char para);
9627 @@ -127,7 +125,7 @@
9628         ireg->clsb = cs->BC_Read_Reg(cs, 1, ISAR_CTRL_L);
9629  #if DUMP_MBOXFRAME
9630         if (cs->debug & L1_DEB_HSCX)
9631 -               debugl1(cs, "irq_stat(%02x,%02x,%d)", ireg->iis, ireg->cmsb,
9632 +               debugl1(cs, "rcv_mbox(%02x,%02x,%d)", ireg->iis, ireg->cmsb,
9633                         ireg->clsb);
9634  #endif
9635  }
9636 @@ -414,7 +412,6 @@
9637         }
9638         cs->debug = debug;
9639         isar_setup(cs);
9640 -
9641         ret = 0;
9642  reterrflg:
9643         restore_flags(flags);
9644 @@ -428,21 +425,6 @@
9645         return(ret);
9646  }
9647  
9648 -static inline void
9649 -ll_deliver_faxstat(struct BCState *bcs, u_char status)
9650 -{
9651 -        isdn_ctrl ic;
9652 -       struct Channel *chanp = (struct Channel *) bcs->st->lli.userdata;
9653
9654 -       if (bcs->cs->debug & L1_DEB_HSCX)
9655 -               debugl1(bcs->cs, "HL->LL FAXIND %x", status);
9656 -       ic.driver = bcs->cs->myid;
9657 -       ic.command = ISDN_STAT_FAXIND;
9658 -       ic.arg = chanp->chan;
9659 -       ic.parm.aux.cmd = status;
9660 -       bcs->cs->iif.statcallb(&ic);
9661 -}
9662 -
9663  extern void BChannel_bh(struct BCState *);
9664  #define B_LL_NOCARRIER 8
9665  #define B_LL_CONNECT   9
9666 @@ -599,6 +581,7 @@
9667                                 if (ireg->cmsb & SART_NMD) { /* ABORT */
9668                                         if (cs->debug & L1_DEB_WARN)
9669                                                 debugl1(cs, "isar_rcv_frame: no more data");
9670 +                                       cs->BC_Write_Reg(cs, 1, ISAR_IIA, 0);
9671                                         bcs->hw.isar.rcvidx = 0;
9672                                         send_DLE_ETX(bcs);
9673                                         sendmsg(cs, SET_DPS(bcs->hw.isar.dpath) |
9674 @@ -609,6 +592,7 @@
9675                                 }
9676                         } else {
9677                                 printk(KERN_WARNING "HiSax: skb out of memory\n");
9678 +                               cs->BC_Write_Reg(cs, 1, ISAR_IIA, 0);
9679                         }
9680                         break;
9681                 }
9682 @@ -633,9 +617,8 @@
9683                         bcs->hw.isar.rcvidx = 0;
9684                         cs->BC_Write_Reg(cs, 1, ISAR_IIA, 0);
9685                 } else {
9686 -                       if (ireg->cmsb & HDLC_FSD) {
9687 +                       if (ireg->cmsb & HDLC_FSD)
9688                                 bcs->hw.isar.rcvidx = 0;
9689 -                       }
9690                         ptr = bcs->hw.isar.rcvbuf + bcs->hw.isar.rcvidx;
9691                         bcs->hw.isar.rcvidx += ireg->clsb;
9692                         rcv_mbox(cs, ireg, ptr);
9693 @@ -646,8 +629,6 @@
9694                                         if (cs->debug & L1_DEB_WARN)
9695                                                 debugl1(cs, "isar frame to short %d",
9696                                                         bcs->hw.isar.rcvidx);
9697 -                                       printk(KERN_WARNING "ISAR: frame to short %d\n",
9698 -                                               bcs->hw.isar.rcvidx);
9699                                 } else if (!(skb = dev_alloc_skb(bcs->hw.isar.rcvidx))) {
9700                                         printk(KERN_WARNING "ISAR: receive out of memory\n");
9701                                 } else {
9702 @@ -658,7 +639,6 @@
9703                                         isar_sched_event(bcs, B_RCVBUFREADY);
9704                                         send_DLE_ETX(bcs);
9705                                         isar_sched_event(bcs, B_LL_OK);
9706 -                                       test_and_clear_bit(BC_FLG_FRH_WAIT, &bcs->Flag);
9707                                 }
9708                                 bcs->hw.isar.rcvidx = 0;
9709                         }
9710 @@ -666,14 +646,13 @@
9711                 if (ireg->cmsb & SART_NMD) { /* ABORT */
9712                         if (cs->debug & L1_DEB_WARN)
9713                                 debugl1(cs, "isar_rcv_frame: no more data");
9714 +                       cs->BC_Write_Reg(cs, 1, ISAR_IIA, 0);
9715                         bcs->hw.isar.rcvidx = 0;
9716 +                       send_DLE_ETX(bcs);
9717                         sendmsg(cs, SET_DPS(bcs->hw.isar.dpath) |
9718                                 ISAR_HIS_PUMPCTRL, PCTRL_CMD_ESC, 0, NULL);
9719                         bcs->hw.isar.state = STFAX_ESCAPE;
9720 -                       if (test_and_clear_bit(BC_FLG_FRH_WAIT, &bcs->Flag)) {
9721 -                               send_DLE_ETX(bcs);
9722 -                               isar_sched_event(bcs, B_LL_NOCARRIER);
9723 -                       }
9724 +                       isar_sched_event(bcs, B_LL_NOCARRIER);
9725                 }
9726                 break;
9727         default:
9728 @@ -977,6 +956,21 @@
9729         }
9730  }
9731  
9732 +static inline void
9733 +ll_deliver_faxstat(struct BCState *bcs, u_char status)
9734 +{
9735 +        isdn_ctrl ic;
9736 +       struct Channel *chanp = (struct Channel *) bcs->st->lli.userdata;
9737
9738 +       if (bcs->cs->debug & L1_DEB_HSCX)
9739 +               debugl1(bcs->cs, "HL->LL FAXIND %x", status);
9740 +       ic.driver = bcs->cs->myid;
9741 +       ic.command = ISDN_STAT_FAXIND;
9742 +       ic.arg = chanp->chan;
9743 +       ic.parm.aux.cmd = status;
9744 +       bcs->cs->iif.statcallb(&ic);
9745 +}
9746 +
9747  static void
9748  isar_pump_statev_fax(struct BCState *bcs, u_char devt) {
9749         struct IsdnCardState *cs = bcs->cs;
9750 @@ -1081,22 +1075,19 @@
9751                         if (cs->debug & L1_DEB_HSCX)
9752                                 debugl1(cs, "pump stev RSP_DISC");
9753                         if (bcs->hw.isar.state == STFAX_ESCAPE) {
9754 -                               p1 = 5;
9755                                 switch(bcs->hw.isar.newcmd) {
9756                                         case 0:
9757                                                 bcs->hw.isar.state = STFAX_READY;
9758                                                 break;
9759 -                                       case PCTRL_CMD_FTM:
9760 -                                               p1 = 2;
9761                                         case PCTRL_CMD_FTH:
9762 +                                       case PCTRL_CMD_FTM:
9763 +                                               p1 = 10;
9764                                                 sendmsg(cs, dps | ISAR_HIS_PUMPCTRL,
9765                                                         PCTRL_CMD_SILON, 1, &p1);
9766                                                 bcs->hw.isar.state = STFAX_SILDET;
9767                                                 break;
9768 -                                       case PCTRL_CMD_FRM:
9769 -                                               if (frm_extra_delay)
9770 -                                                       mdelay(frm_extra_delay);
9771                                         case PCTRL_CMD_FRH:
9772 +                                       case PCTRL_CMD_FRM:
9773                                                 p1 = bcs->hw.isar.mod = bcs->hw.isar.newmod;
9774                                                 bcs->hw.isar.newmod = 0;
9775                                                 bcs->hw.isar.cmd = bcs->hw.isar.newcmd;
9776 @@ -1215,9 +1206,6 @@
9777                                         isar_pump_statev_modem(bcs, ireg->cmsb);
9778                                 } else if (bcs->mode == L1_MODE_FAX) {
9779                                         isar_pump_statev_fax(bcs, ireg->cmsb);
9780 -                               } else if (ireg->cmsb == PSEV_10MS_TIMER) {
9781 -                                       if (cs->debug & L1_DEB_HSCX)
9782 -                                               debugl1(cs, "pump stev TIMER");
9783                                 } else {
9784                                         if (cs->debug & L1_DEB_WARN)
9785                                                 debugl1(cs, "isar IIS_PSTEV pmode %d stat %x",
9786 @@ -1278,9 +1266,6 @@
9787         if (test_and_clear_bit(BC_FLG_LL_CONN, &bcs->Flag)) {
9788                 isar_sched_event(bcs, B_LL_CONNECT);
9789         }
9790 -       if (test_and_clear_bit(BC_FLG_FTI_FTS, &bcs->Flag)) {
9791 -               isar_sched_event(bcs, B_LL_OK);
9792 -       }
9793  }
9794  
9795  static void
9796 @@ -1303,7 +1288,7 @@
9797                         } else {
9798                                 param[5] = PV32P6_ATN;
9799                         }
9800 -                       param[0] = para_TOA; /* 6 db */
9801 +                       param[0] = 6; /* 6 db */
9802                         param[1] = PV32P2_V23R | PV32P2_V22A | PV32P2_V22B |
9803                                    PV32P2_V22C | PV32P2_V21 | PV32P2_BEL; 
9804                         param[2] = PV32P3_AMOD | PV32P3_V32B | PV32P3_V23B;
9805 @@ -1319,7 +1304,7 @@
9806                         } else {
9807                                 param[1] = PFAXP2_ATN;
9808                         }
9809 -                       param[0] = para_TOA; /* 6 db */
9810 +                       param[0] = 6; /* 6 db */
9811                         sendmsg(cs, dps | ISAR_HIS_PUMPCFG, ctrl, 2, param);
9812                         bcs->hw.isar.state = STFAX_NULL;
9813                         bcs->hw.isar.newcmd = 0;
9814 @@ -1348,6 +1333,7 @@
9815                                 "\0\0");
9816                         break;
9817                 case L1_MODE_HDLC:
9818 +               case L1_MODE_FAX:
9819                         param[0] = 0;
9820                         sendmsg(cs, dps | ISAR_HIS_SARTCFG, SMODE_HDLC, 1,
9821                                 param);
9822 @@ -1359,9 +1345,6 @@
9823                         sendmsg(cs, dps | ISAR_HIS_SARTCFG, ctrl, 2,
9824                                 param);
9825                         break;
9826 -               case L1_MODE_FAX:
9827 -                       /* SART must not configured with FAX */
9828 -                       break;
9829         }
9830         udelay(1000);
9831         sendmsg(cs, dps | ISAR_HIS_BSTREQ, 0, 0, NULL);
9832 @@ -1465,7 +1448,6 @@
9833  
9834         switch(cmd) {
9835                 case ISDN_FAX_CLASS1_FTM:
9836 -                       test_and_clear_bit(BC_FLG_FRH_WAIT, &bcs->Flag);
9837                         if (bcs->hw.isar.state == STFAX_READY) {
9838                                 p1 = para;
9839                                 ctrl = PCTRL_CMD_FTM;
9840 @@ -1489,7 +1471,6 @@
9841                         }
9842                         break;
9843                 case ISDN_FAX_CLASS1_FTH:
9844 -                       test_and_clear_bit(BC_FLG_FRH_WAIT, &bcs->Flag);
9845                         if (bcs->hw.isar.state == STFAX_READY) {
9846                                 p1 = para;
9847                                 ctrl = PCTRL_CMD_FTH;
9848 @@ -1513,7 +1494,6 @@
9849                         }
9850                         break;
9851                 case ISDN_FAX_CLASS1_FRM:
9852 -                       test_and_clear_bit(BC_FLG_FRH_WAIT, &bcs->Flag);
9853                         if (bcs->hw.isar.state == STFAX_READY) {
9854                                 p1 = para;
9855                                 ctrl = PCTRL_CMD_FRM;
9856 @@ -1537,7 +1517,6 @@
9857                         }
9858                         break;
9859                 case ISDN_FAX_CLASS1_FRH:
9860 -                       test_and_set_bit(BC_FLG_FRH_WAIT, &bcs->Flag);
9861                         if (bcs->hw.isar.state == STFAX_READY) {
9862                                 p1 = para;
9863                                 ctrl = PCTRL_CMD_FRH;
9864 @@ -1560,11 +1539,6 @@
9865                                 bcs->hw.isar.state = STFAX_ESCAPE; 
9866                         }
9867                         break;
9868 -               case ISDN_FAXPUMP_HALT:
9869 -                       bcs->hw.isar.state = STFAX_NULL;
9870 -                       nom = 0;
9871 -                       ctrl = PCTRL_CMD_HALT;
9872 -                       break;
9873         }
9874         if (ctrl)
9875                 sendmsg(cs, dps | ISAR_HIS_PUMPCTRL, ctrl, nom, &p1);
9876 @@ -1658,15 +1632,6 @@
9877                         l1_msg_b(st, pr, arg);
9878                         break;
9879                 case (PH_DEACTIVATE | CONFIRM):
9880 -                       switch(st->l1.mode) {
9881 -                               case L1_MODE_TRANS:
9882 -                               case L1_MODE_HDLC:
9883 -                               case L1_MODE_V32:
9884 -                                       break;
9885 -                               case L1_MODE_FAX:
9886 -                                       isar_pump_cmd(st->l1.bcs, ISDN_FAXPUMP_HALT, 0);
9887 -                                       break;
9888 -                       }
9889                         test_and_clear_bit(BC_FLG_ACTIV, &st->l1.bcs->Flag);
9890                         test_and_clear_bit(BC_FLG_BUSY, &st->l1.bcs->Flag);
9891                         if (st->l1.bcs->cs->debug & L1_DEB_HSCX)
9892 @@ -1758,51 +1723,6 @@
9893                                                 test_and_set_bit(BC_FLG_DLEETX,
9894                                                         &bcs->Flag);
9895                                         break;
9896 -                               case ISDN_FAX_CLASS1_FTS:
9897 -                                       if (ic->parm.aux.subcmd == AT_QUERY) {
9898 -                                               ic->command = ISDN_STAT_FAXIND;
9899 -                                               ic->parm.aux.cmd = ISDN_FAX_CLASS1_OK;
9900 -                                               cs->iif.statcallb(ic);
9901 -                                               return(0);
9902 -                                       } else if (ic->parm.aux.subcmd == AT_EQ_QUERY) {
9903 -                                               strcpy(ic->parm.aux.para, "0-255");
9904 -                                               ic->command = ISDN_STAT_FAXIND;
9905 -                                               ic->parm.aux.cmd = ISDN_FAX_CLASS1_QUERY;
9906 -                                               cs->iif.statcallb(ic);
9907 -                                               return(0);
9908 -                                       } else if (ic->parm.aux.subcmd == AT_EQ_VALUE) {
9909 -                                               if (cs->debug & L1_DEB_HSCX)
9910 -                                                       debugl1(cs, "isar_auxcmd %s=%d",
9911 -                                                               FC1_CMD[ic->parm.aux.cmd], ic->parm.aux.para[0]);
9912 -                                               if (bcs->hw.isar.state == STFAX_READY) {
9913 -                                                       if (! ic->parm.aux.para[0]) {
9914 -                                                               ic->command = ISDN_STAT_FAXIND;
9915 -                                                               ic->parm.aux.cmd = ISDN_FAX_CLASS1_OK;
9916 -                                                               cs->iif.statcallb(ic);
9917 -                                                               return(0);
9918 -                                                       }
9919 -                                                       if (! test_and_set_bit(BC_FLG_FTI_RUN, &bcs->Flag)) {
9920 -                                                               /* n*10 ms */
9921 -                                                               bcs->hw.isar.ftimer.expires =
9922 -                                                                       jiffies + ((ic->parm.aux.para[0] * 10 * HZ)/1000);
9923 -                                                               test_and_set_bit(BC_FLG_FTI_FTS, &bcs->Flag);
9924 -                                                               add_timer(&bcs->hw.isar.ftimer);
9925 -                                                               return(0);
9926 -                                                       } else {
9927 -                                                               if (cs->debug)
9928 -                                                                       debugl1(cs, "isar FTS=%d and FTI busy",
9929 -                                                                               ic->parm.aux.para[0]);
9930 -                                                       }
9931 -                                               } else {
9932 -                                                       if (cs->debug)
9933 -                                                               debugl1(cs, "isar FTS=%d and isar.state not ready(%x)",
9934 -                                                                       ic->parm.aux.para[0],bcs->hw.isar.state);
9935 -                                               }
9936 -                                               ic->command = ISDN_STAT_FAXIND;
9937 -                                               ic->parm.aux.cmd = ISDN_FAX_CLASS1_ERROR;
9938 -                                               cs->iif.statcallb(ic);
9939 -                                       }
9940 -                                       break;
9941                                 case ISDN_FAX_CLASS1_FRM:
9942                                 case ISDN_FAX_CLASS1_FRH:
9943                                 case ISDN_FAX_CLASS1_FTM:
9944 @@ -1815,24 +1735,16 @@
9945                                                 cs->iif.statcallb(ic);
9946                                                 return(0);
9947                                         } else if (ic->parm.aux.subcmd == AT_EQ_QUERY) {
9948 -                                               char *p = ic->parm.aux.para;
9949 -                                               for(i=0;i<FAXMODCNT;i++)
9950 -                                                       if ((1<<i) & modmask)
9951 -                                                               p += sprintf(p, "%d,", faxmodulation[i]);
9952 -                                               p--;
9953 -                                               *p=0;
9954 +                                               strcpy(ic->parm.aux.para, faxmodulation_s);
9955                                                 ic->command = ISDN_STAT_FAXIND;
9956                                                 ic->parm.aux.cmd = ISDN_FAX_CLASS1_QUERY;
9957                                                 cs->iif.statcallb(ic);
9958                                                 return(0);
9959                                         } else if (ic->parm.aux.subcmd == AT_EQ_VALUE) {
9960 -                                               if (cs->debug & L1_DEB_HSCX)
9961 -                                                       debugl1(cs, "isar_auxcmd %s=%d",
9962 -                                                               FC1_CMD[ic->parm.aux.cmd], ic->parm.aux.para[0]);
9963                                                 for(i=0;i<FAXMODCNT;i++)
9964                                                         if (faxmodulation[i]==ic->parm.aux.para[0])
9965                                                                 break;
9966 -                                               if ((i < FAXMODCNT) && ((1<<i) & modmask) && 
9967 +                                               if ((FAXMODCNT > i) && 
9968                                                         test_bit(BC_FLG_INIT, &bcs->Flag)) {
9969                                                         isar_pump_cmd(bcs,
9970                                                                 ic->parm.aux.cmd,
9971 @@ -1850,7 +1762,7 @@
9972                         break;
9973                 case (ISDN_CMD_IOCTL):
9974                         switch (ic->arg) {
9975 -                               case 9: /* load firmware */
9976 +                               case (9): /* load firmware */
9977                                         features = ISDN_FEATURE_L2_MODEM |
9978                                                 ISDN_FEATURE_L2_FAX |
9979                                                 ISDN_FEATURE_L3_FCLASS1;
9980 @@ -1860,26 +1772,6 @@
9981                                         else 
9982                                                 ll_run(cs, features);
9983                                         break;
9984 -                               case 20:
9985 -                                       features = *(unsigned int *) ic->parm.num;
9986 -                                       printk(KERN_DEBUG "HiSax: max modulation old(%04x) new(%04x)\n",
9987 -                                               modmask, features);
9988 -                                       modmask = features;
9989 -                                       break;
9990 -                               case 21:
9991 -                                       features = *(unsigned int *) ic->parm.num;
9992 -                                       printk(KERN_DEBUG "HiSax: FRM extra delay old(%d) new(%d) ms\n",
9993 -                                               frm_extra_delay, features);
9994 -                                       if (features >= 0)
9995 -                                               frm_extra_delay = features;
9996 -                                       break;
9997 -                               case 22:
9998 -                                       features = *(unsigned int *) ic->parm.num;
9999 -                                       printk(KERN_DEBUG "HiSax: TOA old(%d) new(%d) db\n",
10000 -                                               para_TOA, features);
10001 -                                       if (features >= 0 && features < 32)
10002 -                                               para_TOA = features;
10003 -                                       break;
10004                                 default:
10005                                         printk(KERN_DEBUG "HiSax: invalid ioctl %d\n",
10006                                                (int) ic->arg);
10007 Index: linux-2.4.35.4/drivers/isdn/hisax/isar.h
10008 ===================================================================
10009 --- linux-2.4.35.4.orig/drivers/isdn/hisax/isar.h       2007-12-15 05:19:40.138708412 +0100
10010 +++ linux-2.4.35.4/drivers/isdn/hisax/isar.h    2007-12-15 05:19:55.615590390 +0100
10011 @@ -1,4 +1,4 @@
10012 -/* $Id: isar.h,v 1.1.4.1 2001/11/20 14:19:36 kai Exp $
10013 +/* $Id: isar.h,v 1.11 2001/09/24 13:22:56 kai Exp $
10014   *
10015   * ISAR (Siemens PSB 7110) specific defines
10016   *
10017 @@ -28,8 +28,6 @@
10018  #define ISAR_HIS_FIRM          0x1e
10019  #define ISAR_HIS_STDSP         0x08
10020  #define ISAR_HIS_DIAG          0x05
10021 -#define ISAR_HIS_WAITSTATE     0x27
10022 -#define ISAR_HIS_TIMERIRQ      0x25
10023  #define ISAR_HIS_P0CFG         0x3c
10024  #define ISAR_HIS_P12CFG                0x24
10025  #define ISAR_HIS_SARTCFG       0x25    
10026 @@ -45,10 +43,6 @@
10027  #define ISAR_HIS_DPS2          0x80
10028  #define SET_DPS(x)             ((x<<6) & 0xc0)
10029  
10030 -#define ISAR_CMD_TIMERIRQ_OFF  0x20
10031 -#define ISAR_CMD_TIMERIRQ_ON   0x21
10032 -
10033 -
10034  #define ISAR_IIS_MSCMSD                0x3f
10035  #define ISAR_IIS_VNR           0x15
10036  #define ISAR_IIS_DKEY          0x03
10037 @@ -213,8 +207,6 @@
10038  #define STFAX_ESCAPE   5
10039  #define STFAX_SILDET   6
10040  
10041 -#define ISDN_FAXPUMP_HALT      100
10042 -
10043  extern int ISARVersion(struct IsdnCardState *cs, char *s);
10044  extern void isar_int_main(struct IsdnCardState *cs);
10045  extern void initisar(struct IsdnCardState *cs);
10046 Index: linux-2.4.35.4/drivers/isdn/hisax/isdnl1.c
10047 ===================================================================
10048 --- linux-2.4.35.4.orig/drivers/isdn/hisax/isdnl1.c     2007-12-15 05:19:40.150709096 +0100
10049 +++ linux-2.4.35.4/drivers/isdn/hisax/isdnl1.c  2007-12-15 05:19:55.615590390 +0100
10050 @@ -1,4 +1,4 @@
10051 -/* $Id: isdnl1.c,v 1.1.4.1 2001/11/20 14:19:36 kai Exp $
10052 +/* $Id: isdnl1.c,v 2.46 2001/09/24 13:22:56 kai Exp $
10053   *
10054   * common low level stuff for Siemens Chipsetbased isdn cards
10055   *
10056 @@ -18,7 +18,7 @@
10057   *
10058   */
10059  
10060 -const char *l1_revision = "$Revision: 1.1.4.1 $";
10061 +const char *l1_revision = "$Revision: 2.46 $";
10062  
10063  #define __NO_VERSION__
10064  #include <linux/init.h>
10065 Index: linux-2.4.35.4/drivers/isdn/hisax/isdnl1.h
10066 ===================================================================
10067 --- linux-2.4.35.4.orig/drivers/isdn/hisax/isdnl1.h     2007-12-15 05:19:40.154709325 +0100
10068 +++ linux-2.4.35.4/drivers/isdn/hisax/isdnl1.h  2007-12-15 05:19:55.619590620 +0100
10069 @@ -1,4 +1,4 @@
10070 -/* $Id: isdnl1.h,v 1.1.4.1 2001/11/20 14:19:36 kai Exp $
10071 +/* $Id: isdnl1.h,v 2.12 2001/09/24 13:22:56 kai Exp $
10072   *
10073   * Layer 1 defines
10074   *
10075 Index: linux-2.4.35.4/drivers/isdn/hisax/isdnl2.c
10076 ===================================================================
10077 --- linux-2.4.35.4.orig/drivers/isdn/hisax/isdnl2.c     2007-12-15 05:19:40.162709781 +0100
10078 +++ linux-2.4.35.4/drivers/isdn/hisax/isdnl2.c  2007-12-15 05:19:55.619590620 +0100
10079 @@ -1,4 +1,4 @@
10080 -/* $Id: isdnl2.c,v 1.1.4.1 2001/11/20 14:19:36 kai Exp $
10081 +/* $Id: isdnl2.c,v 2.30 2001/09/24 13:22:56 kai Exp $
10082   *
10083   * Author       Karsten Keil
10084   *              based on the teles driver from Jan den Ouden
10085 @@ -20,7 +20,7 @@
10086  #include "hisax.h"
10087  #include "isdnl2.h"
10088  
10089 -const char *l2_revision = "$Revision: 1.1.4.1 $";
10090 +const char *l2_revision = "$Revision: 2.30 $";
10091  
10092  static void l2m_debug(struct FsmInst *fi, char *fmt, ...);
10093  
10094 @@ -1418,8 +1418,8 @@
10095         freewin(st);
10096         st->l2.tei = -1;
10097         stop_t200(st, 17);
10098 -       st5_dl_release_l2l3(st);
10099         FsmChangeState(fi, ST_L2_1);
10100 +       st5_dl_release_l2l3(st);
10101  }
10102  
10103  static void
10104 Index: linux-2.4.35.4/drivers/isdn/hisax/isdnl2.h
10105 ===================================================================
10106 --- linux-2.4.35.4.orig/drivers/isdn/hisax/isdnl2.h     2007-12-15 05:19:40.170710236 +0100
10107 +++ linux-2.4.35.4/drivers/isdn/hisax/isdnl2.h  2007-12-15 05:19:55.619590620 +0100
10108 @@ -1,4 +1,4 @@
10109 -/* $Id: isdnl2.h,v 1.1.4.1 2001/11/20 14:19:36 kai Exp $
10110 +/* $Id$
10111   *
10112   * Layer 2 defines
10113   *
10114 Index: linux-2.4.35.4/drivers/isdn/hisax/isdnl3.c
10115 ===================================================================
10116 --- linux-2.4.35.4.orig/drivers/isdn/hisax/isdnl3.c     2007-12-15 05:19:40.178710691 +0100
10117 +++ linux-2.4.35.4/drivers/isdn/hisax/isdnl3.c  2007-12-15 05:19:55.619590620 +0100
10118 @@ -1,4 +1,4 @@
10119 -/* $Id: isdnl3.c,v 1.1.4.1 2001/11/20 14:19:36 kai Exp $
10120 +/* $Id: isdnl3.c,v 2.22 2001/09/24 13:22:56 kai Exp $
10121   *
10122   * Author       Karsten Keil
10123   *              based on the teles driver from Jan den Ouden
10124 @@ -21,7 +21,7 @@
10125  #include "isdnl3.h"
10126  #include <linux/config.h>
10127  
10128 -const char *l3_revision = "$Revision: 1.1.4.1 $";
10129 +const char *l3_revision = "$Revision: 2.22 $";
10130  
10131  static struct Fsm l3fsm;
10132  
10133 Index: linux-2.4.35.4/drivers/isdn/hisax/isdnl3.h
10134 ===================================================================
10135 --- linux-2.4.35.4.orig/drivers/isdn/hisax/isdnl3.h     2007-12-15 05:19:40.182710920 +0100
10136 +++ linux-2.4.35.4/drivers/isdn/hisax/isdnl3.h  2007-12-15 05:19:55.623590846 +0100
10137 @@ -1,4 +1,4 @@
10138 -/* $Id: isdnl3.h,v 1.1.4.1 2001/11/20 14:19:36 kai Exp $
10139 +/* $Id$
10140   *
10141   * This software may be used and distributed according to the terms
10142   * of the GNU General Public License, incorporated herein by reference.
10143 Index: linux-2.4.35.4/drivers/isdn/hisax/isurf.c
10144 ===================================================================
10145 --- linux-2.4.35.4.orig/drivers/isdn/hisax/isurf.c      2007-12-15 05:19:40.190711376 +0100
10146 +++ linux-2.4.35.4/drivers/isdn/hisax/isurf.c   2007-12-15 05:19:55.623590846 +0100
10147 @@ -1,4 +1,4 @@
10148 -/* $Id: isurf.c,v 1.1.4.1 2001/11/20 14:19:36 kai Exp $
10149 +/* $Id: isurf.c,v 1.12 2001/09/24 13:22:56 kai Exp $
10150   *
10151   * low level stuff for Siemens I-Surf/I-Talk cards
10152   *
10153 @@ -16,11 +16,10 @@
10154  #include "isac.h"
10155  #include "isar.h"
10156  #include "isdnl1.h"
10157 -#include <linux/isapnp.h>
10158  
10159  extern const char *CardType[];
10160  
10161 -static const char *ISurf_revision = "$Revision: 1.1.4.1 $";
10162 +static const char *ISurf_revision = "$Revision: 1.12 $";
10163  
10164  #define byteout(addr,val) outb(val,addr)
10165  #define bytein(addr) inb(addr)
10166 @@ -128,8 +127,10 @@
10167  release_io_isurf(struct IsdnCardState *cs)
10168  {
10169         release_region(cs->hw.isurf.reset, 1);
10170 +#ifdef COMPAT_HAS_ISA_IOREMAP
10171         iounmap((unsigned char *)cs->hw.isurf.isar);
10172         release_mem_region(cs->hw.isurf.phymem, ISURF_IOMEM_SIZE);
10173 +#endif
10174  }
10175  
10176  static void
10177 @@ -194,10 +195,6 @@
10178         return(isar_auxcmd(cs, ic));
10179  }
10180  
10181 -#ifdef __ISAPNP__
10182 -static struct pci_bus *pnp_surf __devinitdata = NULL;
10183 -#endif
10184 -
10185  int __init
10186  setup_isurf(struct IsdnCard *card)
10187  {
10188 @@ -215,58 +212,9 @@
10189                 cs->hw.isurf.phymem = card->para[2];
10190                 cs->irq = card->para[0];
10191         } else {
10192 -#ifdef __ISAPNP__
10193 -               struct pci_bus *pb;
10194 -               struct pci_dev *pd;
10195 -
10196 -               if (isapnp_present()) {
10197 -                       cs->subtyp = 0;
10198 -                       if ((pb = isapnp_find_card(
10199 -                               ISAPNP_VENDOR('S', 'I', 'E'),
10200 -                               ISAPNP_FUNCTION(0x0010), pnp_surf))) {
10201 -                               pnp_surf = pb;
10202 -                               pd = NULL;
10203 -                               if (!(pd = isapnp_find_dev(pnp_surf,
10204 -                                       ISAPNP_VENDOR('S', 'I', 'E'),
10205 -                                       ISAPNP_FUNCTION(0x0010), pd))) {
10206 -                                       printk(KERN_ERR "ISurfPnP: PnP error card found, no device\n");
10207 -                                       return (0);
10208 -                               }
10209 -                               pd->prepare(pd);
10210 -                               pd->deactivate(pd);
10211 -                               pd->activate(pd);
10212 -                               /* The ISA-PnP logic apparently
10213 -                                * expects upper limit address to be
10214 -                                * set. Since the isa-pnp module
10215 -                                * doesn't do this, so we have to make
10216 -                                * up for it.
10217 -                                */
10218 -                               isapnp_cfg_begin(pd->bus->number, pd->devfn);
10219 -                               isapnp_write_word(ISAPNP_CFG_MEM+3, 
10220 -                                       pd->resource[8].end >> 8);
10221 -                               isapnp_cfg_end();
10222 -                               cs->hw.isurf.reset = pd->resource[0].start;
10223 -                               cs->hw.isurf.phymem = pd->resource[8].start;
10224 -                               cs->irq = pd->irq_resource[0].start;
10225 -                               if (!cs->irq || !cs->hw.isurf.reset || !cs->hw.isurf.phymem) {
10226 -                                       printk(KERN_ERR "ISurfPnP:some resources are missing %d/%x/%lx\n",
10227 -                                               cs->irq, cs->hw.isurf.reset, cs->hw.isurf.phymem);
10228 -                                       pd->deactivate(pd);
10229 -                                       return(0);
10230 -                               }
10231 -                       } else {
10232 -                               printk(KERN_INFO "ISurfPnP: no ISAPnP card found\n");
10233 -                               return(0);
10234 -                       }
10235 -               } else {
10236 -                       printk(KERN_INFO "ISurfPnP: no ISAPnP bus found\n");
10237 -                       return(0);
10238 -               }
10239 -#else
10240                 printk(KERN_WARNING "HiSax: %s port/mem not set\n",
10241                         CardType[card->typ]);
10242                 return (0);
10243 -#endif
10244         }
10245         if (check_region(cs->hw.isurf.reset, 1)) {
10246                 printk(KERN_WARNING
10247 @@ -277,6 +225,7 @@
10248         } else {
10249                 request_region(cs->hw.isurf.reset, 1, "isurf isdn");
10250         }
10251 +#ifdef COMPAT_HAS_ISA_IOREMAP
10252         if (check_mem_region(cs->hw.isurf.phymem, ISURF_IOMEM_SIZE)) {
10253                 printk(KERN_WARNING
10254                         "HiSax: %s memory region %lx-%lx already in use\n",
10255 @@ -292,6 +241,10 @@
10256         cs->hw.isurf.isar =
10257                 (unsigned long) ioremap(cs->hw.isurf.phymem, ISURF_IOMEM_SIZE);
10258         cs->hw.isurf.isac = cs->hw.isurf.isar + ISURF_ISAC_OFFSET;
10259 +#else
10260 +       cs->hw.isurf.isar = cs->hw.isurf.phymem + ISURF_ISAR_OFFSET;
10261 +       cs->hw.isurf.isac = cs->hw.isurf.phymem + ISURF_ISAC_OFFSET;
10262 +#endif
10263         printk(KERN_INFO
10264                "ISurf: defined at 0x%x 0x%lx IRQ %d\n",
10265                cs->hw.isurf.reset,
10266 Index: linux-2.4.35.4/drivers/isdn/hisax/ix1_micro.c
10267 ===================================================================
10268 --- linux-2.4.35.4.orig/drivers/isdn/hisax/ix1_micro.c  2007-12-15 05:19:40.198711831 +0100
10269 +++ linux-2.4.35.4/drivers/isdn/hisax/ix1_micro.c       2007-12-15 05:19:55.623590846 +0100
10270 @@ -1,4 +1,4 @@
10271 -/* $Id: ix1_micro.c,v 1.1.4.1 2001/11/20 14:19:36 kai Exp $
10272 +/* $Id: ix1_micro.c,v 2.12 2001/09/24 13:22:56 kai Exp $
10273   *
10274   * low level stuff for ITK ix1-micro Rev.2 isdn cards
10275   * derived from the original file teles3.c from Karsten Keil
10276 @@ -19,14 +19,13 @@
10277  
10278  #define __NO_VERSION__
10279  #include <linux/init.h>
10280 -#include <linux/isapnp.h>
10281  #include "hisax.h"
10282  #include "isac.h"
10283  #include "hscx.h"
10284  #include "isdnl1.h"
10285  
10286  extern const char *CardType[];
10287 -const char *ix1_revision = "$Revision: 1.1.4.1 $";
10288 +const char *ix1_revision = "$Revision: 2.12 $";
10289  
10290  #define byteout(addr,val) outb(val,addr)
10291  #define bytein(addr) inb(addr)
10292 @@ -219,21 +218,6 @@
10293         return(0);
10294  }
10295  
10296 -#ifdef __ISAPNP__
10297 -static struct isapnp_device_id itk_ids[] __initdata = {
10298 -       { ISAPNP_VENDOR('I', 'T', 'K'), ISAPNP_FUNCTION(0x25),
10299 -         ISAPNP_VENDOR('I', 'T', 'K'), ISAPNP_FUNCTION(0x25), 
10300 -         (unsigned long) "ITK micro 2" },
10301 -       { ISAPNP_VENDOR('I', 'T', 'K'), ISAPNP_FUNCTION(0x29),
10302 -         ISAPNP_VENDOR('I', 'T', 'K'), ISAPNP_FUNCTION(0x29), 
10303 -         (unsigned long) "ITK micro 2." },
10304 -       { 0, }
10305 -};
10306 -
10307 -static struct isapnp_device_id *idev = &itk_ids[0];
10308 -static struct pci_bus *pnp_c __devinitdata = NULL;
10309 -#endif
10310 -
10311  
10312  int __init
10313  setup_ix1micro(struct IsdnCard *card)
10314 @@ -246,45 +230,6 @@
10315         if (cs->typ != ISDN_CTYPE_IX1MICROR2)
10316                 return (0);
10317  
10318 -#ifdef __ISAPNP__
10319 -       if (!card->para[1] && isapnp_present()) {
10320 -               struct pci_bus *pb;
10321 -               struct pci_dev *pd;
10322 -
10323 -               while(idev->card_vendor) {
10324 -                       if ((pb = isapnp_find_card(idev->card_vendor,
10325 -                               idev->card_device, pnp_c))) {
10326 -                               pnp_c = pb;
10327 -                               pd = NULL;
10328 -                               if ((pd = isapnp_find_dev(pnp_c,
10329 -                                       idev->vendor, idev->function, pd))) {
10330 -                                       printk(KERN_INFO "HiSax: %s detected\n",
10331 -                                               (char *)idev->driver_data);
10332 -                                       pd->prepare(pd);
10333 -                                       pd->deactivate(pd);
10334 -                                       pd->activate(pd);
10335 -                                       card->para[1] = pd->resource[0].start;
10336 -                                       card->para[0] = pd->irq_resource[0].start;
10337 -                                       if (!card->para[0] || !card->para[1]) {
10338 -                                               printk(KERN_ERR "ITK PnP:some resources are missing %ld/%lx\n",
10339 -                                               card->para[0], card->para[1]);
10340 -                                               pd->deactivate(pd);
10341 -                                               return(0);
10342 -                                       }
10343 -                                       break;
10344 -                               } else {
10345 -                                       printk(KERN_ERR "ITK PnP: PnP error card found, no device\n");
10346 -                               }
10347 -                       }
10348 -                       idev++;
10349 -                       pnp_c=NULL;
10350 -               } 
10351 -               if (!idev->card_vendor) {
10352 -                       printk(KERN_INFO "ITK PnP: no ISAPnP card found\n");
10353 -                       return(0);
10354 -               }
10355 -       }
10356 -#endif
10357         /* IO-Ports */
10358         cs->hw.ix1.isac_ale = card->para[1] + ISAC_COMMAND_OFFSET;
10359         cs->hw.ix1.hscx_ale = card->para[1] + HSCX_COMMAND_OFFSET;
10360 Index: linux-2.4.35.4/drivers/isdn/hisax/jade.c
10361 ===================================================================
10362 --- linux-2.4.35.4.orig/drivers/isdn/hisax/jade.c       2007-12-15 05:19:40.206712289 +0100
10363 +++ linux-2.4.35.4/drivers/isdn/hisax/jade.c    2007-12-15 05:19:55.623590846 +0100
10364 @@ -1,4 +1,4 @@
10365 -/* $Id: jade.c,v 1.1.4.1 2001/11/20 14:19:36 kai Exp $
10366 +/* $Id: jade.c,v 1.9 2001/09/24 13:22:56 kai Exp $
10367   *
10368   * JADE stuff (derived from original hscx.c)
10369   *
10370 Index: linux-2.4.35.4/drivers/isdn/hisax/jade.h
10371 ===================================================================
10372 --- linux-2.4.35.4.orig/drivers/isdn/hisax/jade.h       2007-12-15 05:19:40.214712745 +0100
10373 +++ linux-2.4.35.4/drivers/isdn/hisax/jade.h    2007-12-15 05:19:55.623590846 +0100
10374 @@ -1,4 +1,4 @@
10375 -/* $Id: jade.h,v 1.1.4.1 2001/11/20 14:19:36 kai Exp $
10376 +/* $Id: jade.h,v 1.5 2001/09/24 13:22:56 kai Exp $
10377   *
10378   * JADE specific defines
10379   *
10380 Index: linux-2.4.35.4/drivers/isdn/hisax/jade_irq.c
10381 ===================================================================
10382 --- linux-2.4.35.4.orig/drivers/isdn/hisax/jade_irq.c   2007-12-15 05:19:40.218712971 +0100
10383 +++ linux-2.4.35.4/drivers/isdn/hisax/jade_irq.c        2007-12-15 05:19:55.627591072 +0100
10384 @@ -1,4 +1,4 @@
10385 -/* $Id: jade_irq.c,v 1.1.4.1 2001/11/20 14:19:36 kai Exp $
10386 +/* $Id: jade_irq.c,v 1.7 2001/09/24 13:22:56 kai Exp $
10387   *
10388   * Low level JADE IRQ stuff (derived from original hscx_irq.c)
10389   *
10390 Index: linux-2.4.35.4/drivers/isdn/hisax/l3_1tr6.c
10391 ===================================================================
10392 --- linux-2.4.35.4.orig/drivers/isdn/hisax/l3_1tr6.c    2007-12-15 05:19:40.226713429 +0100
10393 +++ linux-2.4.35.4/drivers/isdn/hisax/l3_1tr6.c 2007-12-15 05:19:55.627591072 +0100
10394 @@ -1,4 +1,4 @@
10395 -/* $Id: l3_1tr6.c,v 1.1.4.1 2001/11/20 14:19:36 kai Exp $
10396 +/* $Id: l3_1tr6.c,v 2.15 2001/09/24 13:22:56 kai Exp $
10397   *
10398   * German 1TR6 D-channel protocol
10399   *
10400 @@ -20,7 +20,7 @@
10401  #include <linux/ctype.h>
10402  
10403  extern char *HiSax_getrev(const char *revision);
10404 -const char *l3_1tr6_revision = "$Revision: 1.1.4.1 $";
10405 +const char *l3_1tr6_revision = "$Revision: 2.15 $";
10406  
10407  #define MsgHead(ptr, cref, mty, dis) \
10408         *ptr++ = dis; \
10409 Index: linux-2.4.35.4/drivers/isdn/hisax/l3_1tr6.h
10410 ===================================================================
10411 --- linux-2.4.35.4.orig/drivers/isdn/hisax/l3_1tr6.h    2007-12-15 05:19:40.234713885 +0100
10412 +++ linux-2.4.35.4/drivers/isdn/hisax/l3_1tr6.h 2007-12-15 05:19:55.627591072 +0100
10413 @@ -1,4 +1,4 @@
10414 -/* $Id: l3_1tr6.h,v 1.1.4.1 2001/11/20 14:19:36 kai Exp $
10415 +/* $Id$
10416   *
10417   * German 1TR6 D-channel protocol defines
10418   *
10419 Index: linux-2.4.35.4/drivers/isdn/hisax/l3dss1.c
10420 ===================================================================
10421 --- linux-2.4.35.4.orig/drivers/isdn/hisax/l3dss1.c     2007-12-15 05:19:40.242714340 +0100
10422 +++ linux-2.4.35.4/drivers/isdn/hisax/l3dss1.c  2007-12-15 05:19:55.635591530 +0100
10423 @@ -1,4 +1,4 @@
10424 -/* $Id: l3dss1.c,v 1.1.4.1 2001/11/20 14:19:36 kai Exp $
10425 +/* $Id: l3dss1.c,v 2.32 2001/09/24 13:22:56 kai Exp $
10426   *
10427   * EURO/DSS1 D-channel protocol
10428   *
10429 @@ -27,7 +27,7 @@
10430  #include <linux/config.h>
10431  
10432  extern char *HiSax_getrev(const char *revision);
10433 -const char *dss1_revision = "$Revision: 1.1.4.1 $";
10434 +const char *dss1_revision = "$Revision: 2.32 $";
10435  
10436  #define EXT_BEARER_CAPS 1
10437  
10438 Index: linux-2.4.35.4/drivers/isdn/hisax/l3dss1.h
10439 ===================================================================
10440 --- linux-2.4.35.4.orig/drivers/isdn/hisax/l3dss1.h     2007-12-15 05:19:40.250714795 +0100
10441 +++ linux-2.4.35.4/drivers/isdn/hisax/l3dss1.h  2007-12-15 05:19:55.635591530 +0100
10442 @@ -1,4 +1,4 @@
10443 -/* $Id: l3dss1.h,v 1.1.4.1 2001/11/20 14:19:36 kai Exp $
10444 +/* $Id$
10445   *
10446   * DSS1 (Euro) D-channel protocol defines
10447   *
10448 Index: linux-2.4.35.4/drivers/isdn/hisax/l3ni1.c
10449 ===================================================================
10450 --- linux-2.4.35.4.orig/drivers/isdn/hisax/l3ni1.c      2007-12-15 05:19:40.254715024 +0100
10451 +++ linux-2.4.35.4/drivers/isdn/hisax/l3ni1.c   2007-12-15 05:19:55.635591530 +0100
10452 @@ -1,4 +1,4 @@
10453 -/* $Id: l3ni1.c,v 1.1.4.1 2001/11/20 14:19:36 kai Exp $
10454 +/* $Id: l3ni1.c,v 2.8 2001/09/24 13:22:56 kai Exp $
10455   *
10456   * NI1 D-channel protocol
10457   *
10458 @@ -25,7 +25,7 @@
10459  #include <linux/ctype.h>
10460  
10461  extern char *HiSax_getrev(const char *revision);
10462 -const char *ni1_revision = "$Revision: 1.1.4.1 $";
10463 +const char *ni1_revision = "$Revision: 2.8 $";
10464  
10465  #define EXT_BEARER_CAPS 1
10466  
10467 Index: linux-2.4.35.4/drivers/isdn/hisax/l3ni1.h
10468 ===================================================================
10469 --- linux-2.4.35.4.orig/drivers/isdn/hisax/l3ni1.h      2007-12-15 05:19:40.262715480 +0100
10470 +++ linux-2.4.35.4/drivers/isdn/hisax/l3ni1.h   2007-12-15 05:19:55.635591530 +0100
10471 @@ -1,4 +1,4 @@
10472 -/* $Id: l3ni1.h,v 1.1.4.1 2001/11/20 14:19:36 kai Exp $
10473 +/* $Id$
10474   *
10475   * NI1 D-channel protocol
10476   *
10477 Index: linux-2.4.35.4/drivers/isdn/hisax/lmgr.c
10478 ===================================================================
10479 --- linux-2.4.35.4.orig/drivers/isdn/hisax/lmgr.c       2007-12-15 05:19:40.270715935 +0100
10480 +++ linux-2.4.35.4/drivers/isdn/hisax/lmgr.c    2007-12-15 05:19:55.639591759 +0100
10481 @@ -1,4 +1,4 @@
10482 -/* $Id: lmgr.c,v 1.1.4.1 2001/11/20 14:19:36 kai Exp $
10483 +/* $Id$
10484   *
10485   * Layermanagement module
10486   *
10487 Index: linux-2.4.35.4/drivers/isdn/hisax/md5sums.asc
10488 ===================================================================
10489 --- linux-2.4.35.4.orig/drivers/isdn/hisax/md5sums.asc  2007-12-15 05:19:40.278716390 +0100
10490 +++ linux-2.4.35.4/drivers/isdn/hisax/md5sums.asc       2007-12-15 05:19:55.639591759 +0100
10491 @@ -1,33 +1,22 @@
10492 ------BEGIN PGP SIGNED MESSAGE-----
10493 -Hash: SHA1
10494 -
10495  # This are valid md5sums for certificated HiSax driver.
10496  # The certification is valid only if the md5sums of all files match.
10497  # The certification is valid only for ELSA Microlink PCI,
10498 -# Eicon Technology Diva 2.01 PCI, Sedlbauer SpeedFax+,
10499 -# HFC-S PCI A based cards and HFC-S USB based ISDN
10500 -# terminal adapters in the moment.
10501 +# Eicon Technology Diva 2.01 PCI, Sedlbauer SpeedFax+, 
10502 +# HFC-S PCI A based cards and HFC-S USB based isdn tas 
10503 +# in the moment.
10504  # Read ../../../Documentation/isdn/HiSax.cert for more informations.
10505  # 
10506 -cd4a9917e1147039d5dfc66440d42054  isac.c
10507 -211840e78b56c9d4753be9c85da21a50  isdnl1.c
10508 -5ce9b1fff42a02f9c2eb4fb81c701b1f  isdnl2.c
10509 -6948de0c43513dd23c6706feb5fc2209  isdnl3.c
10510 -3730780b69368218d756024165efea79  tei.c
10511 -16e72710eb58da01415b877490f5d2ac  callc.c
10512 -6abc55c77e0f3149ae9334f3257a1a1a  cert.c
10513 -27bdb2800d4590e00da20eff241edc47  l3dss1.c
10514 -df8bb877b854c4302d396b554e4e84ef  l3_1tr6.c
10515 -9d8b4bed15370063d1b16e47080f50e1  elsa.c
10516 -210f4a3f1eebca70229d786b15cf3e90  diva.c
10517 -4ddf21079dd77e892380f789bae250a7  sedlbauer.c
10518 -8200d818771e3cbdef2a3c3e818d25ac  hfc_pci.c
10519 +6f9433a8b696076562562d090e3c420f  isac.c
10520 +13c3eed869f5139f44c563e3a8fea1f5  isdnl1.c
10521 +addcff863b0ff1e366c0f2ae9fa6e81e  isdnl2.c
10522 +7076deb94a363945c21ea27aca4a720a  isdnl3.c
10523 +51c603829b6cc4f8421f744ad657ceff  tei.c
10524 +669050ab5079f02887ed0239d86e5474  callc.c
10525 +ecacd146b8f8881ef9349935dab3df4a  cert.c
10526 +fadeb3b85bb23bc1ac48470c0848d6fa  l3dss1.c
10527 +cf7dec9fac6283716904d26b99188476  l3_1tr6.c
10528 +2f75c8765e1be13d114d5f4433cf364b  elsa.c
10529 +b4cf8a4dceed9ea6dcba65a85b4eecc7  diva.c
10530 +dee3f8f40c6fe78a4b57729804b7e6cd  sedlbauer.c
10531 +0d79fe6dfc5bfaa4826970c41a6d273d  hfc_pci.c
10532  # end of md5sums
10533 ------BEGIN PGP SIGNATURE-----
10534 -Version: GnuPG v1.0.6 (GNU/Linux)
10535 -Comment: For info see http://www.gnupg.org
10536 -
10537 -iD8DBQE9rE91DiY0VZsg4ukRAkKfAJ4xWUfqjc0hW+V+JPue5yr7mrt+RwCdGdSf
10538 -GIKgAEdRLzERmpt/bCCwAbY=
10539 -=FaHw
10540 ------END PGP SIGNATURE-----
10541 Index: linux-2.4.35.4/drivers/isdn/hisax/mic.c
10542 ===================================================================
10543 --- linux-2.4.35.4.orig/drivers/isdn/hisax/mic.c        2007-12-15 05:19:40.282716619 +0100
10544 +++ linux-2.4.35.4/drivers/isdn/hisax/mic.c     2007-12-15 05:19:55.639591759 +0100
10545 @@ -1,4 +1,4 @@
10546 -/* $Id: mic.c,v 1.1.4.1 2001/11/20 14:19:36 kai Exp $
10547 +/* $Id: mic.c,v 1.12 2001/09/24 13:22:56 kai Exp $
10548   *
10549   * low level stuff for mic cards
10550   *
10551 @@ -19,7 +19,7 @@
10552  
10553  extern const char *CardType[];
10554  
10555 -const char *mic_revision = "$Revision: 1.1.4.1 $";
10556 +const char *mic_revision = "$Revision: 1.12 $";
10557  
10558  #define byteout(addr,val) outb(val,addr)
10559  #define bytein(addr) inb(addr)
10560 Index: linux-2.4.35.4/drivers/isdn/hisax/netjet.c
10561 ===================================================================
10562 --- linux-2.4.35.4.orig/drivers/isdn/hisax/netjet.c     2007-12-15 05:19:40.290717075 +0100
10563 +++ linux-2.4.35.4/drivers/isdn/hisax/netjet.c  2007-12-15 05:19:55.639591759 +0100
10564 @@ -1,4 +1,4 @@
10565 -/* $Id: netjet.c,v 1.1.4.1 2001/11/20 14:19:36 kai Exp $
10566 +/* $Id: netjet.c,v 1.29 2001/09/24 13:22:56 kai Exp $
10567   *
10568   * low level stuff for Traverse Technologie NETJet ISDN cards
10569   *
10570 @@ -8,9 +8,7 @@
10571   * This software may be used and distributed according to the terms
10572   * of the GNU General Public License, incorporated herein by reference.
10573   *
10574 - * Thanks to Traverse Technologies Australia for documents and information
10575 - *
10576 - * 16-Apr-2002 - led code added - Guy Ellis (guy@traverse.com.au)
10577 + * Thanks to Traverse Technologie Australia for documents and information
10578   *
10579   */
10580  
10581 @@ -26,7 +24,7 @@
10582  #include <asm/io.h>
10583  #include "netjet.h"
10584  
10585 -const char *NETjet_revision = "$Revision: 1.1.4.1 $";
10586 +const char *NETjet_revision = "$Revision: 1.29 $";
10587  
10588  /* Interface functions */
10589  
10590 @@ -135,7 +133,6 @@
10591  mode_tiger(struct BCState *bcs, int mode, int bc)
10592  {
10593         struct IsdnCardState *cs = bcs->cs;
10594 -        u_char led;
10595  
10596         if (cs->debug & L1_DEB_HSCX)
10597                 debugl1(cs, "Tiger mode %d bchan %d/%d",
10598 @@ -157,15 +154,6 @@
10599                                         cs->hw.njet.dmactrl);
10600                                 byteout(cs->hw.njet.base + NETJET_IRQMASK0, 0);
10601                         }
10602 -                        if (cs->typ == ISDN_CTYPE_NETJET_S)
10603 -                        {
10604 -                                // led off
10605 -                                led = bc & 0x01;
10606 -                                led = 0x01 << (6 + led); // convert to mask
10607 -                                led = ~led;
10608 -                                cs->hw.njet.auxd &= led;
10609 -                                byteout(cs->hw.njet.auxa, cs->hw.njet.auxd);
10610 -                        }
10611                         break;
10612                 case (L1_MODE_TRANS):
10613                         break;
10614 @@ -191,14 +179,6 @@
10615                         bcs->hw.tiger.sendp = bcs->hw.tiger.send;
10616                         bcs->hw.tiger.free = NETJET_DMA_TXSIZE;
10617                         test_and_set_bit(BC_FLG_EMPTY, &bcs->Flag);
10618 -                        if (cs->typ == ISDN_CTYPE_NETJET_S)
10619 -                        {
10620 -                                // led on
10621 -                                led = bc & 0x01;
10622 -                                led = 0x01 << (6 + led); // convert to mask
10623 -                                cs->hw.njet.auxd |= led;
10624 -                                byteout(cs->hw.njet.auxa, cs->hw.njet.auxd);
10625 -                        }
10626                         break;
10627         }
10628         if (cs->debug & L1_DEB_HSCX)
10629 @@ -874,13 +854,9 @@
10630                 case (PH_ACTIVATE | REQUEST):
10631                         test_and_set_bit(BC_FLG_ACTIV, &st->l1.bcs->Flag);
10632                         mode_tiger(st->l1.bcs, st->l1.mode, st->l1.bc);
10633 -                       /* 2001/10/04 Christoph Ersfeld, Formula-n Europe AG */
10634 -                       st->l1.bcs->cs->cardmsg(st->l1.bcs->cs, MDL_BC_ASSIGN, (void *)(&st->l1.bc));
10635                         l1_msg_b(st, pr, arg);
10636                         break;
10637                 case (PH_DEACTIVATE | REQUEST):
10638 -                       /* 2001/10/04 Christoph Ersfeld, Formula-n Europe AG */
10639 -                       st->l1.bcs->cs->cardmsg(st->l1.bcs->cs, MDL_BC_RELEASE, (void *)(&st->l1.bc));
10640                         l1_msg_b(st, pr, arg);
10641                         break;
10642                 case (PH_DEACTIVATE | CONFIRM):
10643 Index: linux-2.4.35.4/drivers/isdn/hisax/netjet.h
10644 ===================================================================
10645 --- linux-2.4.35.4.orig/drivers/isdn/hisax/netjet.h     2007-12-15 05:19:40.298717530 +0100
10646 +++ linux-2.4.35.4/drivers/isdn/hisax/netjet.h  2007-12-15 05:19:55.639591759 +0100
10647 @@ -1,4 +1,4 @@
10648 -/* $Id: netjet.h,v 1.1.4.1 2001/11/20 14:19:36 kai Exp $
10649 +/* $Id: netjet.h,v 2.8 2001/09/24 13:22:56 kai Exp $
10650   *
10651   * NETjet common header file
10652   *
10653 Index: linux-2.4.35.4/drivers/isdn/hisax/niccy.c
10654 ===================================================================
10655 --- linux-2.4.35.4.orig/drivers/isdn/hisax/niccy.c      2007-12-15 05:19:40.306717988 +0100
10656 +++ linux-2.4.35.4/drivers/isdn/hisax/niccy.c   2007-12-15 05:19:55.643591986 +0100
10657 @@ -1,4 +1,4 @@
10658 -/* $Id: niccy.c,v 1.1.4.1 2001/11/20 14:19:36 kai Exp $
10659 +/* $Id: niccy.c,v 1.21 2001/10/20 22:05:00 kai Exp $
10660   *
10661   * low level stuff for Dr. Neuhaus NICCY PnP and NICCY PCI and
10662   * compatible (SAGEM cybermodem)
10663 @@ -22,10 +22,10 @@
10664  #include "hscx.h"
10665  #include "isdnl1.h"
10666  #include <linux/pci.h>
10667 -#include <linux/isapnp.h>
10668 +#include <linux/isdn_compat.h>
10669  
10670  extern const char *CardType[];
10671 -const char *niccy_revision = "$Revision: 1.1.4.1 $";
10672 +const char *niccy_revision = "$Revision: 1.21 $";
10673  
10674  #define byteout(addr,val) outb(val,addr)
10675  #define bytein(addr) inb(addr)
10676 @@ -239,9 +239,6 @@
10677  }
10678  
10679  static struct pci_dev *niccy_dev __initdata = NULL;
10680 -#ifdef __ISAPNP__
10681 -static struct pci_bus *pnp_c __devinitdata = NULL;
10682 -#endif
10683  
10684  int __init
10685  setup_niccy(struct IsdnCard *card)
10686 @@ -253,39 +250,7 @@
10687         printk(KERN_INFO "HiSax: Niccy driver Rev. %s\n", HiSax_getrev(tmp));
10688         if (cs->typ != ISDN_CTYPE_NICCY)
10689                 return (0);
10690 -#ifdef __ISAPNP__
10691 -       if (!card->para[1] && isapnp_present()) {
10692 -               struct pci_bus *pb;
10693 -               struct pci_dev *pd;
10694 -
10695 -               if ((pb = isapnp_find_card(
10696 -                       ISAPNP_VENDOR('S', 'D', 'A'),
10697 -                       ISAPNP_FUNCTION(0x0150), pnp_c))) {
10698 -                       pnp_c = pb;
10699 -                       pd = NULL;
10700 -                       if (!(pd = isapnp_find_dev(pnp_c,
10701 -                               ISAPNP_VENDOR('S', 'D', 'A'),
10702 -                               ISAPNP_FUNCTION(0x0150), pd))) {
10703 -                               printk(KERN_ERR "NiccyPnP: PnP error card found, no device\n");
10704 -                               return (0);
10705 -                       }
10706 -                       pd->prepare(pd);
10707 -                       pd->deactivate(pd);
10708 -                       pd->activate(pd);
10709 -                       card->para[1] = pd->resource[0].start;
10710 -                       card->para[2] = pd->resource[1].start;
10711 -                       card->para[0] = pd->irq_resource[0].start;
10712 -                       if (!card->para[0] || !card->para[1] || !card->para[2]) {
10713 -                               printk(KERN_ERR "NiccyPnP:some resources are missing %ld/%lx/%lx\n",
10714 -                                       card->para[0], card->para[1], card->para[2]);
10715 -                               pd->deactivate(pd);
10716 -                               return(0);
10717 -                       }
10718 -               } else {
10719 -                       printk(KERN_INFO "NiccyPnP: no ISAPnP card found\n");
10720 -               }
10721 -       }
10722 -#endif
10723 +
10724         if (card->para[1]) {
10725                 cs->hw.niccy.isac = card->para[1] + ISAC_PNP;
10726                 cs->hw.niccy.hscx = card->para[1] + HSCX_PNP;
10727 @@ -331,12 +296,12 @@
10728                                 return(0);
10729                         }
10730                         cs->irq = niccy_dev->irq;
10731 -                       cs->hw.niccy.cfg_reg = pci_resource_start(niccy_dev, 0);
10732 +                       cs->hw.niccy.cfg_reg = pci_resource_start_io(niccy_dev, 0);
10733                         if (!cs->hw.niccy.cfg_reg) {
10734                                 printk(KERN_WARNING "Niccy: No IO-Adr for PCI cfg found\n");
10735                                 return(0);
10736                         }
10737 -                       pci_ioaddr = pci_resource_start(niccy_dev, 1);
10738 +                       pci_ioaddr = pci_resource_start_io(niccy_dev, 1);
10739                         if (!pci_ioaddr) {
10740                                 printk(KERN_WARNING "Niccy: No IO-Adr for PCI card found\n");
10741                                 return(0);
10742 Index: linux-2.4.35.4/drivers/isdn/hisax/nj_s.c
10743 ===================================================================
10744 --- linux-2.4.35.4.orig/drivers/isdn/hisax/nj_s.c       2007-12-15 05:19:40.314718444 +0100
10745 +++ linux-2.4.35.4/drivers/isdn/hisax/nj_s.c    2007-12-15 05:19:55.643591986 +0100
10746 @@ -1,4 +1,4 @@
10747 -/* $Id: nj_s.c,v 1.1.4.1 2001/11/20 14:19:36 kai Exp $
10748 +/* $Id: nj_s.c,v 2.13 2001/09/24 13:22:56 kai Exp $
10749   *
10750   * This software may be used and distributed according to the terms
10751   * of the GNU General Public License, incorporated herein by reference.
10752 @@ -12,11 +12,12 @@
10753  #include "isac.h"
10754  #include "isdnl1.h"
10755  #include <linux/pci.h>
10756 +#include <linux/isdn_compat.h>
10757  #include <linux/interrupt.h>
10758  #include <linux/ppp_defs.h>
10759  #include "netjet.h"
10760  
10761 -const char *NETjet_S_revision = "$Revision: 1.1.4.1 $";
10762 +const char *NETjet_S_revision = "$Revision: 2.13 $";
10763  
10764  static u_char dummyrr(struct IsdnCardState *cs, int chan, u_char off)
10765  {
10766 @@ -130,7 +131,6 @@
10767                         release_io_netjet(cs);
10768                         return(0);
10769                 case CARD_INIT:
10770 -                       reset_netjet_s(cs);
10771                         inittiger(cs);
10772                         clear_pending_isac_ints(cs);
10773                         initisac(cs);
10774 @@ -180,19 +180,11 @@
10775                                 printk(KERN_WARNING "NETjet-S: No IRQ for PCI card found\n");
10776                                 return(0);
10777                         }
10778 -                       cs->hw.njet.base = pci_resource_start(dev_netjet, 0);
10779 +                       cs->hw.njet.base = pci_resource_start_io(dev_netjet, 0);
10780                         if (!cs->hw.njet.base) {
10781                                 printk(KERN_WARNING "NETjet-S: No IO-Adr for PCI card found\n");
10782                                 return(0);
10783                         }
10784 -                       /* 2001/10/04 Christoph Ersfeld, Formula-n Europe AG www.formula-n.com */
10785 -                       if ((dev_netjet->subsystem_vendor == 0x55) &&
10786 -                               (dev_netjet->subsystem_device == 0x02)) {
10787 -                               printk(KERN_WARNING "Netjet: You tried to load this driver with an incompatible TigerJet-card\n");
10788 -                               printk(KERN_WARNING "Use type=41 for Formula-n enter:now ISDN PCI and compatible\n");
10789 -                               return(0);
10790 -                       }
10791 -                       /* end new code */
10792                 } else {
10793                         printk(KERN_WARNING "NETjet-S: No PCI card found\n");
10794                         return(0);
10795 @@ -263,6 +255,7 @@
10796         } else {
10797                 request_region(cs->hw.njet.base, bytecnt, "netjet-s isdn");
10798         }
10799 +       reset_netjet_s(cs);
10800         cs->readisac  = &NETjet_ReadIC;
10801         cs->writeisac = &NETjet_WriteIC;
10802         cs->readisacfifo  = &NETjet_ReadICfifo;
10803 Index: linux-2.4.35.4/drivers/isdn/hisax/nj_u.c
10804 ===================================================================
10805 --- linux-2.4.35.4.orig/drivers/isdn/hisax/nj_u.c       2007-12-15 05:19:40.318718670 +0100
10806 +++ linux-2.4.35.4/drivers/isdn/hisax/nj_u.c    2007-12-15 05:19:55.643591986 +0100
10807 @@ -1,4 +1,4 @@
10808 -/* $Id: nj_u.c,v 1.1.4.1 2001/11/20 14:19:36 kai Exp $ 
10809 +/* $Id: nj_u.c,v 2.14 2001/09/24 13:22:56 kai Exp $ 
10810   *
10811   * This software may be used and distributed according to the terms
10812   * of the GNU General Public License, incorporated herein by reference.
10813 @@ -12,11 +12,12 @@
10814  #include "icc.h"
10815  #include "isdnl1.h"
10816  #include <linux/pci.h>
10817 +#include <linux/isdn_compat.h>
10818  #include <linux/interrupt.h>
10819  #include <linux/ppp_defs.h>
10820  #include "netjet.h"
10821  
10822 -const char *NETjet_U_revision = "$Revision: 1.1.4.1 $";
10823 +const char *NETjet_U_revision = "$Revision: 2.14 $";
10824  
10825  static u_char dummyrr(struct IsdnCardState *cs, int chan, u_char off)
10826  {
10827 @@ -181,7 +182,7 @@
10828                                 printk(KERN_WARNING "NETspider-U: No IRQ for PCI card found\n");
10829                                 return(0);
10830                         }
10831 -                       cs->hw.njet.base = pci_resource_start(dev_netjet, 0);
10832 +                       cs->hw.njet.base = pci_resource_start_io(dev_netjet, 0);
10833                         if (!cs->hw.njet.base) {
10834                                 printk(KERN_WARNING "NETspider-U: No IO-Adr for PCI card found\n");
10835                                 return(0);
10836 Index: linux-2.4.35.4/drivers/isdn/hisax/q931.c
10837 ===================================================================
10838 --- linux-2.4.35.4.orig/drivers/isdn/hisax/q931.c       2007-12-15 05:19:40.326719128 +0100
10839 +++ linux-2.4.35.4/drivers/isdn/hisax/q931.c    2007-12-15 05:19:55.647592212 +0100
10840 @@ -1,4 +1,4 @@
10841 -/* $Id: q931.c,v 1.1.4.1 2001/11/20 14:19:36 kai Exp $
10842 +/* $Id: q931.c,v 1.12 2001/09/24 13:22:56 kai Exp $
10843   *
10844   * code to decode ITU Q.931 call control messages
10845   *
10846 @@ -197,6 +197,31 @@
10847  
10848  #define MT_N1_LEN (sizeof(mt_n1) / sizeof(struct MessageType))
10849  
10850 +#if 0
10851 +static struct MessageType fac_1tr6[] =
10852 +{
10853 +       {FAC_Sperre, "Sperre"},
10854 +       {FAC_Forward1, "Forward 1"},
10855 +       {FAC_Forward2, "Forward 2"},
10856 +       {FAC_Konferenz, "Konferenz"},
10857 +       {FAC_GrabBchan, "Grab Bchannel"},
10858 +       {FAC_Reactivate, "Reactivate"},
10859 +       {FAC_Konferenz3, "Dreier Konferenz"},
10860 +       {FAC_Dienstwechsel1, "Einseitiger Dienstwechsel"},
10861 +       {FAC_Dienstwechsel2, "Zweiseitiger Dienstwechsel"},
10862 +       {FAC_NummernIdent, "Rufnummer-Identifizierung"},
10863 +       {FAC_GBG, "GBG"},
10864 +       {FAC_DisplayUebergeben, "Display Uebergeben"},
10865 +       {FAC_DisplayUmgeleitet, "Display Umgeleitet"},
10866 +       {FAC_Unterdruecke, "Unterdruecke Rufnummer"},
10867 +       {FAC_Deactivate, "Deactivate"},
10868 +       {FAC_Activate, "Activate"},
10869 +       {FAC_SPV, "SPV"},
10870 +       {FAC_Rueckwechsel, "Rueckwechsel"},
10871 +       {FAC_Umleitung, "Umleitung"}
10872 +};
10873 +#define FAC_1TR6_LEN (sizeof(fac_1tr6) / sizeof(struct MessageType))
10874 +#endif
10875  
10876  static int
10877  prbits(char *dest, u_char b, int start, int len)
10878 Index: linux-2.4.35.4/drivers/isdn/hisax/rawhdlc.c
10879 ===================================================================
10880 --- /dev/null   1970-01-01 00:00:00.000000000 +0000
10881 +++ linux-2.4.35.4/drivers/isdn/hisax/rawhdlc.c 2007-12-15 05:19:55.647592212 +0100
10882 @@ -0,0 +1,543 @@
10883 +/* $Id: rawhdlc.c,v 1.7 2001/09/24 13:22:57 kai Exp $
10884 + *
10885 + * support routines for cards that don't support HDLC
10886 + *
10887 + * Author     Brent Baccala
10888 + * Copyright  by Karsten Keil <keil@isdn4linux.de>
10889 + *            by Brent Baccala <baccala@FreeSoft.org>
10890 + *
10891 + * This software may be used and distributed according to the terms
10892 + * of the GNU General Public License, incorporated herein by reference.
10893 + *
10894 + *
10895 + * Some passive ISDN cards, such as the Traverse NETJet and the AMD 7930,
10896 + * don't perform HDLC encapsulation over the B channel.  Drivers for
10897 + * such cards use support routines in this file to perform B channel HDLC.
10898 + *
10899 + * Bit-synchronous HDLC encapsulation is a means of encapsulating packets
10900 + * over a continuously transmitting serial communications link.
10901 + * It looks like this:
10902 + *
10903 + *      11111111101111110...........0111111011111111111
10904 + *      iiiiiiiiiffffffffdddddddddddffffffffiiiiiiiiiii
10905 + *
10906 + *      i = idle     f = flag     d = data
10907 + *
10908 + * When idle, the channel sends a continuous string of ones (mark
10909 + * idle; illustrated), or a continuous string of flag characters (flag
10910 + * idle).  The beginning of a data frame is marked by a flag character
10911 + * (01111110), then comes the actual data, followed by another flag
10912 + * character, after which another frame may be sent immediately (a
10913 + * single flag may serve as both the end of one frame and the start of
10914 + * the next), or the link may return to idle.  Obviously, the flag
10915 + * character can not appear anywhere in the data (or a false
10916 + * end-of-frame would occur), so the transmitter performs
10917 + * "bit-stuffing" - inserting a zero bit after every five one bits,
10918 + * irregardless of the original bit after the five ones.  Byte
10919 + * ordering is irrelevent at this point - the data is treated as a
10920 + * string of bits, not bytes.  Since no more than 5 ones may now occur
10921 + * in a row, the flag sequence, with its 6 ones, is unique.
10922 + *
10923 + * Upon reception, a zero bit that occur after 5 one bits is simply
10924 + * discarded.  A series of 6 one bits is end-of-frame, and a series of
10925 + * 7 one bits is an abort.  Once bit-stuffing has been corrected for,
10926 + * an integer number of bytes should now be present.  The last two
10927 + * of these bytes form the Frame Check Sequence, a CRC that is verified
10928 + * and then discarded.  Note that bit-stuffing is performed on the FCS
10929 + * just as if it were regular data.
10930 + *
10931 + *
10932 + *
10933 + * int make_raw_hdlc_data(u_char *src, u_int slen,
10934 + *                        u_char *dst, u_int dsize)
10935 + *
10936 + *   Used for transmission.  Copies slen bytes from src to dst, performing
10937 + *   HDLC encapsulation (flag bytes, bit-stuffing, CRC) in the process.
10938 + *   dsize is size of destination buffer, and should be at least
10939 + *   ((6*slen)/5)+5 bytes to ensure adequate space will be available.
10940 + *   Function returns length (in bytes) of valid destination buffer, or
10941 + *   0 upon destination overflow.
10942 + *
10943 + * void init_hdlc_state(struct hdlc_state *stateptr, int mode)
10944 + *
10945 + *   Initializes hdlc_state structure before first call to read_raw_hdlc_data
10946 + *
10947 + *   mode = 0: Sane mode
10948 + *   mode = 1/2: 
10949 + *             Insane mode; NETJet use a shared unsigned int memory block (
10950 + *            with busmaster DMA), the bit pattern of every word is 
10951 + *            <8 B1> <8 B2> <8 Mon> <2 D> <4 C/I> <MX> <MR>
10952 + *            according to Siemens IOM-2 interface, so we have to handle
10953 + *             the src buffer as unsigned int and have to shift/mask the
10954 + *             B-channel bytes.
10955 + *             mode 1 -> B1  mode 2  -> B2 data is used
10956 + *
10957 + * int read_raw_hdlc_data(struct hdlc_state *saved_state,
10958 + *                        u_char *src, u_int slen,
10959 + *                        u_char *dst, u_int dsize)
10960 + *
10961 + *   Used for reception.  Scans source buffer bit-by-bit looking for
10962 + *   valid HDLC frames, which are copied to destination buffer.  HDLC
10963 + *   state information is stored in a structure, which allows this
10964 + *   function to process frames spread across several blocks of raw
10965 + *   HDLC data.  Part of the state information is bit offsets into
10966 + *   the source and destination buffers.
10967 + *
10968 + *   A return value >0 indicates the length of a valid frame, now
10969 + *   stored in the destination buffer.  In this case, the source
10970 + *   buffer might not be completely processed, so this function should
10971 + *   be called again with the same source buffer, possibly with a
10972 + *   different destination buffer.
10973 + *
10974 + *   A return value of zero indicates that the source buffer was
10975 + *   completely processed without finding a valid end-of-packet;
10976 + *   however, we might be in the middle of packet reception, so
10977 + *   the function should be called again with the next block of
10978 + *   raw HDLC data and the same destination buffer.  It is NOT
10979 + *   permitted to change the destination buffer in this case,
10980 + *   since data may already have begun to be stored there.
10981 + *
10982 + *   A return value of -1 indicates some kind of error - destination
10983 + *   buffer overflow, CRC check failed, frame not a multiple of 8
10984 + *   bits.  Destination buffer probably contains invalid data, which
10985 + *   should be discarded.  Call function again with same source buffer
10986 + *   and a new (or same) destination buffer.
10987 + *
10988 + *   Suggested calling sequence:
10989 + *
10990 + *      init_hdlc_state(...);
10991 + *      for (EACH_RAW_DATA_BLOCK) {
10992 + *         while (len = read_raw_hdlc_data(...)) {
10993 + *             if (len == -1) DISCARD_FRAME;
10994 + *             else PROCESS_FRAME;
10995 + *         }
10996 + *      }
10997 + *
10998 + *
10999 + * Test the code in this file as follows:
11000 + *    gcc -DDEBUGME -o rawhdlctest rawhdlc.c
11001 + *    ./rawhdlctest < rawdata
11002 + *
11003 + * The file "rawdata" can be easily generated from a HISAX B-channel
11004 + * hex dump (CF CF CF 02 ...) using the following perl script:
11005 + *
11006 + * while(<>) {
11007 + *     @hexlist = split ' ';
11008 + *     while ($hexstr = shift(@hexlist)) {
11009 + *         printf "%c", hex($hexstr);
11010 + *     }
11011 + * }
11012 + *
11013 + */
11014 +
11015 +#ifdef DEBUGME
11016 +#include <stdio.h>
11017 +#endif
11018 +
11019 +#include <linux/types.h>
11020 +#include <linux/ppp_defs.h>
11021 +#include "rawhdlc.h"
11022 +
11023 +/* There's actually an identical copy of this table in the PPP code
11024 + * (ppp_crc16_table), but I don't want this code dependent on PPP
11025 + */
11026 +
11027 +// static 
11028 +__u16 fcstab[256] =
11029 +{
11030 +       0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf,
11031 +       0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0xe97e, 0xf8f7,
11032 +       0x1081, 0x0108, 0x3393, 0x221a, 0x56a5, 0x472c, 0x75b7, 0x643e,
11033 +       0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xdaed, 0xcb64, 0xf9ff, 0xe876,
11034 +       0x2102, 0x308b, 0x0210, 0x1399, 0x6726, 0x76af, 0x4434, 0x55bd,
11035 +       0xad4a, 0xbcc3, 0x8e58, 0x9fd1, 0xeb6e, 0xfae7, 0xc87c, 0xd9f5,
11036 +       0x3183, 0x200a, 0x1291, 0x0318, 0x77a7, 0x662e, 0x54b5, 0x453c,
11037 +       0xbdcb, 0xac42, 0x9ed9, 0x8f50, 0xfbef, 0xea66, 0xd8fd, 0xc974,
11038 +       0x4204, 0x538d, 0x6116, 0x709f, 0x0420, 0x15a9, 0x2732, 0x36bb,
11039 +       0xce4c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868, 0x99e1, 0xab7a, 0xbaf3,
11040 +       0x5285, 0x430c, 0x7197, 0x601e, 0x14a1, 0x0528, 0x37b3, 0x263a,
11041 +       0xdecd, 0xcf44, 0xfddf, 0xec56, 0x98e9, 0x8960, 0xbbfb, 0xaa72,
11042 +       0x6306, 0x728f, 0x4014, 0x519d, 0x2522, 0x34ab, 0x0630, 0x17b9,
11043 +       0xef4e, 0xfec7, 0xcc5c, 0xddd5, 0xa96a, 0xb8e3, 0x8a78, 0x9bf1,
11044 +       0x7387, 0x620e, 0x5095, 0x411c, 0x35a3, 0x242a, 0x16b1, 0x0738,
11045 +       0xffcf, 0xee46, 0xdcdd, 0xcd54, 0xb9eb, 0xa862, 0x9af9, 0x8b70,
11046 +       0x8408, 0x9581, 0xa71a, 0xb693, 0xc22c, 0xd3a5, 0xe13e, 0xf0b7,
11047 +       0x0840, 0x19c9, 0x2b52, 0x3adb, 0x4e64, 0x5fed, 0x6d76, 0x7cff,
11048 +       0x9489, 0x8500, 0xb79b, 0xa612, 0xd2ad, 0xc324, 0xf1bf, 0xe036,
11049 +       0x18c1, 0x0948, 0x3bd3, 0x2a5a, 0x5ee5, 0x4f6c, 0x7df7, 0x6c7e,
11050 +       0xa50a, 0xb483, 0x8618, 0x9791, 0xe32e, 0xf2a7, 0xc03c, 0xd1b5,
11051 +       0x2942, 0x38cb, 0x0a50, 0x1bd9, 0x6f66, 0x7eef, 0x4c74, 0x5dfd,
11052 +       0xb58b, 0xa402, 0x9699, 0x8710, 0xf3af, 0xe226, 0xd0bd, 0xc134,
11053 +       0x39c3, 0x284a, 0x1ad1, 0x0b58, 0x7fe7, 0x6e6e, 0x5cf5, 0x4d7c,
11054 +       0xc60c, 0xd785, 0xe51e, 0xf497, 0x8028, 0x91a1, 0xa33a, 0xb2b3,
11055 +       0x4a44, 0x5bcd, 0x6956, 0x78df, 0x0c60, 0x1de9, 0x2f72, 0x3efb,
11056 +       0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9, 0x8120, 0xb3bb, 0xa232,
11057 +       0x5ac5, 0x4b4c, 0x79d7, 0x685e, 0x1ce1, 0x0d68, 0x3ff3, 0x2e7a,
11058 +       0xe70e, 0xf687, 0xc41c, 0xd595, 0xa12a, 0xb0a3, 0x8238, 0x93b1,
11059 +       0x6b46, 0x7acf, 0x4854, 0x59dd, 0x2d62, 0x3ceb, 0x0e70, 0x1ff9,
11060 +       0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330,
11061 +       0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78
11062 +};
11063 +
11064 +#define HDLC_ZERO_SEARCH 0
11065 +#define HDLC_FLAG_SEARCH 1
11066 +#define HDLC_FLAG_FOUND  2
11067 +#define HDLC_FRAME_FOUND 3
11068 +#define HDLC_NULL 4
11069 +#define HDLC_PART 5
11070 +#define HDLC_FULL 6
11071 +
11072 +#define HDLC_FLAG_VALUE        0x7e
11073 +
11074 +
11075 +#define MAKE_RAW_BYTE for (j=0; j<8; j++) { \
11076 +                       bitcnt++;\
11077 +                       out_val >>= 1;\
11078 +                       if (val & 1) {\
11079 +                               s_one++;\
11080 +                               out_val |= 0x80;\
11081 +                       } else {\
11082 +                               s_one = 0;\
11083 +                               out_val &= 0x7f;\
11084 +                       }\
11085 +                       if (bitcnt==8) {\
11086 +                               if (d_cnt == dsize) return 0;\
11087 +                               dst[d_cnt++] = out_val;\
11088 +                               bitcnt = 0;\
11089 +                       }\
11090 +                       if (s_one == 5) {\
11091 +                               out_val >>= 1;\
11092 +                               out_val &= 0x7f;\
11093 +                               bitcnt++;\
11094 +                               s_one = 0;\
11095 +                       }\
11096 +                       if (bitcnt==8) {\
11097 +                               if (d_cnt == dsize) return 0;\
11098 +                               dst[d_cnt++] = out_val;\
11099 +                               bitcnt = 0;\
11100 +                       }\
11101 +                       val >>= 1;\
11102 +               }
11103 +
11104 +/* Optimization suggestion: If needed, this function could be
11105 + * dramatically sped up using a state machine.  Each state would
11106 + * correspond to having seen N one bits, and being offset M bits into
11107 + * the current output byte.  N ranges from 0 to 4, M from 0 to 7, so
11108 + * we need 5*8 = 35 states.  Each state would have a table with 256
11109 + * entries, one for each input character.  Each entry would contain
11110 + * three output characters, an output state, an a byte increment
11111 + * that's either 1 or 2.  All this could fit in four bytes; so we need
11112 + * 4 bytes * 256 characters = 1 KB for each state (35 KB total).  Zero
11113 + * the output buffer before you start.  For each character in your
11114 + * input, you look it up in the current state's table and get three
11115 + * bytes to be or'ed into the output at the current byte offset, and
11116 + * an byte increment to move your pointer forward.  A simple Perl
11117 + * script could generate the tables.  Given HDLC semantics, probably
11118 + * would be better to set output to all 1s, then use ands instead of ors.
11119 + * A smaller state machine could operate on nibbles instead of bytes.
11120 + * A state machine for 32-bit architectures could use word offsets
11121 + * instead of byte offsets, requiring 5*32 = 160 states; probably
11122 + * best to work on nibbles in such a case.
11123 + */
11124 +
11125 +
11126 +int make_raw_hdlc_data(u_char *src, u_int slen, u_char *dst, u_int dsize)
11127 +{
11128 +       register u_int i,d_cnt=0;
11129 +       register u_char j;
11130 +       register u_char val;
11131 +       register u_char s_one = 0;
11132 +       register u_char out_val = 0;
11133 +       register u_char bitcnt = 0;
11134 +       u_int fcs;
11135 +       
11136 +       
11137 +       dst[d_cnt++] = HDLC_FLAG_VALUE;
11138 +       fcs = PPP_INITFCS;
11139 +       for (i=0; i<slen; i++) {
11140 +               val = src[i];
11141 +               fcs = PPP_FCS (fcs, val);
11142 +               MAKE_RAW_BYTE;
11143 +       }
11144 +       fcs ^= 0xffff;
11145 +       val = fcs & 0xff;
11146 +       MAKE_RAW_BYTE;
11147 +       val = (fcs>>8) & 0xff;
11148 +       MAKE_RAW_BYTE;
11149 +       val = HDLC_FLAG_VALUE;
11150 +       for (j=0; j<8; j++) { 
11151 +               bitcnt++;
11152 +               out_val >>= 1;
11153 +               if (val & 1)
11154 +                       out_val |= 0x80;
11155 +               else
11156 +                       out_val &= 0x7f;
11157 +               if (bitcnt==8) {
11158 +                       if (d_cnt == dsize) return 0;
11159 +                       dst[d_cnt++] = out_val;
11160 +                       bitcnt = 0;
11161 +               }
11162 +               val >>= 1;
11163 +       }
11164 +       if (bitcnt) {
11165 +               while (8>bitcnt++) {
11166 +                       out_val >>= 1;
11167 +                       out_val |= 0x80;
11168 +               }
11169 +               if (d_cnt == dsize) return 0;
11170 +               dst[d_cnt++] = out_val;
11171 +       }
11172 +
11173 +       return d_cnt;
11174 +}
11175 +
11176 +void init_hdlc_state(struct hdlc_state *stateptr, int mode)
11177 +{
11178 +       stateptr->state = HDLC_ZERO_SEARCH;
11179 +       stateptr->r_one = 0;
11180 +       stateptr->r_val = 0;
11181 +       stateptr->o_bitcnt = 0;
11182 +       stateptr->i_bitcnt = 0;
11183 +       stateptr->insane_mode = mode;
11184 +}
11185 +
11186 +/* Optimization suggestion: A similar state machine could surely
11187 + * be developed for this function as well.
11188 + */
11189 +
11190 +int read_raw_hdlc_data(struct hdlc_state *saved_state,
11191 +                       u_char *src, u_int slen, u_char *dst, u_int dsize)
11192 +{
11193 +       int retval=0;
11194 +       register u_char val;
11195 +       register u_char state = saved_state->state;
11196 +       register u_char r_one = saved_state->r_one;
11197 +       register u_char r_val = saved_state->r_val;
11198 +       register u_int o_bitcnt = saved_state->o_bitcnt;
11199 +       register u_int i_bitcnt = saved_state->i_bitcnt;
11200 +       register u_int fcs    = saved_state->fcs;
11201 +       register u_int *isrc = (u_int *) src;
11202 +        
11203 +       /* Use i_bitcnt (bit offset into source buffer) to reload "val"
11204 +        * in case we're starting up again partway through a source buffer
11205 +        */
11206 +
11207 +       if ((i_bitcnt >> 3) < slen) {
11208 +               if (saved_state->insane_mode==1) {
11209 +                       val = isrc[(i_bitcnt >> 3)] & 0xff;
11210 +               } else if (saved_state->insane_mode==2) {
11211 +                       val = (isrc[i_bitcnt >> 3] >>8) & 0xff;
11212 +               } else {
11213 +                       val = src[i_bitcnt >> 3];
11214 +               }
11215 +               val >>= i_bitcnt & 7;
11216 +       }
11217 +
11218 +       /* One bit per loop.  Keep going until we've got something to
11219 +        * report (retval != 0), or we exhaust the source buffer
11220 +        */
11221 +
11222 +       while ((retval == 0) && ((i_bitcnt >> 3) < slen)) {
11223 +               if ((i_bitcnt & 7) == 0) {
11224 +                       if (saved_state->insane_mode==1) {
11225 +                               val = isrc[(i_bitcnt >> 3)] & 0xff;
11226 +                       } else if (saved_state->insane_mode==2) {
11227 +                               val = (isrc[i_bitcnt >> 3] >>8) & 0xff;
11228 +                       } else {
11229 +                               val = src[i_bitcnt >> 3];
11230 +                       }
11231 +#ifdef DEBUGME
11232 +                       printf("Input byte %d: 0x%2x\n", i_bitcnt>>3, val);
11233 +#endif
11234 +                       if (val == 0xff) {
11235 +                               state = HDLC_ZERO_SEARCH;
11236 +                               o_bitcnt = 0;
11237 +                               r_one = 0;
11238 +                               i_bitcnt += 8;
11239 +                               continue;
11240 +                       }
11241 +               }
11242 +
11243 +#ifdef DEBUGME
11244 +               /* printf("Data bit=%d (%d/%d)\n", val&1, i_bitcnt>>3, i_bitcnt&7);*/
11245 +#endif
11246 +
11247 +               if (state == HDLC_ZERO_SEARCH) {
11248 +                       if (val & 1) {
11249 +                               r_one++;
11250 +                       } else {
11251 +                               r_one=0;
11252 +                               state= HDLC_FLAG_SEARCH;
11253 +                       }
11254 +               } else if (state == HDLC_FLAG_SEARCH) { 
11255 +                       if (val & 1) {
11256 +                               r_one++;
11257 +                               if (r_one>6) {
11258 +                                       state=HDLC_ZERO_SEARCH;
11259 +                               }
11260 +                       } else {
11261 +                               if (r_one==6) {
11262 +                                       o_bitcnt=0;
11263 +                                       r_val=0;
11264 +                                       state=HDLC_FLAG_FOUND;
11265 +                               }
11266 +                               r_one=0;
11267 +                       }
11268 +               } else if (state ==  HDLC_FLAG_FOUND) {
11269 +                       if (val & 1) {
11270 +                               r_one++;
11271 +                               if (r_one>6) {
11272 +                                       state=HDLC_ZERO_SEARCH;
11273 +                               } else {
11274 +                                       r_val >>= 1;
11275 +                                       r_val |= 0x80;
11276 +                                       o_bitcnt++;
11277 +                               }
11278 +                       } else {
11279 +                               if (r_one==6) {
11280 +                                       o_bitcnt=0;
11281 +                                       r_val=0;
11282 +                                       r_one=0;
11283 +                                       i_bitcnt++;
11284 +                                       val >>= 1;
11285 +                                       continue;
11286 +                               } else if (r_one!=5) {
11287 +                                       r_val >>= 1;
11288 +                                       r_val &= 0x7f;
11289 +                                       o_bitcnt++;
11290 +                               }
11291 +                               r_one=0;        
11292 +                       }
11293 +                       if ((state != HDLC_ZERO_SEARCH) &&
11294 +                               !(o_bitcnt & 7)) {
11295 +#ifdef DEBUGME
11296 +                               printf("HDLC_FRAME_FOUND at i_bitcnt:%d\n",i_bitcnt);
11297 +#endif
11298 +                               state=HDLC_FRAME_FOUND;
11299 +                               fcs = PPP_INITFCS;
11300 +                               dst[0] = r_val;
11301 +                               fcs = PPP_FCS (fcs, r_val);
11302 +                       }
11303 +               } else if (state ==  HDLC_FRAME_FOUND) {
11304 +                       if (val & 1) {
11305 +                               r_one++;
11306 +                               if (r_one>6) {
11307 +                                       state=HDLC_ZERO_SEARCH;
11308 +                                       o_bitcnt=0;
11309 +                               } else {
11310 +                                       r_val >>= 1;
11311 +                                       r_val |= 0x80;
11312 +                                       o_bitcnt++;
11313 +                               }
11314 +                       } else {
11315 +                               if (r_one==6) {
11316 +                                       r_val=0; 
11317 +                                       r_one=0;
11318 +                                       o_bitcnt++;
11319 +                                       if (o_bitcnt & 7) {
11320 +                                               /* Alignment error */
11321 +#ifdef DEBUGME
11322 +                                               printf("Alignment error\n");
11323 +#endif
11324 +                                               state=HDLC_FLAG_SEARCH;
11325 +                                               retval = -1;
11326 +                                       } else if (fcs==PPP_GOODFCS) {
11327 +                                               /* Valid frame */
11328 +                                               state=HDLC_FLAG_FOUND;
11329 +                                               retval = (o_bitcnt>>3)-3;
11330 +                                       } else {
11331 +                                               /* CRC error */
11332 +#ifdef DEBUGME
11333 +                                               printf("CRC error; fcs was 0x%x, should have been 0x%x\n", fcs, PPP_GOODFCS);
11334 +#endif
11335 +                                               state=HDLC_FLAG_FOUND;
11336 +                                               retval = -1;
11337 +                                       }
11338 +                               } else if (r_one==5) {
11339 +                                       r_one=0;
11340 +                                       i_bitcnt++;
11341 +                                       val >>= 1;
11342 +                                       continue;
11343 +                               } else {
11344 +                                       r_val >>= 1;
11345 +                                       r_val &= 0x7f;
11346 +                                       o_bitcnt++;
11347 +                               }
11348 +                               r_one=0;        
11349 +                       }
11350 +                       if ((state == HDLC_FRAME_FOUND) &&
11351 +                               !(o_bitcnt & 7)) {
11352 +                               if ((o_bitcnt>>3)>=dsize) {
11353 +                                       /* Buffer overflow error */
11354 +#ifdef DEBUGME
11355 +                                       printf("Buffer overflow error\n");
11356 +#endif
11357 +                                       r_val=0; 
11358 +                                       state=HDLC_FLAG_SEARCH;
11359 +                                       retval = -1;
11360 +                               } else {
11361 +                                       dst[(o_bitcnt>>3)-1] = r_val;
11362 +                                       fcs = PPP_FCS (fcs, r_val);
11363 +#ifdef DEBUGME
11364 +                                       printf("Output byte %d: 0x%02x; FCS 0x%04x\n", (o_bitcnt>>3)-1, r_val, fcs);
11365 +#endif
11366 +                               }
11367 +                       }
11368 +               }
11369 +               i_bitcnt ++;
11370 +               val >>= 1;
11371 +       }
11372 +
11373 +       /* We exhausted the source buffer before anything else happened
11374 +        * (retval==0).  Reset i_bitcnt in expectation of a new source
11375 +        * buffer.  Other, we either had an error or a valid frame, so
11376 +        * reset o_bitcnt in expectation of a new destination buffer.
11377 +        */
11378 +
11379 +       if (retval == 0) {
11380 +               i_bitcnt = 0;
11381 +       } else {
11382 +               o_bitcnt = 0;
11383 +       }
11384 +
11385 +       saved_state->state = state;
11386 +       saved_state->r_one = r_one;
11387 +       saved_state->r_val = r_val;
11388 +       saved_state->fcs = fcs;
11389 +       saved_state->o_bitcnt = o_bitcnt;
11390 +       saved_state->i_bitcnt = i_bitcnt;
11391 +
11392 +       return (retval);
11393 +}
11394 +
11395 +
11396 +
11397 +#ifdef DEBUGME
11398 +
11399 +char buffer[1024];
11400 +char obuffer[1024];
11401 +
11402 +main()
11403 +{
11404 +  int buflen=0;
11405 +  int len;
11406 +  struct hdlc_state hdlc_state;
11407 +
11408 +  while((buffer[buflen] = getc(stdin)) != EOF && buflen<1024) buflen++;
11409 +
11410 +  printf("buflen = %d\n", buflen);
11411 +
11412 +  init_hdlc_state(&hdlc_state, 0);
11413 +
11414 +  while (len = read_raw_hdlc_data(&hdlc_state,buffer,buflen,obuffer,1024)) {
11415 +    if (len == -1) printf("Error @ byte %d/bit %d\n",
11416 +                         hdlc_state.i_bitcnt>>3, hdlc_state.i_bitcnt & 7);
11417 +    else {
11418 +      printf("Frame received: len %d\n", len);
11419 +    }
11420 +  }
11421 +
11422 +  printf("Done\n");
11423 +}
11424 +
11425 +#endif
11426 Index: linux-2.4.35.4/drivers/isdn/hisax/rawhdlc.h
11427 ===================================================================
11428 --- /dev/null   1970-01-01 00:00:00.000000000 +0000
11429 +++ linux-2.4.35.4/drivers/isdn/hisax/rawhdlc.h 2007-12-15 05:19:55.647592212 +0100
11430 @@ -0,0 +1,28 @@
11431 +/* $Id: rawhdlc.h,v 1.5 2001/09/24 13:22:57 kai Exp $
11432 + *
11433 + * Author     Brent Baccala
11434 + * Copyright  by Brent Baccala <baccala@FreeSoft.org>
11435 + *
11436 + * This software may be used and distributed according to the terms
11437 + * of the GNU General Public License, incorporated herein by reference.
11438 + *
11439 + */
11440 +
11441 +#ifndef RAWHDLC_H
11442 +struct hdlc_state {
11443 +       char insane_mode;
11444 +       u_char state;
11445 +       u_char r_one;
11446 +       u_char r_val;
11447 +       u_int o_bitcnt;
11448 +       u_int i_bitcnt;
11449 +       u_int fcs;
11450 +};
11451 +
11452 +
11453 +int make_raw_hdlc_data(u_char *src, u_int slen, u_char *dst, u_int dsize);
11454 +void init_hdlc_state(struct hdlc_state *stateptr, int mode);
11455 +int read_raw_hdlc_data(struct hdlc_state *saved_state,
11456 +                       u_char *src, u_int slen, u_char *dst, u_int dsize);
11457 +#define RAWHDLC_H
11458 +#endif
11459 Index: linux-2.4.35.4/drivers/isdn/hisax/s0box.c
11460 ===================================================================
11461 --- linux-2.4.35.4.orig/drivers/isdn/hisax/s0box.c      2007-12-15 05:19:40.346720268 +0100
11462 +++ linux-2.4.35.4/drivers/isdn/hisax/s0box.c   2007-12-15 05:19:55.647592212 +0100
11463 @@ -1,4 +1,4 @@
11464 -/* $Id: s0box.c,v 1.1.4.1 2001/11/20 14:19:36 kai Exp $
11465 +/* $Id: s0box.c,v 2.6 2001/09/24 13:22:57 kai Exp $
11466   *
11467   * low level stuff for Creatix S0BOX
11468   *
11469 @@ -18,7 +18,7 @@
11470  #include "isdnl1.h"
11471  
11472  extern const char *CardType[];
11473 -const char *s0box_revision = "$Revision: 1.1.4.1 $";
11474 +const char *s0box_revision = "$Revision: 2.6 $";
11475  
11476  static inline void
11477  writereg(unsigned int padr, signed int addr, u_char off, u_char val) {
11478 Index: linux-2.4.35.4/drivers/isdn/hisax/saphir.c
11479 ===================================================================
11480 --- linux-2.4.35.4.orig/drivers/isdn/hisax/saphir.c     2007-12-15 05:19:40.350720494 +0100
11481 +++ linux-2.4.35.4/drivers/isdn/hisax/saphir.c  2007-12-15 05:19:55.647592212 +0100
11482 @@ -1,4 +1,4 @@
11483 -/* $Id: saphir.c,v 1.1.4.1 2001/11/20 14:19:36 kai Exp $
11484 +/* $Id: saphir.c,v 1.10 2001/09/24 13:22:57 kai Exp $
11485   *
11486   * low level stuff for HST Saphir 1
11487   *
11488 @@ -20,7 +20,7 @@
11489  #include "isdnl1.h"
11490  
11491  extern const char *CardType[];
11492 -static char *saphir_rev = "$Revision: 1.1.4.1 $";
11493 +static char *saphir_rev = "$Revision: 1.10 $";
11494  
11495  #define byteout(addr,val) outb(val,addr)
11496  #define bytein(addr) inb(addr)
11497 Index: linux-2.4.35.4/drivers/isdn/hisax/sedlbauer.c
11498 ===================================================================
11499 --- linux-2.4.35.4.orig/drivers/isdn/hisax/sedlbauer.c  2007-12-15 05:19:40.358720950 +0100
11500 +++ linux-2.4.35.4/drivers/isdn/hisax/sedlbauer.c       2007-12-15 05:19:55.651592441 +0100
11501 @@ -1,4 +1,4 @@
11502 -/* $Id: sedlbauer.c,v 1.1.4.1 2001/11/20 14:19:36 kai Exp $
11503 +/* $Id: sedlbauer.c,v 1.34 2002/02/09 21:00:57 keil Exp $
11504   *
11505   * low level stuff for Sedlbauer cards
11506   * includes support for the Sedlbauer speed star (speed star II),
11507 @@ -48,18 +48,19 @@
11508  #include "isar.h"
11509  #include "isdnl1.h"
11510  #include <linux/pci.h>
11511 -#include <linux/isapnp.h>
11512 +#include <linux/isdn_compat.h>
11513  
11514  extern const char *CardType[];
11515  
11516 -const char *Sedlbauer_revision = "$Revision: 1.1.4.1 $";
11517 +const char *Sedlbauer_revision = "$Revision: 1.34 $";
11518  
11519  const char *Sedlbauer_Types[] =
11520         {"None", "speed card/win", "speed star", "speed fax+",
11521         "speed win II / ISDN PC/104", "speed star II", "speed pci",
11522 -       "speed fax+ pyramid", "speed fax+ pci"};
11523 +       "speed fax+ pyramid", "speed fax+ pci", "HST Saphir III"};
11524  
11525  #define PCI_SUBVENDOR_SPEEDFAX_PYRAMID 0x51
11526 +#define PCI_SUBVENDOR_HST_SAPHIR3      0x52
11527  #define PCI_SUBVENDOR_SEDLBAUER_PCI    0x53
11528  #define PCI_SUBVENDOR_SPEEDFAX_PCI     0x54
11529  #define PCI_SUB_ID_SEDLBAUER           0x01
11530 @@ -72,6 +73,7 @@
11531  #define SEDL_SPEED_PCI         6
11532  #define SEDL_SPEEDFAX_PYRAMID  7
11533  #define SEDL_SPEEDFAX_PCI      8
11534 +#define HST_SAPHIR3            9
11535  
11536  #define SEDL_CHIP_TEST         0
11537  #define SEDL_CHIP_ISAC_HSCX    1
11538 @@ -531,21 +533,6 @@
11539  
11540  static struct pci_dev *dev_sedl __devinitdata = NULL;
11541  
11542 -#ifdef __ISAPNP__
11543 -static struct isapnp_device_id sedl_ids[] __initdata = {
11544 -       { ISAPNP_VENDOR('S', 'A', 'G'), ISAPNP_FUNCTION(0x01),
11545 -         ISAPNP_VENDOR('S', 'A', 'G'), ISAPNP_FUNCTION(0x01), 
11546 -         (unsigned long) "Speed win" },
11547 -       { ISAPNP_VENDOR('S', 'A', 'G'), ISAPNP_FUNCTION(0x02),
11548 -         ISAPNP_VENDOR('S', 'A', 'G'), ISAPNP_FUNCTION(0x02), 
11549 -         (unsigned long) "Speed Fax+" },
11550 -       { 0, }
11551 -};
11552 -
11553 -static struct isapnp_device_id *pdev = &sedl_ids[0];
11554 -static struct pci_bus *pnp_c __devinitdata = NULL;
11555 -#endif
11556 -
11557  int __devinit
11558  setup_sedlbauer(struct IsdnCard *card)
11559  {
11560 @@ -581,57 +568,6 @@
11561                         bytecnt = 16;
11562                 }
11563         } else {
11564 -#ifdef __ISAPNP__
11565 -               if (isapnp_present()) {
11566 -                       struct pci_bus *pb;
11567 -                       struct pci_dev *pd;
11568 -
11569 -                       while(pdev->card_vendor) {
11570 -                               if ((pb = isapnp_find_card(pdev->card_vendor,
11571 -                                       pdev->card_device, pnp_c))) {
11572 -                                       pnp_c = pb;
11573 -                                       pd = NULL;
11574 -                                       if ((pd = isapnp_find_dev(pnp_c,
11575 -                                               pdev->vendor, pdev->function, pd))) {
11576 -                                               printk(KERN_INFO "HiSax: %s detected\n",
11577 -                                                       (char *)pdev->driver_data);
11578 -                                               pd->prepare(pd);
11579 -                                               pd->deactivate(pd);
11580 -                                               pd->activate(pd);
11581 -                                               card->para[1] =
11582 -                                                       pd->resource[0].start;
11583 -                                               card->para[0] =
11584 -                                                       pd->irq_resource[0].start;
11585 -                                               if (!card->para[0] || !card->para[1]) {
11586 -                                                       printk(KERN_ERR "Sedlbauer PnP:some resources are missing %ld/%lx\n",
11587 -                                                               card->para[0], card->para[1]);
11588 -                                                       pd->deactivate(pd);
11589 -                                                       return(0);
11590 -                                               }
11591 -                                               cs->hw.sedl.cfg_reg = card->para[1];
11592 -                                               cs->irq = card->para[0];
11593 -                                               if (pdev->function == ISAPNP_FUNCTION(0x2)) {
11594 -                                                       cs->subtyp = SEDL_SPEED_FAX;
11595 -                                                       cs->hw.sedl.chip = SEDL_CHIP_ISAC_ISAR;
11596 -                                                       bytecnt = 16;
11597 -                                               } else {
11598 -                                                       cs->subtyp = SEDL_SPEED_CARD_WIN;
11599 -                                                       cs->hw.sedl.chip = SEDL_CHIP_TEST;
11600 -                                               }
11601 -                                               goto ready;
11602 -                                       } else {
11603 -                                               printk(KERN_ERR "Sedlbauer PnP: PnP error card found, no device\n");
11604 -                                               return(0);
11605 -                                       }
11606 -                               }
11607 -                               pdev++;
11608 -                               pnp_c=NULL;
11609 -                       } 
11610 -                       if (!pdev->card_vendor) {
11611 -                               printk(KERN_INFO "Sedlbauer PnP: no ISAPnP card found\n");
11612 -                       }
11613 -               }
11614 -#endif
11615  /* Probe for Sedlbauer speed pci */
11616  #if CONFIG_PCI
11617                 if (!pci_present()) {
11618 @@ -647,15 +583,15 @@
11619                                 printk(KERN_WARNING "Sedlbauer: No IRQ for PCI card found\n");
11620                                 return(0);
11621                         }
11622 -                       cs->hw.sedl.cfg_reg = pci_resource_start(dev_sedl, 0);
11623 +                       cs->hw.sedl.cfg_reg = pci_resource_start_io(dev_sedl, 0);
11624                 } else {
11625                         printk(KERN_WARNING "Sedlbauer: No PCI card found\n");
11626                         return(0);
11627                 }
11628                 cs->irq_flags |= SA_SHIRQ;
11629                 cs->hw.sedl.bus = SEDL_BUS_PCI;
11630 -               sub_vendor_id = dev_sedl->subsystem_vendor;
11631 -               sub_id = dev_sedl->subsystem_device;
11632 +               pci_get_sub_vendor(dev_sedl,sub_vendor_id);
11633 +               pci_get_sub_system(dev_sedl,sub_id);
11634                 printk(KERN_INFO "Sedlbauer: PCI subvendor:%x subid %x\n",
11635                         sub_vendor_id, sub_id);
11636                 printk(KERN_INFO "Sedlbauer: PCI base adr %#x\n",
11637 @@ -670,6 +606,9 @@
11638                 } else if (sub_vendor_id == PCI_SUBVENDOR_SPEEDFAX_PCI) {
11639                         cs->hw.sedl.chip = SEDL_CHIP_ISAC_ISAR;
11640                         cs->subtyp = SEDL_SPEEDFAX_PCI;
11641 +               } else if (sub_vendor_id == PCI_SUBVENDOR_HST_SAPHIR3) {
11642 +                       cs->hw.sedl.chip = SEDL_CHIP_IPAC;
11643 +                       cs->subtyp = HST_SAPHIR3;
11644                 } else if (sub_vendor_id == PCI_SUBVENDOR_SEDLBAUER_PCI) {
11645                         cs->hw.sedl.chip = SEDL_CHIP_IPAC;
11646                         cs->subtyp = SEDL_SPEED_PCI;
11647 @@ -683,8 +622,8 @@
11648                 cs->hw.sedl.reset_off = SEDL_ISAR_PCI_ISAR_RESET_OFF;
11649                 byteout(cs->hw.sedl.cfg_reg, 0xff);
11650                 byteout(cs->hw.sedl.cfg_reg, 0x00);
11651 -               byteout(cs->hw.sedl.cfg_reg+ 2, 0xdd);
11652 -               byteout(cs->hw.sedl.cfg_reg+ 5, 0x02);
11653 +               byteout(cs->hw.sedl.cfg_reg +2, 0xdd);
11654 +               byteout(cs->hw.sedl.cfg_reg +5, 0x02);
11655                 byteout(cs->hw.sedl.cfg_reg +3, cs->hw.sedl.reset_on);
11656                 save_flags(flags);
11657                 sti();
11658 @@ -697,7 +636,7 @@
11659                 return (0);
11660  #endif /* CONFIG_PCI */
11661         }       
11662 -ready: 
11663 +       
11664         /* In case of the sedlbauer pcmcia card, this region is in use,
11665          * reserved for us by the card manager. So we do not check it
11666          * here, it would fail.
11667 Index: linux-2.4.35.4/drivers/isdn/hisax/sportster.c
11668 ===================================================================
11669 --- linux-2.4.35.4.orig/drivers/isdn/hisax/sportster.c  2007-12-15 05:19:40.366721408 +0100
11670 +++ linux-2.4.35.4/drivers/isdn/hisax/sportster.c       2007-12-15 05:19:55.651592441 +0100
11671 @@ -1,4 +1,4 @@
11672 -/* $Id: sportster.c,v 1.1.4.1 2001/11/20 14:19:36 kai Exp $
11673 +/* $Id: sportster.c,v 1.16 2001/09/24 13:22:57 kai Exp $
11674   *
11675   * low level stuff for USR Sportster internal TA
11676   *
11677 @@ -20,7 +20,7 @@
11678  #include "isdnl1.h"
11679  
11680  extern const char *CardType[];
11681 -const char *sportster_revision = "$Revision: 1.1.4.1 $";
11682 +const char *sportster_revision = "$Revision: 1.16 $";
11683  
11684  #define byteout(addr,val) outb(val,addr)
11685  #define bytein(addr) inb(addr)
11686 Index: linux-2.4.35.4/drivers/isdn/hisax/st5481-debug.h
11687 ===================================================================
11688 --- /dev/null   1970-01-01 00:00:00.000000000 +0000
11689 +++ linux-2.4.35.4/drivers/isdn/hisax/st5481-debug.h    2007-12-15 05:19:55.651592441 +0100
11690 @@ -0,0 +1,103 @@
11691 +#define ST5481_DEBUG 0x0
11692 +
11693 +#if ST5481_DEBUG
11694 +
11695 +
11696 +/*
11697 +  DEBUG flags. Set compile option  ST5481_DEBUG with the following bits set to trace
11698 +  the given subsections:
11699 +
11700 +  0x01:  USB
11701 +  0x02:  D
11702 +  0x04:  B
11703 +  0x08:  PH
11704 +  0x10:  PACKET_DUMP D out
11705 +  0x20:  ISO_DUMP D out
11706 +  0x40:  PACKET_DUMP D in
11707 +  0x80:  ISO_DUMP in
11708 +  0x100: PACKET_DUMP B out
11709 +  0x200: ISO_DUMP B out
11710 +  0x400: PACKET_DUMP B in
11711 +*/
11712 +
11713 +#define DBG(level, format, arg...) \
11714 +if (level &  ST5481_DEBUG) \
11715 +printk(KERN_DEBUG __FUNCTION__ ": " format "\n" , ## arg) \
11716 +
11717 +static inline void 
11718 +dump_packet(const char *name,const u_char *data,int pkt_len)
11719 +{
11720 +#define DUMP_HDR_SIZE 200
11721 +#define DUMP_TLR_SIZE 8
11722 +       if (pkt_len) {
11723 +               int i,len1,len2;
11724 +
11725 +               printk(KERN_DEBUG "%s: length=%d,data=",name,pkt_len);
11726 +
11727 +               if (pkt_len >  DUMP_HDR_SIZE+ DUMP_TLR_SIZE) {
11728 +                       len1 = DUMP_HDR_SIZE;
11729 +                       len2 = DUMP_TLR_SIZE;
11730 +               } else {
11731 +                       len1 = pkt_len > DUMP_HDR_SIZE ? DUMP_HDR_SIZE : pkt_len;
11732 +                       len2 = 0;                       
11733 +               }
11734 +               for (i = 0; i < len1; ++i) {
11735 +                       printk ("%.2x", data[i]);
11736 +               }
11737 +               if (len2) {
11738 +                       printk ("..");
11739 +                       for (i = pkt_len-DUMP_TLR_SIZE; i < pkt_len; ++i) {
11740 +                               printk ("%.2x", data[i]);
11741 +                       }
11742 +               }
11743 +               printk ("\n");
11744 +       }
11745 +#undef DUMP_HDR_SIZE
11746 +#undef DUMP_TLR_SIZE
11747 +}
11748 +
11749 +static inline void 
11750 +dump_iso_packet(const char *name,urb_t *urb)
11751 +{
11752 +       int i,j;
11753 +       int len,ofs;
11754 +       u_char *data;
11755 +
11756 +       printk(KERN_DEBUG "%s: packets=%d,errors=%d\n",
11757 +              name,urb->number_of_packets,urb->error_count);
11758 +       for (i = 0; i  < urb->number_of_packets; ++i) {
11759 +               if (urb->pipe & USB_DIR_IN) {
11760 +                       len = urb->iso_frame_desc[i].actual_length;
11761 +               } else {
11762 +                       len = urb->iso_frame_desc[i].length;
11763 +               }
11764 +               ofs = urb->iso_frame_desc[i].offset;
11765 +               printk(KERN_DEBUG "len=%.2d,ofs=%.3d ",len,ofs);
11766 +               if (len) {
11767 +                       data = urb->transfer_buffer+ofs;
11768 +                       for (j=0; j < len; j++) {
11769 +                               printk ("%.2x", data[j]);
11770 +                       }
11771 +               }
11772 +               printk("\n");
11773 +       }
11774 +}
11775 +
11776 +#define DUMP_PACKET(level,data,count) \
11777 +  if (level & ST5481_DEBUG) dump_packet(__FUNCTION__,data,count)
11778 +#define DUMP_SKB(level,skb) \
11779 +  if ((level & ST5481_DEBUG) && skb) dump_packet(__FUNCTION__,skb->data,skb->len)
11780 +#define DUMP_ISO_PACKET(level,urb) \
11781 +  if (level & ST5481_DEBUG) dump_iso_packet(__FUNCTION__,urb)
11782 +
11783 +#else
11784 +
11785 +#define DBG(level,format, arg...) do {} while (0)
11786 +#define DUMP_PACKET(level,data,count) do {} while (0)
11787 +#define DUMP_SKB(level,skb) do {} while (0)
11788 +#define DUMP_ISO_PACKET(level,urb) do {} while (0)
11789 +
11790 +#endif
11791 +
11792 +
11793 +
11794 Index: linux-2.4.35.4/drivers/isdn/hisax/st5481.h
11795 ===================================================================
11796 --- linux-2.4.35.4.orig/drivers/isdn/hisax/st5481.h     2007-12-15 05:19:40.378722089 +0100
11797 +++ linux-2.4.35.4/drivers/isdn/hisax/st5481.h  2007-12-15 05:19:55.651592441 +0100
11798 @@ -219,15 +219,15 @@
11799  #define L1_EVENT_COUNT (EV_TIMER3 + 1)
11800  
11801  #define ERR(format, arg...) \
11802 -printk(KERN_ERR "%s:%s: " format "\n" , __FILE__,  __FUNCTION__ , ## arg)
11803 +printk(KERN_ERR __FILE__ ": " __FUNCTION__ ": " format "\n" , ## arg)
11804  
11805  #define WARN(format, arg...) \
11806 -printk(KERN_WARNING "%s:%s: " format "\n" , __FILE__,  __FUNCTION__ , ## arg)
11807 +printk(KERN_WARNING __FILE__ ": " __FUNCTION__ ": " format "\n" , ## arg)
11808  
11809  #define INFO(format, arg...) \
11810 -printk(KERN_INFO "%s:%s: " format "\n" , __FILE__,  __FUNCTION__ , ## arg)
11811 +printk(KERN_INFO __FILE__ ": " __FUNCTION__ ": " format "\n" , ## arg)
11812  
11813 -#include "isdnhdlc.h"
11814 +#include "st5481_hdlc.h"
11815  #include "fsm.h"
11816  #include "hisax_if.h"
11817  #include <linux/skbuff.h>
11818 @@ -236,7 +236,7 @@
11819   * FIFO handling
11820   */
11821  
11822 -/* Generic FIFO structure */
11823 +/* Generic FIFO structure */ 
11824  struct fifo {
11825         u_char r,w,count,size;
11826         spinlock_t lock;
11827 @@ -270,7 +270,7 @@
11828                 index = -1;
11829         } else {
11830                 // Return index where to get the next data to add to the FIFO
11831 -               index = fifo->w++ & (fifo->size-1);
11832 +               index = fifo->w++ & (fifo->size-1); 
11833                 fifo->count++;
11834         }
11835         spin_unlock_irqrestore(&fifo->lock, flags);
11836 @@ -289,13 +289,13 @@
11837                 return -1;
11838         }
11839  
11840 -       spin_lock_irqsave(&fifo->lock, flags);
11841 +       spin_lock_irqsave(&fifo->lock, flags);          
11842         if (!fifo->count) {
11843                 // FIFO empty
11844                 index = -1;
11845         } else {
11846                 // Return index where to get the next data from the FIFO
11847 -               index = fifo->r++ & (fifo->size-1);
11848 +               index = fifo->r++ & (fifo->size-1); 
11849                 fifo->count--;
11850         }
11851         spin_unlock_irqrestore(&fifo->lock, flags);
11852 @@ -309,7 +309,7 @@
11853  typedef void (*ctrl_complete_t)(void *);
11854  
11855  typedef struct ctrl_msg {
11856 -       struct usb_ctrlrequest dr;
11857 +       devrequest dr;
11858         ctrl_complete_t complete;
11859         void *context;
11860  } ctrl_msg; 
11861 @@ -336,7 +336,7 @@
11862  };
11863  
11864  struct st5481_d_out {
11865 -       struct isdnhdlc_vars hdlc_state;
11866 +       struct hdlc_vars hdlc_state;
11867         struct urb *urb[2]; /* double buffering */
11868         unsigned long busy;
11869         struct sk_buff *tx_skb;
11870 @@ -344,7 +344,7 @@
11871  };
11872  
11873  struct st5481_b_out {
11874 -       struct isdnhdlc_vars hdlc_state;
11875 +       struct hdlc_vars hdlc_state;
11876         struct urb *urb[2]; /* double buffering */
11877         u_char flow_event;
11878         u_long busy;
11879 @@ -352,7 +352,7 @@
11880  };
11881  
11882  struct st5481_in {
11883 -       struct isdnhdlc_vars hdlc_state;
11884 +       struct hdlc_vars hdlc_state;
11885         struct urb *urb[2]; /* double buffering */
11886         int mode;
11887         int bufsize;
11888 @@ -478,7 +478,7 @@
11889    if (level & __debug_variable) dump_iso_packet(__FUNCTION__,urb)
11890  
11891  static void __attribute__((unused))
11892 -dump_iso_packet(const char *name,struct urb *urb)
11893 +dump_iso_packet(const char *name,urb_t *urb)
11894  {
11895         int i,j;
11896         int len,ofs;
11897 Index: linux-2.4.35.4/drivers/isdn/hisax/st5481_b.c
11898 ===================================================================
11899 --- linux-2.4.35.4.orig/drivers/isdn/hisax/st5481_b.c   2007-12-15 05:19:40.386722547 +0100
11900 +++ linux-2.4.35.4/drivers/isdn/hisax/st5481_b.c        2007-12-15 05:19:55.651592441 +0100
11901 @@ -67,28 +67,24 @@
11902                                 bytes_sent = buf_size - len;
11903                                 if (skb->len < bytes_sent)
11904                                         bytes_sent = skb->len;
11905 -                               {       /* swap tx bytes to get hearable audio data */
11906 -                                       register unsigned char *src  = skb->data;
11907 -                                       register unsigned char *dest = urb->transfer_buffer+len;
11908 -                                       register unsigned int count;
11909 -                                       for (count = 0; count < bytes_sent; count++)
11910 -                                               *dest++ = isdnhdlc_bit_rev_tab[*src++];
11911 -                               }
11912 +
11913 +                               memcpy(urb->transfer_buffer+len, skb->data, bytes_sent);
11914 +                               
11915                                 len += bytes_sent;
11916                         } else {
11917 -                               len += isdnhdlc_encode(&b_out->hdlc_state,
11918 -                                                      skb->data, skb->len, &bytes_sent,
11919 -                                                      urb->transfer_buffer+len, buf_size-len);
11920 +                               len += hdlc_encode(&b_out->hdlc_state, 
11921 +                                                  skb->data, skb->len, &bytes_sent,
11922 +                                                  urb->transfer_buffer+len, buf_size-len);
11923                         }
11924  
11925                         skb_pull(skb, bytes_sent);
11926 -
11927 +                       
11928                         if (!skb->len) {
11929                                 // Frame sent
11930                                 b_out->tx_skb = NULL;
11931                                 B_L1L2(bcs, PH_DATA | CONFIRM, (void *) skb->truesize);
11932                                 dev_kfree_skb_any(skb);
11933 -
11934 +                               
11935  /*                             if (!(bcs->tx_skb = skb_dequeue(&bcs->sq))) { */
11936  /*                                     st5481B_sched_event(bcs, B_XMTBUFREADY); */
11937  /*                             } */
11938 @@ -99,9 +95,9 @@
11939                                 len = buf_size;
11940                         } else {
11941                                 // Send flags
11942 -                               len += isdnhdlc_encode(&b_out->hdlc_state,
11943 -                                                      NULL, 0, &bytes_sent,
11944 -                                                      urb->transfer_buffer+len, buf_size-len);
11945 +                               len += hdlc_encode(&b_out->hdlc_state, 
11946 +                                                  NULL, 0, &bytes_sent,
11947 +                                                  urb->transfer_buffer+len, buf_size-len);
11948                         }
11949                 }       
11950         }
11951 @@ -213,7 +209,7 @@
11952         if (bcs->mode != L1_MODE_NULL) {
11953                 // Open the B channel
11954                 if (bcs->mode != L1_MODE_TRANS) {
11955 -                       isdnhdlc_out_init(&b_out->hdlc_state, 0, bcs->mode == L1_MODE_HDLC_56K);
11956 +                       hdlc_out_init(&b_out->hdlc_state, 0, bcs->mode == L1_MODE_HDLC_56K);
11957                 }
11958                 st5481_usb_pipe_reset(adapter, (bcs->channel+1)*2, NULL, NULL);
11959         
11960 @@ -279,7 +275,7 @@
11961                                       usb_b_out_complete, bcs);
11962  }
11963  
11964 -static void st5481_release_b_out(struct st5481_bcs *bcs)
11965 +static void __devexit st5481_release_b_out(struct st5481_bcs *bcs)
11966  {
11967         struct st5481_b_out *b_out = &bcs->b_out;
11968  
11969 @@ -320,7 +316,7 @@
11970  /*
11971   * Release buffers and URBs for the B channels
11972   */
11973 -void st5481_release_b(struct st5481_bcs *bcs)
11974 +void __devexit st5481_release_b(struct st5481_bcs *bcs)
11975  {
11976         DBG(4,"");
11977  
11978 Index: linux-2.4.35.4/drivers/isdn/hisax/st5481_d.c
11979 ===================================================================
11980 --- linux-2.4.35.4.orig/drivers/isdn/hisax/st5481_d.c   2007-12-15 05:19:40.394723003 +0100
11981 +++ linux-2.4.35.4/drivers/isdn/hisax/st5481_d.c        2007-12-15 05:19:55.655592670 +0100
11982 @@ -162,8 +162,8 @@
11983         {ST_L1_F8, EV_TIMER3,            l1_timer3},
11984         {ST_L1_F8, EV_IND_DP,            l1_go_f3},
11985         {ST_L1_F8, EV_IND_AP,            l1_go_f6},
11986 -       {ST_L1_F8, EV_IND_AI8,           l1_go_f7},
11987 -       {ST_L1_F8, EV_IND_AI10,          l1_go_f7},
11988 +       {ST_L1_F8, EV_IND_AI8,           l1_go_f8},
11989 +       {ST_L1_F8, EV_IND_AI10,          l1_go_f8},
11990         {ST_L1_F8, EV_IND_RSY,           l1_ignore},
11991  };
11992  
11993 @@ -297,7 +297,7 @@
11994         unsigned int num_packets, packet_offset;
11995         int len, buf_size, bytes_sent;
11996         struct sk_buff *skb;
11997 -       struct iso_packet_descriptor *desc;
11998 +       iso_packet_descriptor_t *desc;
11999  
12000         if (d_out->fsm.state != ST_DOUT_NORMAL)
12001                 return;
12002 @@ -313,15 +313,15 @@
12003         buf_size = NUM_ISO_PACKETS_D * SIZE_ISO_PACKETS_D_OUT;
12004         
12005         if (skb) {
12006 -               len = isdnhdlc_encode(&d_out->hdlc_state,
12007 -                                     skb->data, skb->len, &bytes_sent,
12008 -                                     urb->transfer_buffer, buf_size);
12009 +               len = hdlc_encode(&d_out->hdlc_state, 
12010 +                                 skb->data, skb->len, &bytes_sent,
12011 +                                 urb->transfer_buffer, buf_size);
12012                 skb_pull(skb,bytes_sent);
12013         } else {
12014                 // Send flags or idle
12015 -               len = isdnhdlc_encode(&d_out->hdlc_state,
12016 -                                     NULL, 0, &bytes_sent,
12017 -                                     urb->transfer_buffer, buf_size);
12018 +               len = hdlc_encode(&d_out->hdlc_state, 
12019 +                                 NULL, 0, &bytes_sent,
12020 +                                 urb->transfer_buffer, buf_size);
12021         }
12022         
12023         if (len < buf_size) {
12024 @@ -413,7 +413,7 @@
12025  
12026         DBG(2,"len=%d",skb->len);
12027  
12028 -       isdnhdlc_out_init(&d_out->hdlc_state, 1, 0);
12029 +       hdlc_out_init(&d_out->hdlc_state, 1, 0);
12030  
12031         if (test_and_set_bit(buf_nr, &d_out->busy)) {
12032                 WARN("ep %d urb %d busy %#lx", EP_D_OUT, buf_nr, d_out->busy);
12033 @@ -422,9 +422,9 @@
12034         urb = d_out->urb[buf_nr];
12035  
12036         DBG_SKB(0x10, skb);
12037 -       len = isdnhdlc_encode(&d_out->hdlc_state,
12038 -                             skb->data, skb->len, &bytes_sent,
12039 -                             urb->transfer_buffer, 16);
12040 +       len = hdlc_encode(&d_out->hdlc_state, 
12041 +                         skb->data, skb->len, &bytes_sent,
12042 +                         urb->transfer_buffer, 16);
12043         skb_pull(skb, bytes_sent);
12044  
12045         if(len < 16)
12046 @@ -673,7 +673,7 @@
12047                                       usb_d_out_complete, adapter);
12048  }
12049  
12050 -static void st5481_release_d_out(struct st5481_adapter *adapter)
12051 +static void __devexit st5481_release_d_out(struct st5481_adapter *adapter)
12052  {
12053         struct st5481_d_out *d_out = &adapter->d_out;
12054  
12055 @@ -723,7 +723,7 @@
12056         return retval;
12057  }
12058  
12059 -void st5481_release_d(struct st5481_adapter *adapter)
12060 +void __devexit st5481_release_d(struct st5481_adapter *adapter)
12061  {
12062         DBG(2,"");
12063  
12064 Index: linux-2.4.35.4/drivers/isdn/hisax/st5481_init.c
12065 ===================================================================
12066 --- linux-2.4.35.4.orig/drivers/isdn/hisax/st5481_init.c        2007-12-15 05:19:40.398723229 +0100
12067 +++ linux-2.4.35.4/drivers/isdn/hisax/st5481_init.c     2007-12-15 05:19:55.655592670 +0100
12068 @@ -14,6 +14,7 @@
12069   * TODO:
12070   *
12071   * b layer1 delay?
12072 + * hdlc as module
12073   * hotplug / unregister issues
12074   * mod_inc/dec_use_count
12075   * unify parts of d/b channel usb handling
12076 @@ -177,7 +178,7 @@
12077  static struct usb_driver st5481_usb_driver = {
12078         name: "st5481_usb",
12079         probe: probe_st5481,
12080 -       disconnect: __devexit_p(disconnect_st5481),
12081 +       disconnect: disconnect_st5481,
12082         id_table: st5481_ids,
12083  };
12084  
12085 Index: linux-2.4.35.4/drivers/isdn/hisax/st5481_usb.c
12086 ===================================================================
12087 --- linux-2.4.35.4.orig/drivers/isdn/hisax/st5481_usb.c 2007-12-15 05:19:40.406723687 +0100
12088 +++ linux-2.4.35.4/drivers/isdn/hisax/st5481_usb.c      2007-12-15 05:19:55.655592670 +0100
12089 @@ -41,9 +41,9 @@
12090                 (unsigned char *)&ctrl->msg_fifo.data[r_index];
12091         
12092         DBG(1,"request=0x%02x,value=0x%04x,index=%x",
12093 -           ((struct ctrl_msg *)urb->setup_packet)->dr.bRequest,
12094 -           ((struct ctrl_msg *)urb->setup_packet)->dr.wValue,
12095 -           ((struct ctrl_msg *)urb->setup_packet)->dr.wIndex);
12096 +           ((struct ctrl_msg *)urb->setup_packet)->dr.request,
12097 +           ((struct ctrl_msg *)urb->setup_packet)->dr.value,
12098 +           ((struct ctrl_msg *)urb->setup_packet)->dr.index);
12099  
12100         // Prepare the URB
12101         urb->dev = adapter->usb_dev;
12102 @@ -69,11 +69,11 @@
12103         }
12104         ctrl_msg = &ctrl->msg_fifo.data[w_index]; 
12105     
12106 -       ctrl_msg->dr.bRequestType = requesttype;
12107 -       ctrl_msg->dr.bRequest = request;
12108 -       ctrl_msg->dr.wValue = cpu_to_le16p(&value);
12109 -       ctrl_msg->dr.wIndex = cpu_to_le16p(&index);
12110 -       ctrl_msg->dr.wLength = 0;
12111 +       ctrl_msg->dr.requesttype = requesttype;
12112 +       ctrl_msg->dr.request = request;
12113 +       ctrl_msg->dr.value = cpu_to_le16p(&value);
12114 +       ctrl_msg->dr.index = cpu_to_le16p(&index);
12115 +       ctrl_msg->dr.length = 0;
12116         ctrl_msg->complete = complete;
12117         ctrl_msg->context = context;
12118  
12119 @@ -140,17 +140,17 @@
12120  
12121         ctrl_msg = (struct ctrl_msg *)urb->setup_packet;
12122         
12123 -       if (ctrl_msg->dr.bRequest == USB_REQ_CLEAR_FEATURE) {
12124 +       if (ctrl_msg->dr.request == USB_REQ_CLEAR_FEATURE) {
12125                 /* Special case handling for pipe reset */
12126 -               le16_to_cpus(&ctrl_msg->dr.wIndex);
12127 +               le16_to_cpus(&ctrl_msg->dr.index);
12128                 usb_endpoint_running(adapter->usb_dev,
12129 -                                    ctrl_msg->dr.wIndex & ~USB_DIR_IN, 
12130 -                                    (ctrl_msg->dr.wIndex & USB_DIR_IN) == 0);
12131 +                                    ctrl_msg->dr.index & ~USB_DIR_IN, 
12132 +                                    (ctrl_msg->dr.index & USB_DIR_IN) == 0);
12133  
12134                 /* toggle is reset on clear */
12135                 usb_settoggle(adapter->usb_dev, 
12136 -                             ctrl_msg->dr.wIndex & ~USB_DIR_IN, 
12137 -                             (ctrl_msg->dr.wIndex & USB_DIR_IN) == 0,
12138 +                             ctrl_msg->dr.index & ~USB_DIR_IN, 
12139 +                             (ctrl_msg->dr.index & USB_DIR_IN) == 0,
12140                               0);
12141  
12142  
12143 @@ -235,7 +235,7 @@
12144         struct usb_interface_descriptor *altsetting;
12145         struct usb_endpoint_descriptor *endpoint;
12146         int status;
12147 -       struct urb *urb;
12148 +       urb_t *urb;
12149         u_char *buf;
12150         
12151         DBG(1,"");
12152 @@ -307,7 +307,7 @@
12153   * Release buffers and URBs for the interrupt and control
12154   * endpoint.
12155   */
12156 -void st5481_release_usb(struct st5481_adapter *adapter)
12157 +void __devexit st5481_release_usb(struct st5481_adapter *adapter)
12158  {
12159         struct st5481_intr *intr = &adapter->intr;
12160         struct st5481_ctrl *ctrl = &adapter->ctrl;
12161 @@ -443,7 +443,7 @@
12162         return retval;
12163  }
12164  
12165 -void st5481_release_isocpipes(struct urb* urb[2])
12166 +void __devexit st5481_release_isocpipes(struct urb* urb[2])
12167  {
12168         int j;
12169  
12170 @@ -484,18 +484,16 @@
12171         ptr = urb->transfer_buffer;
12172         while (len > 0) {
12173                 if (in->mode == L1_MODE_TRANS) {
12174 -                       /* swap rx bytes to get hearable audio */
12175 -                       register unsigned char *dest = in->rcvbuf;
12176 +                       memcpy(in->rcvbuf, ptr, len);
12177                         status = len;
12178 -                       for (; len; len--)
12179 -                               *dest++ = isdnhdlc_bit_rev_tab[*ptr++];
12180 +                       len = 0;
12181                 } else {
12182 -                       status = isdnhdlc_decode(&in->hdlc_state, ptr, len, &count,
12183 -                                                in->rcvbuf, in->bufsize);
12184 +                       status = hdlc_decode(&in->hdlc_state, ptr, len, &count,
12185 +                                            in->rcvbuf, in->bufsize);
12186                         ptr += count;
12187                         len -= count;
12188                 }
12189 -
12190 +               
12191                 if (status > 0) {
12192                         // Good frame received
12193                         DBG(4,"count=%d",status);
12194 @@ -549,7 +547,7 @@
12195         return retval;
12196  }
12197  
12198 -void st5481_release_in(struct st5481_in *in)
12199 +void __devexit st5481_release_in(struct st5481_in *in)
12200  {
12201         DBG(2,"");
12202  
12203 @@ -562,8 +560,7 @@
12204   */
12205  int st5481_isoc_flatten(struct urb *urb)
12206  {
12207 -       struct iso_packet_descriptor *pipd;
12208 -       struct iso_packet_descriptor *pend;
12209 +       piso_packet_descriptor_t pipd,pend;
12210         unsigned char *src,*dst;
12211         unsigned int len;
12212         
12213 @@ -624,10 +621,15 @@
12214  
12215         if (in->mode != L1_MODE_NULL) {
12216                 if (in->mode != L1_MODE_TRANS)
12217 -                       isdnhdlc_rcv_init(&in->hdlc_state,
12218 -                                         in->mode == L1_MODE_HDLC_56K);
12219 +                       hdlc_rcv_init(&in->hdlc_state,
12220 +                                     in->mode == L1_MODE_HDLC_56K);
12221                 
12222                 st5481_usb_pipe_reset(in->adapter, in->ep, NULL, NULL);
12223 +#if 0
12224 +               st5481_usb_device_ctrl_msg(in->adapter, in->counter,
12225 +                                          in->packet_size,
12226 +                                          st5481_start_rcv, in);
12227 +#endif
12228                 st5481_usb_device_ctrl_msg(in->adapter, in->counter,
12229                                            in->packet_size,
12230                                            NULL, NULL);
12231 Index: linux-2.4.35.4/drivers/isdn/hisax/tei.c
12232 ===================================================================
12233 --- linux-2.4.35.4.orig/drivers/isdn/hisax/tei.c        2007-12-15 05:19:40.414724143 +0100
12234 +++ linux-2.4.35.4/drivers/isdn/hisax/tei.c     2007-12-15 05:19:55.655592670 +0100
12235 @@ -1,4 +1,4 @@
12236 -/* $Id: tei.c,v 1.1.4.1 2001/11/20 14:19:36 kai Exp $
12237 +/* $Id: tei.c,v 2.20 2001/09/24 13:22:57 kai Exp $
12238   *
12239   * Author       Karsten Keil
12240   *              based on the teles driver from Jan den Ouden
12241 @@ -21,7 +21,7 @@
12242  #include <linux/init.h>
12243  #include <linux/random.h>
12244  
12245 -const char *tei_revision = "$Revision: 1.1.4.1 $";
12246 +const char *tei_revision = "$Revision: 2.20 $";
12247  
12248  #define ID_REQUEST     1
12249  #define ID_ASSIGNED    2
12250 Index: linux-2.4.35.4/drivers/isdn/hisax/teleint.c
12251 ===================================================================
12252 --- linux-2.4.35.4.orig/drivers/isdn/hisax/teleint.c    2007-12-15 05:19:40.422724598 +0100
12253 +++ linux-2.4.35.4/drivers/isdn/hisax/teleint.c 2007-12-15 05:19:55.659592899 +0100
12254 @@ -1,4 +1,4 @@
12255 -/* $Id: teleint.c,v 1.1.4.1 2001/11/20 14:19:36 kai Exp $
12256 +/* $Id: teleint.c,v 1.16 2001/09/24 13:22:57 kai Exp $
12257   *
12258   * low level stuff for TeleInt isdn cards
12259   *
12260 @@ -19,7 +19,7 @@
12261  
12262  extern const char *CardType[];
12263  
12264 -const char *TeleInt_revision = "$Revision: 1.1.4.1 $";
12265 +const char *TeleInt_revision = "$Revision: 1.16 $";
12266  
12267  #define byteout(addr,val) outb(val,addr)
12268  #define bytein(addr) inb(addr)
12269 Index: linux-2.4.35.4/drivers/isdn/hisax/teles0.c
12270 ===================================================================
12271 --- linux-2.4.35.4.orig/drivers/isdn/hisax/teles0.c     2007-12-15 05:19:40.430725053 +0100
12272 +++ linux-2.4.35.4/drivers/isdn/hisax/teles0.c  2007-12-15 05:19:55.659592899 +0100
12273 @@ -1,4 +1,4 @@
12274 -/* $Id: teles0.c,v 1.1.4.1 2001/11/20 14:19:36 kai Exp $
12275 +/* $Id: teles0.c,v 2.15 2001/09/24 13:22:57 kai Exp $
12276   *
12277   * low level stuff for Teles Memory IO isdn cards
12278   *
12279 @@ -24,7 +24,7 @@
12280  
12281  extern const char *CardType[];
12282  
12283 -const char *teles0_revision = "$Revision: 1.1.4.1 $";
12284 +const char *teles0_revision = "$Revision: 2.15 $";
12285  
12286  #define TELES_IOMEM_SIZE       0x400
12287  #define byteout(addr,val) outb(val,addr)
12288 @@ -189,8 +189,10 @@
12289  {
12290         if (cs->hw.teles0.cfg_reg)
12291                 release_region(cs->hw.teles0.cfg_reg, 8);
12292 +#ifdef COMPAT_HAS_ISA_IOREMAP
12293         iounmap((unsigned char *)cs->hw.teles0.membase);
12294         release_mem_region(cs->hw.teles0.phymem, TELES_IOMEM_SIZE);
12295 +#endif
12296  }
12297  
12298  static int
12299 @@ -327,6 +329,7 @@
12300         /* 16.0 and 8.0 designed for IOM1 */
12301         test_and_set_bit(HW_IOM1, &cs->HW_Flags);
12302         cs->hw.teles0.phymem = card->para[1];
12303 +#ifdef COMPAT_HAS_ISA_IOREMAP
12304         if (check_mem_region(cs->hw.teles0.phymem, TELES_IOMEM_SIZE)) {
12305                 printk(KERN_WARNING
12306                         "HiSax: %s memory region %lx-%lx already in use\n",
12307 @@ -342,6 +345,9 @@
12308         }
12309         cs->hw.teles0.membase =
12310                 (unsigned long) ioremap(cs->hw.teles0.phymem, TELES_IOMEM_SIZE);
12311 +#else
12312 +       cs->hw.teles0.membase = cs->hw.teles0.phymem;
12313 +#endif
12314         printk(KERN_INFO
12315                "HiSax: %s config irq:%d mem:0x%lX cfg:0x%X\n",
12316                CardType[cs->typ], cs->irq,
12317 Index: linux-2.4.35.4/drivers/isdn/hisax/teles3.c
12318 ===================================================================
12319 --- linux-2.4.35.4.orig/drivers/isdn/hisax/teles3.c     2007-12-15 05:19:40.434725282 +0100
12320 +++ linux-2.4.35.4/drivers/isdn/hisax/teles3.c  2007-12-15 05:19:55.659592899 +0100
12321 @@ -1,4 +1,4 @@
12322 -/* $Id: teles3.c,v 1.1.4.1 2001/11/20 14:19:36 kai Exp $
12323 +/* $Id: teles3.c,v 2.19 2001/09/24 13:22:57 kai Exp $
12324   *
12325   * low level stuff for Teles 16.3 & PNP isdn cards
12326   *
12327 @@ -15,14 +15,13 @@
12328   */
12329  #define __NO_VERSION__
12330  #include <linux/init.h>
12331 -#include <linux/isapnp.h>
12332  #include "hisax.h"
12333  #include "isac.h"
12334  #include "hscx.h"
12335  #include "isdnl1.h"
12336  
12337  extern const char *CardType[];
12338 -const char *teles3_revision = "$Revision: 1.1.4.1 $";
12339 +const char *teles3_revision = "$Revision: 2.19 $";
12340  
12341  #define byteout(addr,val) outb(val,addr)
12342  #define bytein(addr) inb(addr)
12343 @@ -255,24 +254,6 @@
12344         return(0);
12345  }
12346  
12347 -#ifdef __ISAPNP__
12348 -static struct isapnp_device_id teles_ids[] __initdata = {
12349 -       { ISAPNP_VENDOR('T', 'A', 'G'), ISAPNP_FUNCTION(0x2110),
12350 -         ISAPNP_VENDOR('T', 'A', 'G'), ISAPNP_FUNCTION(0x2110), 
12351 -         (unsigned long) "Teles 16.3 PnP" },
12352 -       { ISAPNP_VENDOR('C', 'T', 'X'), ISAPNP_FUNCTION(0x0),
12353 -         ISAPNP_VENDOR('C', 'T', 'X'), ISAPNP_FUNCTION(0x0), 
12354 -         (unsigned long) "Creatix 16.3 PnP" },
12355 -       { ISAPNP_VENDOR('C', 'P', 'Q'), ISAPNP_FUNCTION(0x1002),
12356 -         ISAPNP_VENDOR('C', 'P', 'Q'), ISAPNP_FUNCTION(0x1002), 
12357 -         (unsigned long) "Compaq ISDN S0" },
12358 -       { 0, }
12359 -};
12360 -
12361 -static struct isapnp_device_id *tdev = &teles_ids[0];
12362 -static struct pci_bus *pnp_c __devinitdata = NULL;
12363 -#endif
12364 -
12365  int __devinit
12366  setup_teles3(struct IsdnCard *card)
12367  {
12368 @@ -286,47 +267,6 @@
12369             && (cs->typ != ISDN_CTYPE_TELESPCMCIA) && (cs->typ != ISDN_CTYPE_COMPAQ_ISA))
12370                 return (0);
12371  
12372 -#ifdef __ISAPNP__
12373 -       if (!card->para[1] && isapnp_present()) {
12374 -               struct pci_bus *pb;
12375 -               struct pci_dev *pd;
12376 -
12377 -               while(tdev->card_vendor) {
12378 -                       if ((pb = isapnp_find_card(tdev->card_vendor,
12379 -                               tdev->card_device, pnp_c))) {
12380 -                               pnp_c = pb;
12381 -                               pd = NULL;
12382 -                               if ((pd = isapnp_find_dev(pnp_c,
12383 -                                       tdev->vendor, tdev->function, pd))) {
12384 -                                       printk(KERN_INFO "HiSax: %s detected\n",
12385 -                                               (char *)tdev->driver_data);
12386 -                                       pd->prepare(pd);
12387 -                                       pd->deactivate(pd);
12388 -                                       pd->activate(pd);
12389 -                                       card->para[3] = pd->resource[2].start;
12390 -                                       card->para[2] = pd->resource[1].start;
12391 -                                       card->para[1] = pd->resource[0].start;
12392 -                                       card->para[0] = pd->irq_resource[0].start;
12393 -                                       if (!card->para[0] || !card->para[1] || !card->para[2]) {
12394 -                                               printk(KERN_ERR "Teles PnP:some resources are missing %ld/%lx/%lx\n",
12395 -                                               card->para[0], card->para[1], card->para[2]);
12396 -                                               pd->deactivate(pd);
12397 -                                               return(0);
12398 -                                       }
12399 -                                       break;
12400 -                               } else {
12401 -                                       printk(KERN_ERR "Teles PnP: PnP error card found, no device\n");
12402 -                               }
12403 -                       }
12404 -                       tdev++;
12405 -                       pnp_c=NULL;
12406 -               } 
12407 -               if (!tdev->card_vendor) {
12408 -                       printk(KERN_INFO "Teles PnP: no ISAPnP card found\n");
12409 -                       return(0);
12410 -               }
12411 -       }
12412 -#endif
12413         if (cs->typ == ISDN_CTYPE_16_3) {
12414                 cs->hw.teles3.cfg_reg = card->para[1];
12415                 switch (cs->hw.teles3.cfg_reg) {
12416 Index: linux-2.4.35.4/drivers/isdn/hisax/telespci.c
12417 ===================================================================
12418 --- linux-2.4.35.4.orig/drivers/isdn/hisax/telespci.c   2007-12-15 05:19:40.442725738 +0100
12419 +++ linux-2.4.35.4/drivers/isdn/hisax/telespci.c        2007-12-15 05:19:55.659592899 +0100
12420 @@ -1,4 +1,4 @@
12421 -/* $Id: telespci.c,v 1.1.4.1 2001/11/20 14:19:36 kai Exp $
12422 +/* $Id: telespci.c,v 2.23 2001/09/24 13:22:57 kai Exp $
12423   *
12424   * low level stuff for Teles PCI isdn cards
12425   *
12426 @@ -20,9 +20,10 @@
12427  #include "hscx.h"
12428  #include "isdnl1.h"
12429  #include <linux/pci.h>
12430 +#include <linux/isdn_compat.h>
12431  
12432  extern const char *CardType[];
12433 -const char *telespci_revision = "$Revision: 1.1.4.1 $";
12434 +const char *telespci_revision = "$Revision: 2.23 $";
12435  
12436  #define ZORAN_PO_RQ_PEN        0x02000000
12437  #define ZORAN_PO_WR    0x00800000
12438 @@ -307,10 +308,10 @@
12439                         printk(KERN_WARNING "Teles: No IRQ for PCI card found\n");
12440                         return(0);
12441                 }
12442 -               cs->hw.teles0.membase = (u_long) ioremap(pci_resource_start(dev_tel, 0),
12443 +               cs->hw.teles0.membase = (u_long) ioremap(pci_resource_start_mem(dev_tel, 0),
12444                         PAGE_SIZE);
12445                 printk(KERN_INFO "Found: Zoran, base-address: 0x%lx, irq: 0x%x\n",
12446 -                       pci_resource_start(dev_tel, 0), dev_tel->irq);
12447 +                       pci_resource_start_mem(dev_tel, 0), dev_tel->irq);
12448         } else {
12449                 printk(KERN_WARNING "TelesPCI: No PCI card found\n");
12450                 return(0);
12451 Index: linux-2.4.35.4/drivers/isdn/hisax/w6692.c
12452 ===================================================================
12453 --- linux-2.4.35.4.orig/drivers/isdn/hisax/w6692.c      2007-12-15 05:19:40.450726193 +0100
12454 +++ linux-2.4.35.4/drivers/isdn/hisax/w6692.c   2007-12-15 05:19:55.659592899 +0100
12455 @@ -1,4 +1,4 @@
12456 -/* $Id: w6692.c,v 1.1.4.1 2001/11/20 14:19:36 kai Exp $
12457 +/* $Id: w6692.c,v 1.18 2001/09/24 13:22:57 kai Exp $
12458   *
12459   * Winbond W6692 specific routines
12460   *
12461 @@ -18,6 +18,7 @@
12462  #include "isdnl1.h"
12463  #include <linux/interrupt.h>
12464  #include <linux/pci.h>
12465 +#include <linux/isdn_compat.h>
12466  
12467  /* table entry in the PCI devices list */
12468  typedef struct {
12469 @@ -29,20 +30,14 @@
12470  
12471  static const PCI_ENTRY id_list[] =
12472  {
12473 -       {PCI_VENDOR_ID_WINBOND2, PCI_DEVICE_ID_WINBOND2_6692, "Winbond", "W6692"},
12474         {PCI_VENDOR_ID_DYNALINK, PCI_DEVICE_ID_DYNALINK_IS64PH, "Dynalink/AsusCom", "IS64PH"},
12475 -       {0, 0, "U.S.Robotics", "ISDN PCI Card TA"}
12476 +       {PCI_VENDOR_ID_WINBOND2, PCI_DEVICE_ID_WINBOND2_6692, "Winbond", "W6692"},
12477 +       {0, 0, NULL, NULL}
12478  };
12479  
12480 -#define W6692_SV_USR   0x16ec
12481 -#define W6692_SD_USR   0x3409
12482 -#define W6692_WINBOND  0
12483 -#define W6692_DYNALINK 1
12484 -#define W6692_USR      2
12485 -
12486  extern const char *CardType[];
12487  
12488 -const char *w6692_revision = "$Revision: 1.1.4.1 $";
12489 +const char *w6692_revision = "$Revision: 1.18 $";
12490  
12491  #define DBUSY_TIMER_VALUE 80
12492  
12493 @@ -675,6 +670,16 @@
12494  static void
12495  DC_Close_W6692(struct IsdnCardState *cs)
12496  {
12497 +#if 0
12498 +       if (cs->dc.w6692.mon_rx) {
12499 +               kfree(cs->dc.w6692.mon_rx);
12500 +               cs->dc.w6692.mon_rx = NULL;
12501 +       }
12502 +       if (cs->dc.w6692.mon_tx) {
12503 +               kfree(cs->dc.w6692.mon_tx);
12504 +               cs->dc.w6692.mon_tx = NULL;
12505 +       }
12506 +#endif
12507  }
12508  
12509  static void
12510 @@ -865,38 +870,31 @@
12511         return (0);
12512  }
12513  
12514 -void resetW6692(struct IsdnCardState *cs)
12515 -{
12516 -       cs->writeW6692(cs, W_D_CTL, W_D_CTL_SRST);
12517 -       schedule_timeout((10*HZ)/1000);
12518 -       cs->writeW6692(cs, W_D_CTL, 0x00);
12519 -       schedule_timeout((10*HZ)/1000);
12520 -       cs->writeW6692(cs, W_IMASK, 0xff);
12521 -       cs->writeW6692(cs, W_D_SAM, 0xff);
12522 -       cs->writeW6692(cs, W_D_TAM, 0xff);
12523 -       cs->writeW6692(cs, W_D_EXIM, 0x00);
12524 -       cs->writeW6692(cs, W_D_MODE, W_D_MODE_RACT);
12525 -       cs->writeW6692(cs, W_IMASK, 0x18);
12526 -       if (cs->subtyp == W6692_USR) {
12527 -               /* seems that USR implemented some power control features
12528 -                * Pin 79 is connected to the oscilator circuit so we
12529 -                * have to handle it here
12530 -                */
12531 -               cs->writeW6692(cs, W_PCTL, 0x80);
12532 -               cs->writeW6692(cs, W_XDATA, 0x00);
12533 -       }
12534 -}
12535 -
12536  void __init initW6692(struct IsdnCardState *cs, int part)
12537  {
12538         if (part & 1) {
12539                 cs->tqueue.routine = (void *) (void *) W6692_bh;
12540                 cs->setstack_d = setstack_W6692;
12541                 cs->DC_Close = DC_Close_W6692;
12542 +#if 0
12543 +               cs->dc.w6692.mon_tx = NULL;
12544 +               cs->dc.w6692.mon_rx = NULL;
12545 +#endif
12546                 cs->dbusytimer.function = (void *) dbusy_timer_handler;
12547                 cs->dbusytimer.data = (long) cs;
12548                 init_timer(&cs->dbusytimer);
12549 -               resetW6692(cs);
12550 +
12551 +               cs->writeW6692(cs, W_D_CTL, W_D_CTL_SRST);
12552 +               cs->writeW6692(cs, W_D_CTL, 0x00);
12553 +               cs->writeW6692(cs, W_IMASK, 0xff);
12554 +#if 0
12555 +               cs->dc.w6692.mocr = 0xaa;
12556 +#endif
12557 +               cs->writeW6692(cs, W_D_SAM, 0xff);
12558 +               cs->writeW6692(cs, W_D_TAM, 0xff);
12559 +               cs->writeW6692(cs, W_D_EXIM, 0x00);
12560 +               cs->writeW6692(cs, W_D_MODE, W_D_MODE_RACT);
12561 +               cs->writeW6692(cs, W_IMASK, 0x18);
12562                 ph_command(cs, W_L1CMD_RST);
12563                 cs->dc.w6692.ph_state = W_L1CMD_RST;
12564                 W6692_new_ph(cs);
12565 @@ -963,14 +961,9 @@
12566  {
12567         switch (mt) {
12568                 case CARD_RESET:
12569 -                       resetW6692(cs);
12570                         return (0);
12571                 case CARD_RELEASE:
12572 -                       cs->writeW6692(cs, W_IMASK, 0xff);
12573                         release_region(cs->hw.w6692.iobase, 256);
12574 -                       if (cs->subtyp == W6692_USR) {
12575 -                               cs->writeW6692(cs, W_XDATA, 0x04);
12576 -                       }
12577                         return (0);
12578                 case CARD_INIT:
12579                         initW6692(cs, 3);
12580 @@ -1013,7 +1006,6 @@
12581                 if (dev_w6692) {
12582                         if (pci_enable_device(dev_w6692))
12583                                 continue;
12584 -                       cs->subtyp = id_idx;
12585                         break;
12586                 }
12587                 id_idx++;
12588 @@ -1023,14 +1015,7 @@
12589                 pci_irq = dev_w6692->irq;
12590                 /* I think address 0 is allways the configuration area */
12591                 /* and address 1 is the real IO space KKe 03.09.99 */
12592 -               pci_ioaddr = pci_resource_start(dev_w6692, 1);
12593 -               /* USR ISDN PCI card TA need some special handling */
12594 -               if (cs->subtyp == W6692_WINBOND) {
12595 -                       if ((W6692_SV_USR == dev_w6692->subsystem_vendor) &&
12596 -                           (W6692_SD_USR == dev_w6692->subsystem_device)) {
12597 -                               cs->subtyp = W6692_USR;
12598 -                       }
12599 -               }
12600 +               pci_ioaddr = pci_resource_start_io(dev_w6692, 1);
12601         }
12602         if (!found) {
12603                 printk(KERN_WARNING "W6692: No PCI card found\n");
12604 @@ -1047,18 +1032,18 @@
12605         }
12606         cs->hw.w6692.iobase = pci_ioaddr;
12607         printk(KERN_INFO "Found: %s %s, I/O base: 0x%x, irq: %d\n",
12608 -              id_list[cs->subtyp].vendor_name, id_list[cs->subtyp].card_name,
12609 -              pci_ioaddr, pci_irq);
12610 +              id_list[id_idx].vendor_name, id_list[id_idx].card_name,
12611 +              pci_ioaddr, dev_w6692->irq);
12612         if (check_region((cs->hw.w6692.iobase), 256)) {
12613                 printk(KERN_WARNING
12614                        "HiSax: %s I/O ports %x-%x already in use\n",
12615 -                      id_list[cs->subtyp].card_name,
12616 +                      id_list[id_idx].card_name,
12617                        cs->hw.w6692.iobase,
12618                        cs->hw.w6692.iobase + 255);
12619                 return (0);
12620         } else {
12621                 request_region(cs->hw.w6692.iobase, 256,
12622 -                              id_list[cs->subtyp].card_name);
12623 +                              id_list[id_idx].card_name);
12624         }
12625  #else
12626         printk(KERN_WARNING "HiSax: W6692 and NO_PCI_BIOS\n");
12627 @@ -1068,7 +1053,7 @@
12628  
12629         printk(KERN_INFO
12630                "HiSax: %s config irq:%d I/O:%x\n",
12631 -              id_list[cs->subtyp].card_name, cs->irq,
12632 +              id_list[id_idx].card_name, cs->irq,
12633                cs->hw.w6692.iobase);
12634  
12635         cs->readW6692 = &ReadW6692;
12636 Index: linux-2.4.35.4/drivers/isdn/hisax/w6692.h
12637 ===================================================================
12638 --- linux-2.4.35.4.orig/drivers/isdn/hisax/w6692.h      2007-12-15 05:19:40.458726649 +0100
12639 +++ linux-2.4.35.4/drivers/isdn/hisax/w6692.h   2007-12-15 05:19:55.663593126 +0100
12640 @@ -1,4 +1,4 @@
12641 -/* $Id: w6692.h,v 1.1.4.1 2001/11/20 14:19:36 kai Exp $
12642 +/* $Id: w6692.h,v 1.4 2001/09/24 13:22:57 kai Exp $
12643   *
12644   * Winbond W6692 specific defines
12645   *
12646 Index: linux-2.4.35.4/drivers/isdn/hysdn/boardergo.c
12647 ===================================================================
12648 --- linux-2.4.35.4.orig/drivers/isdn/hysdn/boardergo.c  2007-12-15 05:19:40.466727107 +0100
12649 +++ linux-2.4.35.4/drivers/isdn/hysdn/boardergo.c       2007-12-15 05:19:55.667593352 +0100
12650 @@ -1,27 +1,41 @@
12651 -/* $Id: boardergo.c,v 1.1.4.1 2001/11/20 14:19:37 kai Exp $
12652 - *
12653 +/* $Id: boardergo.c,v 1.9 2001/07/19 20:39:51 kai Exp $
12654 +
12655   * Linux driver for HYSDN cards, specific routines for ergo type boards.
12656   *
12657 - * Author    Werner Cornelius (werner@titro.de) for Hypercope GmbH
12658 - * Copyright 1999 by Werner Cornelius (werner@titro.de)
12659 - *
12660 - * This software may be used and distributed according to the terms
12661 - * of the GNU General Public License, incorporated herein by reference.
12662 - *
12663   * As all Linux supported cards Champ2, Ergo and Metro2/4 use the same
12664   * DPRAM interface and layout with only minor differences all related
12665   * stuff is done here, not in separate modules.
12666   *
12667 + * written by Werner Cornelius (werner@titro.de) for Hypercope GmbH
12668 + *
12669 + * Copyright 1999  by Werner Cornelius (werner@titro.de)
12670 + *
12671 + * This program is free software; you can redistribute it and/or modify
12672 + * it under the terms of the GNU General Public License as published by
12673 + * the Free Software Foundation; either version 2, or (at your option)
12674 + * any later version.
12675 + *
12676 + * This program is distributed in the hope that it will be useful,
12677 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
12678 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12679 + * GNU General Public License for more details.
12680 + *
12681 + * You should have received a copy of the GNU General Public License
12682 + * along with this program; if not, write to the Free Software
12683 + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
12684 + *
12685   */
12686  
12687 +#define __NO_VERSION__
12688  #include <linux/config.h>
12689 -#include <linux/sched.h>
12690 +#include <linux/module.h>
12691 +#include <linux/version.h>
12692 +#include <asm/io.h>
12693  #include <linux/signal.h>
12694  #include <linux/kernel.h>
12695  #include <linux/ioport.h>
12696  #include <linux/interrupt.h>
12697  #include <linux/vmalloc.h>
12698 -#include <asm/io.h>
12699  
12700  #include "hysdn_defs.h"
12701  #include "boardergo.h"
12702 @@ -45,11 +59,10 @@
12703         if (!card->irq_enabled)
12704                 return;         /* other device interrupting or irq switched off */
12705  
12706 -       save_flags(flags);
12707 -       cli();                  /* no further irqs allowed */
12708 +       HYSDN_SPIN_LOCK(&card->irq_lock, flags);
12709  
12710         if (!(bytein(card->iobase + PCI9050_INTR_REG) & PCI9050_INTR_REG_STAT1)) {
12711 -               restore_flags(flags);   /* restore old state */
12712 +               HYSDN_SPIN_UNLOCK(&card->irq_lock, flags);
12713                 return;         /* no interrupt requested by E1 */
12714         }
12715         /* clear any pending ints on the board */
12716 @@ -63,7 +76,7 @@
12717                 queue_task(&card->irq_queue, &tq_immediate);
12718                 mark_bh(IMMEDIATE_BH);
12719         }
12720 -       restore_flags(flags);
12721 +       HYSDN_SPIN_UNLOCK(&card->irq_lock, flags);
12722  }                              /* ergo_interrupt */
12723  
12724  /******************************************************************************/
12725 @@ -83,17 +96,15 @@
12726                 return;         /* invalid call */
12727  
12728         dpr = card->dpram;      /* point to DPRAM */
12729 +       HYSDN_SPIN_LOCK(&card->irq_lock, flags);
12730  
12731 -       save_flags(flags);
12732 -       cli();
12733         if (card->hw_lock) {
12734 -               restore_flags(flags);   /* hardware currently unavailable */
12735 +               HYSDN_SPIN_UNLOCK(&card->irq_lock, flags);
12736                 return;
12737         }
12738         card->hw_lock = 1;      /* we now lock the hardware */
12739  
12740         do {
12741 -               sti();          /* reenable other ints */
12742                 again = 0;      /* assume loop not to be repeated */
12743  
12744                 if (!dpr->ToHyFlag) {
12745 @@ -113,15 +124,13 @@
12746                                 again = 1;      /* restart loop */
12747                         }
12748                 }               /* a message has arrived for us */
12749 -               cli();          /* no further ints */
12750                 if (again) {
12751                         dpr->ToHyInt = 1;
12752                         dpr->ToPcInt = 1;       /* interrupt to E1 for all cards */
12753                 } else
12754                         card->hw_lock = 0;      /* free hardware again */
12755         } while (again);        /* until nothing more to do */
12756 -
12757 -       restore_flags(flags);
12758 +       HYSDN_SPIN_UNLOCK(&card->irq_lock, flags);
12759  }                              /* ergo_irq_bh */
12760  
12761  
12762 @@ -138,8 +147,7 @@
12763  #ifdef CONFIG_HYSDN_CAPI
12764         hycapi_capi_stop(card);
12765  #endif /* CONFIG_HYSDN_CAPI */
12766 -       save_flags(flags);
12767 -       cli();
12768 +       HYSDN_SPIN_LOCK(&card->irq_lock, flags);
12769         val = bytein(card->iobase + PCI9050_INTR_REG);  /* get actual value */
12770         val &= ~(PCI9050_INTR_REG_ENPCI | PCI9050_INTR_REG_EN1);        /* mask irq */
12771         byteout(card->iobase + PCI9050_INTR_REG, val);
12772 @@ -147,8 +155,7 @@
12773         byteout(card->iobase + PCI9050_USER_IO, PCI9050_E1_RESET);      /* reset E1 processor */
12774         card->state = CARD_STATE_UNUSED;
12775         card->err_log_state = ERRLOG_STATE_OFF;         /* currently no log active */
12776 -
12777 -       restore_flags(flags);
12778 +       HYSDN_SPIN_UNLOCK(&card->irq_lock, flags);
12779  }                              /* ergo_stopcard */
12780  
12781  /**************************************************************************/
12782 @@ -163,20 +170,17 @@
12783                 card->err_log_state = ERRLOG_STATE_OFF;         /* must be off */
12784                 return;
12785         }
12786 -       save_flags(flags);
12787 -       cli();
12788 -
12789 +       HYSDN_SPIN_LOCK(&card->irq_lock, flags);
12790         if (((card->err_log_state == ERRLOG_STATE_OFF) && !on) ||
12791             ((card->err_log_state == ERRLOG_STATE_ON) && on)) {
12792 -               restore_flags(flags);
12793 +               HYSDN_SPIN_UNLOCK(&card->irq_lock, flags);
12794                 return;         /* nothing to do */
12795         }
12796         if (on)
12797                 card->err_log_state = ERRLOG_STATE_START;       /* request start */
12798         else
12799                 card->err_log_state = ERRLOG_STATE_STOP;        /* request stop */
12800 -
12801 -       restore_flags(flags);
12802 +       HYSDN_SPIN_UNLOCK(&card->irq_lock, flags);
12803         queue_task(&card->irq_queue, &tq_immediate);
12804         mark_bh(IMMEDIATE_BH);
12805  }                              /* ergo_set_errlog_state */
12806 @@ -245,9 +249,6 @@
12807                 while (!dpram->ToHyNoDpramErrLog);      /* reread volatile register to flush PCI */
12808  
12809                 byteout(card->iobase + PCI9050_USER_IO, PCI9050_E1_RUN);        /* start E1 processor */
12810 -               /* the interrupts are still masked */
12811 -
12812 -               sti();
12813                 set_current_state(TASK_INTERRUPTIBLE);
12814                 schedule_timeout((20 * HZ) / 1000);     /* Timeout 20ms */
12815  
12816 @@ -282,7 +283,6 @@
12817         dst = sp->Data;         /* point to data in spool structure */
12818         buflen = sp->Len;       /* maximum len of spooled data */
12819         wr_mirror = sp->WrPtr;  /* only once read */
12820 -       sti();
12821  
12822         /* try until all bytes written or error */
12823         i = 0x1000;             /* timeout value */
12824 @@ -358,9 +358,7 @@
12825  
12826                         if (card->debug_flags & LOG_POF_RECORD)
12827                                 hysdn_addlog(card, "ERGO: pof boot success");
12828 -                       save_flags(flags);
12829 -                       cli();
12830 -
12831 +                       HYSDN_SPIN_LOCK(&card->irq_lock, flags);
12832                         card->state = CARD_STATE_RUN;   /* now card is running */
12833                         /* enable the cards interrupt */
12834                         byteout(card->iobase + PCI9050_INTR_REG,
12835 @@ -371,8 +369,7 @@
12836                         dpr->ToPcFlag = 0;      /* reset data indicator */
12837                         dpr->ToHyInt = 1;
12838                         dpr->ToPcInt = 1;       /* interrupt to E1 for all cards */
12839 -
12840 -                       restore_flags(flags);
12841 +                       HYSDN_SPIN_UNLOCK(&card->irq_lock, flags);
12842                         if ((hynet_enable & (1 << card->myid)) 
12843                             && (i = hysdn_net_create(card))) 
12844                         {
12845 @@ -387,7 +384,6 @@
12846  #endif /* CONFIG_HYSDN_CAPI */
12847                         return (0);     /* success */
12848                 }               /* data has arrived */
12849 -               sti();
12850                 set_current_state(TASK_INTERRUPTIBLE);
12851                 schedule_timeout((50 * HZ) / 1000);     /* Timeout 50ms */
12852         }                       /* wait until timeout */
12853 Index: linux-2.4.35.4/drivers/isdn/hysdn/boardergo.h
12854 ===================================================================
12855 --- linux-2.4.35.4.orig/drivers/isdn/hysdn/boardergo.h  2007-12-15 05:19:40.470727333 +0100
12856 +++ linux-2.4.35.4/drivers/isdn/hysdn/boardergo.h       2007-12-15 05:19:55.667593352 +0100
12857 @@ -1,4 +1,4 @@
12858 -/* $Id: boardergo.h,v 1.1.4.1 2001/11/20 14:19:37 kai Exp $
12859 +/* $Id$
12860   *
12861   * Linux driver for HYSDN cards, definitions for ergo type boards (buffers..).
12862   *
12863 @@ -10,6 +10,7 @@
12864   *
12865   */
12866  
12867 +#include <linux/isdn_compat.h>
12868  
12869  /************************************************/
12870  /* defines for the dual port memory of the card */
12871 Index: linux-2.4.35.4/drivers/isdn/hysdn/hycapi.c
12872 ===================================================================
12873 --- linux-2.4.35.4.orig/drivers/isdn/hysdn/hycapi.c     2007-12-15 05:19:40.478727788 +0100
12874 +++ linux-2.4.35.4/drivers/isdn/hysdn/hycapi.c  2007-12-15 05:19:55.671593581 +0100
12875 @@ -1,4 +1,4 @@
12876 -/* $Id: hycapi.c,v 1.1.4.1 2001/11/20 14:19:37 kai Exp $
12877 +/* $Id$
12878   *
12879   * Linux driver for HYSDN cards, CAPI2.0-Interface.
12880   *
12881 @@ -29,7 +29,7 @@
12882  #include "hysdn_defs.h"
12883  #include <linux/kernelcapi.h>
12884  
12885 -static char hycapi_revision[]="$Revision: 1.1.4.1 $";
12886 +static char hycapi_revision[]="$Revision$";
12887  
12888  unsigned int hycapi_enable = 0xffffffff; 
12889  MODULE_PARM(hycapi_enable, "i");
12890 Index: linux-2.4.35.4/drivers/isdn/hysdn/hysdn_boot.c
12891 ===================================================================
12892 --- linux-2.4.35.4.orig/drivers/isdn/hysdn/hysdn_boot.c 2007-12-15 05:19:40.486728246 +0100
12893 +++ linux-2.4.35.4/drivers/isdn/hysdn/hysdn_boot.c      2007-12-15 05:19:55.671593581 +0100
12894 @@ -1,4 +1,4 @@
12895 -/* $Id: hysdn_boot.c,v 1.1.4.1 2001/11/20 14:19:37 kai Exp $
12896 +/* $Id$
12897   *
12898   * Linux driver for HYSDN cards
12899   * specific routines for booting and pof handling
12900 @@ -143,7 +143,7 @@
12901                                              (boot->pof_recid == TAG_CABSDATA) ? "CABSDATA" : "ABSDATA",
12902                                              datlen, boot->pof_recoffset);
12903  
12904 -                       if ((boot->last_error = card->writebootseq(card, boot->buf.BootBuf, datlen)) < 0)
12905 +                       if ((boot->last_error = card->writebootseq(card, boot->buf.BootBuf, datlen) < 0))
12906                                 return (boot->last_error);      /* error writing data */
12907  
12908                         if (boot->pof_recoffset + datlen >= boot->pof_reclen)
12909 Index: linux-2.4.35.4/drivers/isdn/hysdn/hysdn_defs.h
12910 ===================================================================
12911 --- linux-2.4.35.4.orig/drivers/isdn/hysdn/hysdn_defs.h 2007-12-15 05:19:40.494728702 +0100
12912 +++ linux-2.4.35.4/drivers/isdn/hysdn/hysdn_defs.h      2007-12-15 05:19:55.671593581 +0100
12913 @@ -1,4 +1,4 @@
12914 -/* $Id: hysdn_defs.h,v 1.1.4.1 2001/11/20 14:19:37 kai Exp $
12915 +/* $Id: hysdn_defs.h,v 1.10 2001/09/24 13:23:03 kai Exp $
12916   *
12917   * Linux driver for HYSDN cards
12918   * global definitions and exported vars and functions.
12919 @@ -19,6 +19,11 @@
12920  #include <linux/interrupt.h>
12921  #include <linux/tqueue.h>
12922  #include <linux/skbuff.h>
12923 +#include <linux/isdn_compat.h>
12924 +#include <linux/spinlock.h>
12925 +
12926 +#define HYSDN_SPIN_LOCK(a,b) spin_lock(a)
12927 +#define HYSDN_SPIN_UNLOCK(a,b) spin_unlock(a)
12928  
12929  /****************************/
12930  /* storage type definitions */
12931 @@ -176,6 +181,7 @@
12932         struct tq_struct irq_queue;     /* interrupt task queue */
12933         uchar volatile irq_enabled;     /* interrupt enabled if != 0 */
12934         uchar volatile hw_lock; /* hardware is currently locked -> no access */
12935 +       spinlock_t irq_lock;
12936  
12937         /* boot process */
12938         void *boot;             /* pointer to boot private data */
12939 Index: linux-2.4.35.4/drivers/isdn/hysdn/hysdn_init.c
12940 ===================================================================
12941 --- linux-2.4.35.4.orig/drivers/isdn/hysdn/hysdn_init.c 2007-12-15 05:19:40.502729157 +0100
12942 +++ linux-2.4.35.4/drivers/isdn/hysdn/hysdn_init.c      2007-12-15 05:19:55.671593581 +0100
12943 @@ -1,4 +1,4 @@
12944 -/* $Id: hysdn_init.c,v 1.1.4.1 2001/11/20 14:19:37 kai Exp $
12945 +/* $Id$
12946   *
12947   * Linux driver for HYSDN cards, init functions.
12948   *
12949 @@ -21,6 +21,7 @@
12950  
12951  #include "hysdn_defs.h"
12952  
12953 +#ifndef COMPAT_HAS_2_2_PCI
12954  static struct pci_device_id hysdn_pci_tbl[] __initdata = {
12955         {PCI_VENDOR_ID_HYPERCOPE, PCI_DEVICE_ID_HYPERCOPE_PLX, PCI_ANY_ID, PCI_SUBDEVICE_ID_HYPERCOPE_METRO},
12956         {PCI_VENDOR_ID_HYPERCOPE, PCI_DEVICE_ID_HYPERCOPE_PLX, PCI_ANY_ID, PCI_SUBDEVICE_ID_HYPERCOPE_CHAMP2},
12957 @@ -29,11 +30,12 @@
12958         { }                             /* Terminating entry */
12959  };
12960  MODULE_DEVICE_TABLE(pci, hysdn_pci_tbl);
12961 +#endif
12962  MODULE_DESCRIPTION("ISDN4Linux: Driver for HYSDN cards");
12963  MODULE_AUTHOR("Werner Cornelius");
12964  MODULE_LICENSE("GPL");
12965  
12966 -static char *hysdn_init_revision = "$Revision: 1.1.4.1 $";
12967 +static char *hysdn_init_revision = "$Revision$";
12968  int cardmax;                   /* number of found cards */
12969  hysdn_card *card_root = NULL;  /* pointer to first card */
12970  
12971 @@ -91,11 +93,11 @@
12972                 card->myid = cardmax;   /* set own id */
12973                 card->bus = akt_pcidev->bus->number;
12974                 card->devfn = akt_pcidev->devfn;        /* slot + function */
12975 -               card->subsysid = akt_pcidev->subsystem_device;
12976 +               pci_get_sub_system(akt_pcidev,card->subsysid);
12977                 card->irq = akt_pcidev->irq;
12978 -               card->iobase = pci_resource_start(akt_pcidev, PCI_REG_PLX_IO_BASE);
12979 -               card->plxbase = pci_resource_start(akt_pcidev, PCI_REG_PLX_MEM_BASE);
12980 -               card->membase = pci_resource_start(akt_pcidev, PCI_REG_MEMORY_BASE);
12981 +               card->iobase = pci_resource_start_io(akt_pcidev, PCI_REG_PLX_IO_BASE);
12982 +               card->plxbase = pci_resource_start_mem(akt_pcidev, PCI_REG_PLX_MEM_BASE);
12983 +               card->membase = pci_resource_start_mem(akt_pcidev, PCI_REG_MEMORY_BASE);
12984                 card->brdtype = BD_NONE;        /* unknown */
12985                 card->debug_flags = DEF_DEB_FLAGS;      /* set default debug */
12986                 card->faxchans = 0;     /* default no fax channels */
12987 Index: linux-2.4.35.4/drivers/isdn/hysdn/hysdn_net.c
12988 ===================================================================
12989 --- linux-2.4.35.4.orig/drivers/isdn/hysdn/hysdn_net.c  2007-12-15 05:19:40.506729386 +0100
12990 +++ linux-2.4.35.4/drivers/isdn/hysdn/hysdn_net.c       2007-12-15 05:19:55.675593810 +0100
12991 @@ -1,4 +1,4 @@
12992 -/* $Id: hysdn_net.c,v 1.1.4.1 2001/11/20 14:19:37 kai Exp $
12993 +/* $Id$
12994   *
12995   * Linux driver for HYSDN cards, net (ethernet type) handling routines.
12996   *
12997 @@ -29,7 +29,7 @@
12998  MODULE_PARM(hynet_enable, "i");
12999  
13000  /* store the actual version for log reporting */
13001 -char *hysdn_net_revision = "$Revision: 1.1.4.1 $";
13002 +char *hysdn_net_revision = "$Revision$";
13003  
13004  #define MAX_SKB_BUFFERS 20     /* number of buffers for keeping TX-data */
13005  
13006 @@ -45,6 +45,10 @@
13007         /* additional vars may be added here */
13008         char dev_name[9];       /* our own device name */
13009  
13010 +#ifdef COMPAT_NO_SOFTNET
13011 +       struct sk_buff *tx_skb; /* buffer for tx operation */
13012 +
13013 +#else
13014         /* Tx control lock.  This protects the transmit buffer ring
13015          * state along with the "tx full" state of the driver.  This
13016          * means all netif_queue flow control actions are protected
13017 @@ -56,6 +60,7 @@
13018         int sk_count;           /* number of buffers currently in ring */
13019  
13020         int is_open;            /* flag controlling module locking */
13021 +#endif
13022  };                             /* net_local */
13023  
13024  
13025 @@ -83,11 +88,19 @@
13026         hysdn_card *card = dev->priv;
13027         int i;
13028  
13029 +#ifdef COMPAT_NO_SOFTNET
13030 +       dev->tbusy = 0;         /* non busy state */
13031 +       dev->interrupt = 0;
13032 +       if (!dev->start)
13033 +               MOD_INC_USE_COUNT;      /* increment only if device is down */
13034 +       dev->start = 1;         /* and started */
13035 +#else
13036         if (!((struct net_local *) dev)->is_open)
13037                 MOD_INC_USE_COUNT;      /* increment only if interface is actually down */
13038         ((struct net_local *) dev)->is_open = 1;        /* device actually open */
13039  
13040         netif_start_queue(dev); /* start tx-queueing */
13041 +#endif
13042  
13043         /* Fill in the MAC-level header (if not already set) */
13044         if (!card->mac_addr[0]) {
13045 @@ -104,6 +117,7 @@
13046         return (0);
13047  }                              /* net_open */
13048  
13049 +#ifndef COMPAT_NO_SOFTNET
13050  /*******************************************/
13051  /* flush the currently occupied tx-buffers */
13052  /* must only be called when device closed  */
13053 @@ -119,6 +133,7 @@
13054                 nl->sk_count--;
13055         }
13056  }                              /* flush_tx_buffers */
13057 +#endif
13058  
13059  
13060  /*********************************************************************/
13061 @@ -129,6 +144,15 @@
13062  net_close(struct net_device *dev)
13063  {
13064  
13065 +#ifdef COMPAT_NO_SOFTNET
13066 +       dev->tbusy = 1;         /* we are busy */
13067 +
13068 +       if (dev->start)
13069 +               MOD_DEC_USE_COUNT;      /* dec only if device has been active */
13070 +
13071 +       dev->start = 0;         /* and not started */
13072 +
13073 +#else
13074         netif_stop_queue(dev);  /* disable queueing */
13075  
13076         if (((struct net_local *) dev)->is_open)
13077 @@ -136,9 +160,52 @@
13078         ((struct net_local *) dev)->is_open = 0;
13079         flush_tx_buffers((struct net_local *) dev);
13080  
13081 +#endif
13082         return (0);             /* success */
13083  }                              /* net_close */
13084  
13085 +#ifdef COMPAT_NO_SOFTNET
13086 +/************************************/
13087 +/* send a packet on this interface. */
13088 +/* only for kernel versions < 2.3.33 */
13089 +/************************************/
13090 +static int
13091 +net_send_packet(struct sk_buff *skb, struct net_device *dev)
13092 +{
13093 +       struct net_local *lp = (struct net_local *) dev;
13094 +
13095 +       if (dev->tbusy) {
13096 +               /*
13097 +                * If we get here, some higher level has decided we are broken.
13098 +                * There should really be a "kick me" function call instead.
13099 +                * As ISDN may have higher timeouts than real ethernet 10s timeout
13100 +                */
13101 +               int tickssofar = jiffies - dev->trans_start;
13102 +               if (tickssofar < (10000 * HZ) / 1000)
13103 +                       return 1;
13104 +               printk(KERN_WARNING "%s: transmit timed out. \n", dev->name);
13105 +               dev->tbusy = 0;
13106 +               dev->trans_start = jiffies;
13107 +       }
13108 +       /*
13109 +        * Block a timer-based transmit from overlapping. This could better be
13110 +        * done with atomic_swap(1, dev->tbusy), but set_bit() works as well.
13111 +        */
13112 +       if (test_and_set_bit(0, (void *) &dev->tbusy) != 0)
13113 +               printk(KERN_WARNING "%s: Transmitter access conflict.\n", dev->name);
13114 +
13115 +       else {
13116 +               lp->stats.tx_bytes += skb->len;
13117 +               dev->trans_start = jiffies;
13118 +               lp->tx_skb = skb;       /* remember skb pointer */
13119 +               queue_task(&((hysdn_card *) dev->priv)->irq_queue, &tq_immediate);
13120 +               mark_bh(IMMEDIATE_BH);
13121 +       }
13122 +
13123 +       return (0);             /* success */
13124 +}                              /* net_send_packet */
13125 +
13126 +#else
13127  /************************************/
13128  /* send a packet on this interface. */
13129  /* new style for kernel >= 2.3.33   */
13130 @@ -176,6 +243,7 @@
13131         return (0);             /* success */
13132  }                              /* net_send_packet */
13133  
13134 +#endif
13135  
13136  
13137  /***********************************************************************/
13138 @@ -190,6 +258,15 @@
13139         if (!lp)
13140                 return;         /* non existing device */
13141  
13142 +#ifdef COMPAT_NO_SOFTNET
13143 +       if (lp->tx_skb)
13144 +               dev_kfree_skb(lp->tx_skb);      /* free tx pointer */
13145 +       lp->tx_skb = NULL;      /* reset pointer */
13146 +
13147 +       lp->stats.tx_packets++;
13148 +       lp->netdev.tbusy = 0;
13149 +       mark_bh(NET_BH);        /* Inform upper layers. */
13150 +#else
13151  
13152         if (!lp->sk_count)
13153                 return;         /* error condition */
13154 @@ -203,6 +280,7 @@
13155  
13156         if (lp->sk_count-- == MAX_SKB_BUFFERS)  /* dec usage count */
13157                 netif_start_queue((struct net_device *) lp);
13158 +#endif
13159  }                              /* hysdn_tx_netack */
13160  
13161  /*****************************************************/
13162 @@ -250,10 +328,15 @@
13163         if (!lp)
13164                 return (NULL);  /* non existing device */
13165  
13166 +#ifdef COMPAT_NO_SOFTNET
13167 +       return (lp->tx_skb);    /* return packet pointer */
13168 +
13169 +#else
13170         if (!lp->sk_count)
13171                 return (NULL);  /* nothing available */
13172  
13173         return (lp->skbs[lp->out_idx]);         /* next packet to send */
13174 +#endif
13175  }                              /* hysdn_tx_netget */
13176  
13177  
13178 @@ -296,15 +379,21 @@
13179         }
13180         memset(dev, 0, sizeof(struct net_local));       /* clean the structure */
13181  
13182 +#ifndef COMPAT_NO_SOFTNET
13183         spin_lock_init(&((struct net_local *) dev)->lock);
13184 +#endif
13185  
13186         /* initialise necessary or informing fields */
13187         dev->base_addr = card->iobase;  /* IO address */
13188         dev->irq = card->irq;   /* irq */
13189         dev->init = net_init;   /* the init function of the device */
13190 +#ifdef COMPAT_NO_SOFTNET
13191 +       dev->name = ((struct net_local *) dev)->dev_name;       /* device name */
13192 +#else
13193         if(dev->name) {
13194                 strcpy(dev->name, ((struct net_local *) dev)->dev_name);
13195         } 
13196 +#endif
13197         if ((i = register_netdev(dev))) {
13198                 printk(KERN_WARNING "HYSDN: unable to create network device\n");
13199                 kfree(dev);
13200 @@ -333,7 +422,9 @@
13201         card->netif = NULL;     /* clear out pointer */
13202         dev->stop(dev);         /* close the device */
13203  
13204 +#ifndef COMPAT_NO_SOFTNET
13205         flush_tx_buffers((struct net_local *) dev);     /* empty buffers */
13206 +#endif
13207  
13208         unregister_netdev(dev); /* release the device */
13209         kfree(dev);             /* release the memory allocated */
13210 Index: linux-2.4.35.4/drivers/isdn/hysdn/hysdn_pof.h
13211 ===================================================================
13212 --- linux-2.4.35.4.orig/drivers/isdn/hysdn/hysdn_pof.h  2007-12-15 05:19:40.514729842 +0100
13213 +++ linux-2.4.35.4/drivers/isdn/hysdn/hysdn_pof.h       2007-12-15 05:19:55.675593810 +0100
13214 @@ -1,4 +1,4 @@
13215 -/* $Id: hysdn_pof.h,v 1.1.4.1 2001/11/20 14:19:37 kai Exp $
13216 +/* $Id$
13217   *
13218   * Linux driver for HYSDN cards, definitions used for handling pof-files.
13219   *
13220 Index: linux-2.4.35.4/drivers/isdn/hysdn/hysdn_procconf.c
13221 ===================================================================
13222 --- linux-2.4.35.4.orig/drivers/isdn/hysdn/hysdn_procconf.c     2007-12-15 05:19:40.522730297 +0100
13223 +++ linux-2.4.35.4/drivers/isdn/hysdn/hysdn_procconf.c  2007-12-15 05:19:55.675593810 +0100
13224 @@ -1,4 +1,4 @@
13225 -/* $Id: hysdn_procconf.c,v 1.1.4.1 2001/11/20 14:19:37 kai Exp $
13226 +/* $Id$
13227   *
13228   * Linux driver for HYSDN cards, /proc/net filesystem dir and conf functions.
13229   *
13230 @@ -17,11 +17,13 @@
13231  #include <linux/poll.h>
13232  #include <linux/proc_fs.h>
13233  #include <linux/pci.h>
13234 +#ifndef COMPAT_USE_MODCOUNT_LOCK
13235  #include <linux/smp_lock.h>
13236 +#endif
13237  
13238  #include "hysdn_defs.h"
13239  
13240 -static char *hysdn_procconf_revision = "$Revision: 1.1.4.1 $";
13241 +static char *hysdn_procconf_revision = "$Revision$";
13242  
13243  #define INFO_OUT_LEN 80                /* length of info line including lf */
13244  
13245 @@ -212,32 +214,29 @@
13246  static ssize_t
13247  hysdn_conf_read(struct file *file, char *buf, size_t count, loff_t * off)
13248  {
13249 -       loff_t pos = *off;
13250         char *cp;
13251         int i;
13252  
13253         if (off != &file->f_pos)        /* fs error check */
13254                 return -ESPIPE;
13255  
13256 -       if (!(file->f_mode & FMODE_READ))
13257 -               return -EPERM;
13258 -
13259 -       if (!(cp = file->private_data))
13260 -               return (-EFAULT);       /* should never happen */
13261 -
13262 -       i = strlen(cp); /* get total string length */
13263 -
13264 -       if (pos != (unsigned)pos || pos >= i)
13265 -               return 0;
13266 -
13267 -       /* still bytes to transfer */
13268 -       cp += pos;      /* point to desired data offset */
13269 -       i -= pos;       /* remaining length */
13270 -       if (i > count)
13271 -               i = count;      /* limit length to transfer */
13272 -       if (copy_to_user(buf, cp, i))
13273 -               return (-EFAULT);       /* copy error */
13274 -       *off = pos + i; /* adjust offset */
13275 +       if (file->f_mode & FMODE_READ) {
13276 +               if (!(cp = file->private_data))
13277 +                       return (-EFAULT);       /* should never happen */
13278 +               i = strlen(cp); /* get total string length */
13279 +               if (*off < i) {
13280 +                       /* still bytes to transfer */
13281 +                       cp += *off;     /* point to desired data offset */
13282 +                       i -= *off;      /* remaining length */
13283 +                       if (i > count)
13284 +                               i = count;      /* limit length to transfer */
13285 +                       if (copy_to_user(buf, cp, i))
13286 +                               return (-EFAULT);       /* copy error */
13287 +                       *off += i;      /* adjust offset */
13288 +               } else
13289 +                       return (0);
13290 +       } else
13291 +               return (-EPERM);        /* no permission to read */
13292  
13293         return (i);
13294  }                              /* hysdn_conf_read */
13295 @@ -254,7 +253,11 @@
13296         char *cp, *tmp;
13297  
13298         /* now search the addressed card */
13299 +#ifdef COMPAT_USE_MODCOUNT_LOCK
13300 +       MOD_INC_USE_COUNT;
13301 +#else
13302         lock_kernel();
13303 +#endif
13304         card = card_root;
13305         while (card) {
13306                 pd = card->procconf;
13307 @@ -263,7 +266,11 @@
13308                 card = card->next;      /* search next entry */
13309         }
13310         if (!card) {
13311 +#ifdef COMPAT_USE_MODCOUNT_LOCK
13312 +               MOD_DEC_USE_COUNT;
13313 +#else
13314                 unlock_kernel();
13315 +#endif
13316                 return (-ENODEV);       /* device is unknown/invalid */
13317         }
13318         if (card->debug_flags & (LOG_PROC_OPEN | LOG_PROC_ALL))
13319 @@ -274,7 +281,11 @@
13320                 /* write only access -> write boot file or conf line */
13321  
13322                 if (!(cnf = kmalloc(sizeof(struct conf_writedata), GFP_KERNEL))) {
13323 +#ifdef COMPAT_USE_MODCOUNT_LOCK
13324 +                       MOD_DEC_USE_COUNT;
13325 +#else
13326                         unlock_kernel();
13327 +#endif
13328                         return (-EFAULT);
13329                 }
13330                 cnf->card = card;
13331 @@ -286,7 +297,11 @@
13332                 /* read access -> output card info data */
13333  
13334                 if (!(tmp = (char *) kmalloc(INFO_OUT_LEN * 2 + 2, GFP_KERNEL))) {
13335 +#ifdef COMPAT_USE_MODCOUNT_LOCK
13336 +                       MOD_DEC_USE_COUNT;
13337 +#else
13338                         unlock_kernel();
13339 +#endif
13340                         return (-EFAULT);       /* out of memory */
13341                 }
13342                 filep->private_data = tmp;      /* start of string */
13343 @@ -320,10 +335,16 @@
13344                 *cp++ = '\n';
13345                 *cp = 0;        /* end of string */
13346         } else {                /* simultaneous read/write access forbidden ! */
13347 +#ifdef COMPAT_USE_MODCOUNT_LOCK
13348 +               MOD_DEC_USE_COUNT;
13349 +#else
13350                 unlock_kernel();
13351 +#endif
13352                 return (-EPERM);        /* no permission this time */
13353         }
13354 +#ifndef COMPAT_USE_MODCOUNT_LOCK
13355         unlock_kernel();
13356 +#endif
13357         return (0);
13358  }                              /* hysdn_conf_open */
13359  
13360 @@ -338,7 +359,9 @@
13361         int retval = 0;
13362         struct proc_dir_entry *pd;
13363  
13364 +#ifndef COMPAT_USE_MODCOUNT_LOCK
13365         lock_kernel();
13366 +#endif
13367         /* search the addressed card */
13368         card = card_root;
13369         while (card) {
13370 @@ -348,7 +371,9 @@
13371                 card = card->next;      /* search next entry */
13372         }
13373         if (!card) {
13374 +#ifndef COMPAT_USE_MODCOUNT_LOCK
13375                 unlock_kernel();
13376 +#endif
13377                 return (-ENODEV);       /* device is unknown/invalid */
13378         }
13379         if (card->debug_flags & (LOG_PROC_OPEN | LOG_PROC_ALL))
13380 @@ -371,7 +396,11 @@
13381                 if (filep->private_data)
13382                         kfree(filep->private_data);     /* release memory */
13383         }
13384 +#ifdef COMPAT_USE_MODCOUNT_LOCK
13385 +       MOD_DEC_USE_COUNT;
13386 +#else
13387         unlock_kernel();
13388 +#endif
13389         return (retval);
13390  }                              /* hysdn_conf_close */
13391  
13392 @@ -387,6 +416,9 @@
13393         release:        hysdn_conf_close,                                       
13394  };
13395  
13396 +#ifdef COMPAT_NO_SOFTNET
13397 +static struct inode_operations conf_inode_operations;
13398 +#endif
13399  /*****************************/
13400  /* hysdn subdir in /proc/net */
13401  /*****************************/
13402 @@ -415,8 +447,17 @@
13403                 if ((card->procconf = (void *) create_proc_entry(conf_name,
13404                                              S_IFREG | S_IRUGO | S_IWUSR,
13405                                             hysdn_proc_entry)) != NULL) {
13406 +#ifdef COMPAT_NO_SOFTNET
13407 +                       memset(&conf_inode_operations, 0, sizeof(struct inode_operations));
13408 +                       conf_inode_operations.default_file_ops = &conf_fops;
13409 +
13410 +                       ((struct proc_dir_entry *) card->procconf)->ops = &conf_inode_operations;
13411 +#else
13412                         ((struct proc_dir_entry *) card->procconf)->proc_fops = &conf_fops;
13413 +#ifdef COMPAT_HAS_FILEOP_OWNER
13414                         ((struct proc_dir_entry *) card->procconf)->owner = THIS_MODULE;
13415 +#endif
13416 +#endif
13417                         hysdn_proclog_init(card);       /* init the log file entry */
13418                 }
13419                 card = card->next;      /* next entry */
13420 Index: linux-2.4.35.4/drivers/isdn/hysdn/hysdn_proclog.c
13421 ===================================================================
13422 --- linux-2.4.35.4.orig/drivers/isdn/hysdn/hysdn_proclog.c      2007-12-15 05:19:40.530730752 +0100
13423 +++ linux-2.4.35.4/drivers/isdn/hysdn/hysdn_proclog.c   2007-12-15 05:19:55.675593810 +0100
13424 @@ -1,4 +1,4 @@
13425 -/* $Id: hysdn_proclog.c,v 1.1.4.1 2001/11/20 14:19:37 kai Exp $
13426 +/* $Id$
13427   *
13428   * Linux driver for HYSDN cards, /proc/net filesystem log functions.
13429   *
13430 @@ -16,7 +16,9 @@
13431  #include <linux/poll.h>
13432  #include <linux/proc_fs.h>
13433  #include <linux/pci.h>
13434 +#ifndef COMPAT_USE_MODCOUNT_LOCK
13435  #include <linux/smp_lock.h>
13436 +#endif
13437  
13438  #include "hysdn_defs.h"
13439  
13440 @@ -115,8 +117,7 @@
13441         strcpy(ib->log_start, cp);      /* set output string */
13442         ib->next = NULL;
13443         ib->proc_ctrl = pd;     /* point to own control structure */
13444 -       save_flags(flags);
13445 -       cli();
13446 +       HYSDN_SPIN_LOCK(&card->irq_lock, flags);
13447         ib->usage_cnt = pd->if_used;
13448         if (!pd->log_head)
13449                 pd->log_head = ib;      /* new head */
13450 @@ -124,7 +125,7 @@
13451                 pd->log_tail->next = ib;        /* follows existing messages */
13452         pd->log_tail = ib;      /* new tail */
13453         i = pd->del_lock++;     /* get lock state */
13454 -       restore_flags(flags);
13455 +       HYSDN_SPIN_UNLOCK(&card->irq_lock, flags);
13456  
13457         /* delete old entrys */
13458         if (!i)
13459 @@ -210,7 +211,6 @@
13460         word ino;
13461         struct procdata *pd = NULL;
13462         hysdn_card *card;
13463 -       loff_t pos = *off;
13464  
13465         if (!*((struct log_data **) file->private_data)) {
13466                 if (file->f_flags & O_NONBLOCK)
13467 @@ -235,11 +235,11 @@
13468                 return (0);
13469  
13470         inf->usage_cnt--;       /* new usage count */
13471 -       file->private_data = &inf->next;        /* next structure */
13472 +       (struct log_data **) file->private_data = &inf->next;   /* next structure */
13473         if ((len = strlen(inf->log_start)) <= count) {
13474                 if (copy_to_user(buf, inf->log_start, len))
13475                         return -EFAULT;
13476 -               *off = pos + len;
13477 +               file->f_pos += len;
13478                 return (len);
13479         }
13480         return (0);
13481 @@ -255,7 +255,11 @@
13482         struct procdata *pd = NULL;
13483         ulong flags;
13484  
13485 +#ifdef COMPAT_USE_MODCOUNT_LOCK
13486 +       MOD_INC_USE_COUNT;
13487 +#else
13488         lock_kernel();
13489 +#endif
13490         card = card_root;
13491         while (card) {
13492                 pd = card->proclog;
13493 @@ -264,7 +268,11 @@
13494                 card = card->next;      /* search next entry */
13495         }
13496         if (!card) {
13497 +#ifdef COMPAT_USE_MODCOUNT_LOCK
13498 +               MOD_DEC_USE_COUNT;
13499 +#else
13500                 unlock_kernel();
13501 +#endif
13502                 return (-ENODEV);       /* device is unknown/invalid */
13503         }
13504         filep->private_data = card;     /* remember our own card */
13505 @@ -274,19 +282,24 @@
13506         } else if ((filep->f_mode & (FMODE_READ | FMODE_WRITE)) == FMODE_READ) {
13507  
13508                 /* read access -> log/debug read */
13509 -               save_flags(flags);
13510 -               cli();
13511 +               HYSDN_SPIN_LOCK(&card->irq_lock, flags);
13512                 pd->if_used++;
13513                 if (pd->log_head)
13514 -                       filep->private_data = &(pd->log_tail->next);
13515 +                       (struct log_data **) filep->private_data = &(pd->log_tail->next);
13516                 else
13517 -                       filep->private_data = &(pd->log_head);
13518 -               restore_flags(flags);
13519 +                       (struct log_data **) filep->private_data = &(pd->log_head);
13520 +               HYSDN_SPIN_UNLOCK(&card->irq_lock, flags);
13521         } else {                /* simultaneous read/write access forbidden ! */
13522 +#ifdef COMPAT_USE_MODCOUNT_LOCK
13523 +               MOD_DEC_USE_COUNT;
13524 +#else
13525                 unlock_kernel();
13526 +#endif
13527                 return (-EPERM);        /* no permission this time */
13528         }
13529 +#ifndef COMPAT_USE_MODCOUNT_LOCK
13530         unlock_kernel();
13531 +#endif
13532         return (0);
13533  }                              /* hysdn_log_open */
13534  
13535 @@ -306,7 +319,9 @@
13536         int flags, retval = 0;
13537  
13538  
13539 +#ifndef COMPAT_USE_MODCOUNT_LOCK
13540         lock_kernel();
13541 +#endif
13542         if ((filep->f_mode & (FMODE_READ | FMODE_WRITE)) == FMODE_WRITE) {
13543                 /* write only access -> write debug level written */
13544                 retval = 0;     /* success */
13545 @@ -314,8 +329,7 @@
13546                 /* read access -> log/debug read, mark one further file as closed */
13547  
13548                 pd = NULL;
13549 -               save_flags(flags);
13550 -               cli();
13551 +               HYSDN_SPIN_LOCK(&card->irq_lock, flags);
13552                 inf = *((struct log_data **) filep->private_data);      /* get first log entry */
13553                 if (inf)
13554                         pd = (struct procdata *) inf->proc_ctrl;        /* still entries there */
13555 @@ -338,7 +352,7 @@
13556                         inf->usage_cnt--;       /* decrement usage count for buffers */
13557                         inf = inf->next;
13558                 }
13559 -               restore_flags(flags);
13560 +               HYSDN_SPIN_UNLOCK(&card->irq_lock, flags);
13561  
13562                 if (pd)
13563                         if (pd->if_used <= 0)   /* delete buffers if last file closed */
13564 @@ -348,7 +362,11 @@
13565                                         kfree(inf);
13566                                 }
13567         }                       /* read access */
13568 +#ifdef COMPAT_USE_MODCOUNT_LOCK
13569 +       MOD_DEC_USE_COUNT;
13570 +#else
13571         unlock_kernel();
13572 +#endif
13573  
13574         return (retval);
13575  }                              /* hysdn_log_close */
13576 @@ -400,6 +418,9 @@
13577         release:        hysdn_log_close,                                        
13578  };
13579  
13580 +#ifdef COMPAT_NO_SOFTNET
13581 +struct inode_operations log_inode_operations;
13582 +#endif
13583  
13584  /***********************************************************************************/
13585  /* hysdn_proclog_init is called when the module is loaded after creating the cards */
13586 @@ -414,10 +435,20 @@
13587  
13588         if ((pd = (struct procdata *) kmalloc(sizeof(struct procdata), GFP_KERNEL)) != NULL) {
13589                 memset(pd, 0, sizeof(struct procdata));
13590 +#ifdef COMPAT_NO_SOFTNET
13591 +               memset(&log_inode_operations, 0, sizeof(struct inode_operations));
13592 +               log_inode_operations.default_file_ops = &log_fops;
13593 +#endif
13594                 sprintf(pd->log_name, "%s%d", PROC_LOG_BASENAME, card->myid);
13595                 if ((pd->log = create_proc_entry(pd->log_name, S_IFREG | S_IRUGO | S_IWUSR, hysdn_proc_entry)) != NULL) {
13596 +#ifdef COMPAT_NO_SOFTNET
13597 +                       pd->log->ops = &log_inode_operations;   /* set new operations table */
13598 +#else
13599                         pd->log->proc_fops = &log_fops; 
13600 +#ifdef COMPAT_HAS_FILEOP_OWNER
13601                         pd->log->owner = THIS_MODULE;
13602 +#endif
13603 +#endif
13604                 }
13605  
13606                 init_waitqueue_head(&(pd->rd_queue));
13607 Index: linux-2.4.35.4/drivers/isdn/hysdn/hysdn_sched.c
13608 ===================================================================
13609 --- linux-2.4.35.4.orig/drivers/isdn/hysdn/hysdn_sched.c        2007-12-15 05:19:40.538731208 +0100
13610 +++ linux-2.4.35.4/drivers/isdn/hysdn/hysdn_sched.c     2007-12-15 05:19:55.679594039 +0100
13611 @@ -1,4 +1,4 @@
13612 -/* $Id: hysdn_sched.c,v 1.1.4.1 2001/11/20 14:19:37 kai Exp $
13613 +/* $Id: hysdn_sched.c,v 1.9 2001/09/24 13:23:03 kai Exp $
13614   *
13615   * Linux driver for HYSDN cards
13616   * scheduler routines for handling exchange card <-> pc.
13617 @@ -12,11 +12,9 @@
13618   */
13619  
13620  #include <linux/config.h>
13621 -#include <linux/sched.h>
13622  #include <linux/signal.h>
13623  #include <linux/kernel.h>
13624  #include <linux/ioport.h>
13625 -#include <linux/interrupt.h>
13626  #include <asm/io.h>
13627  
13628  #include "hysdn_defs.h"
13629 @@ -151,22 +149,19 @@
13630  
13631         if (card->debug_flags & LOG_SCHED_ASYN)
13632                 hysdn_addlog(card, "async tx-cfg chan=%d len=%d", chan, strlen(line) + 1);
13633 -
13634 -       save_flags(flags);
13635 -       cli();
13636 +       HYSDN_SPIN_LOCK(&card->irq_lock, flags);
13637         while (card->async_busy) {
13638 -               sti();
13639 -
13640 +               HYSDN_SPIN_UNLOCK(&card->irq_lock, flags);
13641                 if (card->debug_flags & LOG_SCHED_ASYN)
13642                         hysdn_addlog(card, "async tx-cfg delayed");
13643  
13644                 set_current_state(TASK_INTERRUPTIBLE);
13645                 schedule_timeout((20 * HZ) / 1000);     /* Timeout 20ms */
13646                 if (!--cnt) {
13647 -                       restore_flags(flags);
13648 +                       HYSDN_SPIN_UNLOCK(&card->irq_lock, flags);
13649                         return (-ERR_ASYNC_TIME);       /* timed out */
13650                 }
13651 -               cli();
13652 +               HYSDN_SPIN_LOCK(&card->irq_lock, flags);
13653         }                       /* wait for buffer to become free */
13654  
13655         strcpy(card->async_data, line);
13656 @@ -177,31 +172,26 @@
13657         /* now queue the task */
13658         queue_task(&card->irq_queue, &tq_immediate);
13659         mark_bh(IMMEDIATE_BH);
13660 -       sti();
13661 -
13662 +       HYSDN_SPIN_UNLOCK(&card->irq_lock, flags);
13663         if (card->debug_flags & LOG_SCHED_ASYN)
13664                 hysdn_addlog(card, "async tx-cfg data queued");
13665  
13666         cnt++;                  /* short delay */
13667 -       cli();
13668 -
13669 +       HYSDN_SPIN_LOCK(&card->irq_lock, flags);
13670         while (card->async_busy) {
13671 -               sti();
13672 -
13673 +               HYSDN_SPIN_UNLOCK(&card->irq_lock, flags);
13674                 if (card->debug_flags & LOG_SCHED_ASYN)
13675                         hysdn_addlog(card, "async tx-cfg waiting for tx-ready");
13676  
13677                 set_current_state(TASK_INTERRUPTIBLE);
13678                 schedule_timeout((20 * HZ) / 1000);     /* Timeout 20ms */
13679                 if (!--cnt) {
13680 -                       restore_flags(flags);
13681 +                       HYSDN_SPIN_UNLOCK(&card->irq_lock, flags);
13682                         return (-ERR_ASYNC_TIME);       /* timed out */
13683                 }
13684 -               cli();
13685 +               HYSDN_SPIN_LOCK(&card->irq_lock, flags);
13686         }                       /* wait for buffer to become free again */
13687 -
13688 -       restore_flags(flags);
13689 -
13690 +       HYSDN_SPIN_UNLOCK(&card->irq_lock, flags);
13691         if (card->debug_flags & LOG_SCHED_ASYN)
13692                 hysdn_addlog(card, "async tx-cfg data send");
13693  
13694 Index: linux-2.4.35.4/drivers/isdn/icn/icn.c
13695 ===================================================================
13696 --- linux-2.4.35.4.orig/drivers/isdn/icn/icn.c  2007-12-15 05:19:40.546731666 +0100
13697 +++ linux-2.4.35.4/drivers/isdn/icn/icn.c       2007-12-15 05:19:55.679594039 +0100
13698 @@ -1,4 +1,4 @@
13699 -/* $Id: icn.c,v 1.1.4.1 2001/11/20 14:19:37 kai Exp $
13700 +/* $Id$
13701   *
13702   * ISDN low-level module for the ICN active ISDN-Card.
13703   *
13704 @@ -41,7 +41,7 @@
13705  #undef MAP_DEBUG
13706  
13707  static char
13708 -*revision = "$Revision: 1.1.4.1 $";
13709 +*revision = "$Revision$";
13710  
13711  static int icn_addcard(int, char *, char *);
13712  
13713 @@ -1634,6 +1634,7 @@
13714  }
13715  
13716  #ifndef MODULE
13717 +#ifdef COMPAT_HAS_NEW_SETUP
13718  static int __init
13719  icn_setup(char *line)
13720  {
13721 @@ -1643,6 +1644,14 @@
13722         static char sid2[20];
13723  
13724         str = get_options(line, 2, ints);
13725 +#else
13726 +void
13727 +icn_setup(char *str, int *ints)
13728 +{
13729 +       char *p;
13730 +       static char sid[20];
13731 +       static char sid2[20];
13732 +#endif
13733         if (ints[0])
13734                 portbase = ints[1];
13735         if (ints[0] > 1)
13736 @@ -1656,9 +1665,13 @@
13737                         icn_id2 = sid2;
13738                 }
13739         }
13740 +#ifdef COMPAT_HAS_NEW_SETUP
13741         return(1);
13742  }
13743  __setup("icn=", icn_setup);
13744 +#else
13745 +}
13746 +#endif
13747  #endif /* MODULE */
13748  
13749  static int __init icn_init(void)
13750 Index: linux-2.4.35.4/drivers/isdn/icn/icn.h
13751 ===================================================================
13752 --- linux-2.4.35.4.orig/drivers/isdn/icn/icn.h  2007-12-15 05:19:40.554732121 +0100
13753 +++ linux-2.4.35.4/drivers/isdn/icn/icn.h       2007-12-15 05:19:55.679594039 +0100
13754 @@ -1,4 +1,4 @@
13755 -/* $Id: icn.h,v 1.1.4.1 2001/11/20 14:19:37 kai Exp $
13756 +/* $Id$
13757   *
13758   * ISDN lowlevel-module for the ICN active ISDN-Card.
13759   *
13760 Index: linux-2.4.35.4/drivers/isdn/isdn_audio.c
13761 ===================================================================
13762 --- linux-2.4.35.4.orig/drivers/isdn/isdn_audio.c       2007-12-15 05:19:40.562732576 +0100
13763 +++ linux-2.4.35.4/drivers/isdn/isdn_audio.c    2007-12-15 05:19:55.679594039 +0100
13764 @@ -1,9 +1,9 @@
13765 -/* $Id: isdn_audio.c,v 1.1.4.1 2001/11/20 14:19:33 kai Exp $
13766 +/* $Id: isdn_audio.c,v 1.24 2002/08/13 09:57:26 keil Exp $
13767   *
13768   * Linux ISDN subsystem, audio conversion and compression (linklevel).
13769   *
13770   * Copyright 1994-1999 by Fritz Elfert (fritz@isdn4linux.de)
13771 - * DTMF code (c) 1996 by Christian Mock (cm@kukuruz.ping.at)
13772 + * DTMF code (c) 1996 by Christian Mock (cm@tahina.priv.at)
13773   * Silence detection (c) 1998 by Armin Schindler (mac@gismo.telekom.de)
13774   *
13775   * This software may be used and distributed according to the terms
13776 @@ -15,7 +15,7 @@
13777  #include "isdn_audio.h"
13778  #include "isdn_common.h"
13779  
13780 -char *isdn_audio_revision = "$Revision: 1.1.4.1 $";
13781 +char *isdn_audio_revision = "$Revision: 1.24 $";
13782  
13783  /*
13784   * Misc. lookup-tables.
13785 @@ -169,19 +169,39 @@
13786         0x8a, 0x8a, 0x6a, 0x6a, 0xea, 0xea, 0x2a, 0x2a
13787  };
13788  
13789 -#define NCOEFF            8     /* number of frequencies to be analyzed       */
13790 -#define DTMF_TRESH     4000     /* above this is dtmf                         */
13791 +#define NCOEFF           16     /* number of frequencies to be analyzed       */
13792 +#define DTMF_TRESH    25000     /* above this is dtmf                         */
13793  #define SILENCE_TRESH   200     /* below this is silence                      */
13794 +#define H2_TRESH      20000     /* 2nd harmonic                               */
13795  #define AMP_BITS          9     /* bits per sample, reduced to avoid overflow */
13796  #define LOGRP             0
13797  #define HIGRP             1
13798  
13799 +typedef struct {
13800 +       int grp;                /* low/high group     */
13801 +       int k;                  /* k                  */
13802 +       int k2;                 /* k fuer 2. harmonic */
13803 +} dtmf_t;
13804 +
13805  /* For DTMF recognition:
13806   * 2 * cos(2 * PI * k / N) precalculated for all k
13807   */
13808  static int cos2pik[NCOEFF] =
13809  {
13810 -       55813, 53604, 51193, 48591, 38114, 33057, 25889, 18332
13811 +       55812, 29528, 53603, 24032, 51193, 14443, 48590, 6517,
13812 +       38113, -21204, 33057, -32186, 25889, -45081, 18332, -55279
13813 +};
13814 +
13815 +static dtmf_t dtmf_tones[8] =
13816 +{
13817 +       {LOGRP, 0, 1},          /*  697 Hz */
13818 +       {LOGRP, 2, 3},          /*  770 Hz */
13819 +       {LOGRP, 4, 5},          /*  852 Hz */
13820 +       {LOGRP, 6, 7},          /*  941 Hz */
13821 +       {HIGRP, 8, 9},          /* 1209 Hz */
13822 +       {HIGRP, 10, 11},        /* 1336 Hz */
13823 +       {HIGRP, 12, 13},        /* 1477 Hz */
13824 +       {HIGRP, 14, 15}         /* 1633 Hz */
13825  };
13826  
13827  static char dtmf_matrix[4][4] =
13828 @@ -208,7 +228,7 @@
13829         :       "memory", "ax");
13830  #else
13831         while (n--)
13832 -               *buff = table[*(unsigned char *)buff], buff++;
13833 +               *buff++ = table[*(unsigned char *)buff];
13834  #endif
13835  }
13836  
13837 @@ -479,18 +499,6 @@
13838                         sk2 = sk1;
13839                         sk1 = sk;
13840                 }
13841 -               /* Avoid overflows */
13842 -               sk >>= 1;
13843 -               sk2 >>= 1;
13844 -               /* compute |X(k)|**2 */
13845 -               /* report overflows. This should not happen. */
13846 -               /* Comment this out if desired */
13847 -               if (sk < -32768 || sk > 32767)
13848 -                       printk(KERN_DEBUG
13849 -                              "isdn_audio: dtmf goertzel overflow, sk=%d\n", sk);
13850 -               if (sk2 < -32768 || sk2 > 32767)
13851 -                       printk(KERN_DEBUG
13852 -                              "isdn_audio: dtmf goertzel overflow, sk2=%d\n", sk2);
13853                 result[k] =
13854                     ((sk * sk) >> AMP_BITS) -
13855                     ((((cos2pik[k] * sk) >> 15) * sk2) >> AMP_BITS) +
13856 @@ -514,58 +522,28 @@
13857         int grp[2];
13858         char what;
13859         char *p;
13860 -       int thresh;
13861  
13862         while ((skb = skb_dequeue(&info->dtmf_queue))) {
13863                 result = (int *) skb->data;
13864                 s = info->dtmf_state;
13865 -               grp[LOGRP] = grp[HIGRP] = -1;
13866 +               grp[LOGRP] = grp[HIGRP] = -2;
13867                 silence = 0;
13868 -               thresh = 0;
13869 -               for (i = 0; i < NCOEFF; i++) {
13870 -                       if (result[i] > DTMF_TRESH) {
13871 -                               if (result[i] > thresh)
13872 -                                       thresh = result[i];
13873 -                       }
13874 -                       else if (result[i] < SILENCE_TRESH)
13875 +               for (i = 0; i < 8; i++) {
13876 +                       if ((result[dtmf_tones[i].k] > DTMF_TRESH) &&
13877 +                           (result[dtmf_tones[i].k2] < H2_TRESH))
13878 +                               grp[dtmf_tones[i].grp] = (grp[dtmf_tones[i].grp] == -2) ? i : -1;
13879 +                       else if ((result[dtmf_tones[i].k] < SILENCE_TRESH) &&
13880 +                             (result[dtmf_tones[i].k2] < SILENCE_TRESH))
13881                                 silence++;
13882                 }
13883 -               if (silence == NCOEFF)
13884 +               if (silence == 8)
13885                         what = ' ';
13886                 else {
13887 -                       if (thresh > 0) {
13888 -                               thresh = thresh >> 4;  /* touchtones must match within 12 dB */
13889 -                               for (i = 0; i < NCOEFF; i++) {
13890 -                                       if (result[i] < thresh)
13891 -                                               continue;  /* ignore */
13892 -                                       /* good level found. This is allowed only one time per group */
13893 -                                       if (i < NCOEFF / 2) {
13894 -                                               /* lowgroup*/
13895 -                                               if (grp[LOGRP] >= 0) {
13896 -                                                       // Bad. Another tone found. */
13897 -                                                       grp[LOGRP] = -1;
13898 -                                                       break;
13899 -                                               }
13900 -                                               else
13901 -                                                       grp[LOGRP] = i;
13902 -                                       }
13903 -                                       else { /* higroup */
13904 -                                               if (grp[HIGRP] >= 0) { // Bad. Another tone found. */
13905 -                                                       grp[HIGRP] = -1;
13906 -                                                       break;
13907 -                                               }
13908 -                                               else
13909 -                                                       grp[HIGRP] = i - NCOEFF/2;
13910 -                                       }
13911 -                               }
13912 -                               if ((grp[LOGRP] >= 0) && (grp[HIGRP] >= 0)) {
13913 -                                       what = dtmf_matrix[grp[LOGRP]][grp[HIGRP]];
13914 -                                       if (s->last != ' ' && s->last != '.')
13915 -                                               s->last = what; /* min. 1 non-DTMF between DTMF */
13916 -                               } else
13917 -                                       what = '.';
13918 -                       }
13919 -                       else
13920 +                       if ((grp[LOGRP] >= 0) && (grp[HIGRP] >= 0)) {
13921 +                               what = dtmf_matrix[grp[LOGRP]][grp[HIGRP] - 4];
13922 +                               if (s->last != ' ' && s->last != '.')
13923 +                                       s->last = what; /* min. 1 non-DTMF between DTMF */
13924 +                       } else
13925                                 what = '.';
13926                 }
13927                 if ((what != s->last) && (what != ' ') && (what != '.')) {
13928 Index: linux-2.4.35.4/drivers/isdn/isdn_audio.h
13929 ===================================================================
13930 --- linux-2.4.35.4.orig/drivers/isdn/isdn_audio.h       2007-12-15 05:19:40.566732806 +0100
13931 +++ linux-2.4.35.4/drivers/isdn/isdn_audio.h    2007-12-15 05:19:55.683594266 +0100
13932 @@ -1,4 +1,4 @@
13933 -/* $Id: isdn_audio.h,v 1.1.4.1 2001/11/20 14:19:34 kai Exp $
13934 +/* $Id: isdn_audio.h,v 1.10 2001/09/24 13:22:42 kai Exp $
13935   *
13936   * Linux ISDN subsystem, audio conversion and compression (linklevel).
13937   *
13938 @@ -20,7 +20,6 @@
13939  
13940  typedef struct dtmf_state {
13941         char last;
13942 -       char llast;
13943         int idx;
13944         int buf[DTMF_NPOINTS];
13945  } dtmf_state;
13946 Index: linux-2.4.35.4/drivers/isdn/isdn_bsdcomp.c
13947 ===================================================================
13948 --- linux-2.4.35.4.orig/drivers/isdn/isdn_bsdcomp.c     2007-12-15 05:19:40.574733261 +0100
13949 +++ linux-2.4.35.4/drivers/isdn/isdn_bsdcomp.c  2007-12-15 05:19:55.683594266 +0100
13950 @@ -105,6 +105,14 @@
13951  
13952  #define DEBUG 1
13953  
13954 +#ifdef CONFIG_ISDN_WITH_ABC
13955 +#define BSD_C_MALLOC(x)     kmalloc((x),GFP_ATOMIC)
13956 +#define BSD_C_FREE(x)       kfree(x)
13957 +#else
13958 +#define BSD_C_MALLOC(x)     vmalloc(x)
13959 +#define BSD_C_FREE(x)       vfree(x)
13960 +#endif
13961 +
13962  /*
13963   * A dictionary for doing BSD compress.
13964   */
13965 @@ -285,7 +293,7 @@
13966                  * Release the dictionary
13967                  */
13968                 if (db->dict) {
13969 -                       vfree (db->dict);
13970 +                       BSD_C_FREE (db->dict);
13971                         db->dict = NULL;
13972                 }
13973  
13974 @@ -293,7 +301,7 @@
13975                  * Release the string buffer
13976                  */
13977                 if (db->lens) {
13978 -                       vfree (db->lens);
13979 +                       BSD_C_FREE (db->lens);
13980                         db->lens = NULL;
13981                 }
13982  
13983 @@ -350,14 +358,19 @@
13984          * Allocate space for the dictionary. This may be more than one page in
13985          * length.
13986          */
13987 -       db->dict = (struct bsd_dict *) vmalloc (hsize * sizeof (struct bsd_dict));
13988 +       db->dict = (struct bsd_dict *) BSD_C_MALLOC (hsize * sizeof (struct bsd_dict));
13989 +
13990 +       MOD_INC_USE_COUNT;
13991 +       /*
13992 +       ** MOD_INC_USE_COUNT must be before bsd_free
13993 +       ** bsd_free make MOD_DEC_USE_COUNT if db != NULL
13994 +       */
13995 +
13996         if (!db->dict) {
13997                 bsd_free (db);
13998                 return NULL;
13999         }
14000  
14001 -       MOD_INC_USE_COUNT;
14002 -
14003         /*
14004          * If this is the compression buffer then there is no length data.
14005          * For decompression, the length information is needed as well.
14006 @@ -365,7 +378,7 @@
14007         if (!decomp)
14008                 db->lens = NULL;
14009         else {
14010 -               db->lens = (unsigned short *) vmalloc ((maxmaxcode + 1) *
14011 +               db->lens = (unsigned short *) BSD_C_MALLOC ((maxmaxcode + 1) *
14012                         sizeof (db->lens[0]));
14013                 if (!db->lens) {
14014                         bsd_free (db); /* calls MOD_DEC_USE_COUNT; */
14015 @@ -478,7 +491,11 @@
14016         int hval,disp,ilen,mxcode;
14017         unsigned char *rptr = skb_in->data;
14018         int isize = skb_in->len;
14019 +#ifdef CONFIG_ISDN_WITH_ABC
14020 +       long secure = 0;
14021 +#endif
14022  
14023 +#ifndef CONFIG_ISDN_WITH_ABC
14024  #define OUTPUT(ent)                    \
14025    {                                    \
14026      bitno -= n_bits;                   \
14027 @@ -490,17 +507,45 @@
14028         bitno += 8;                     \
14029      } while (bitno <= 24);             \
14030    }
14031 +#else
14032 +#define OUTPUT(ent)                    \
14033 +  {                                    \
14034 +       secure = 0;                                     \
14035 +    bitno -= n_bits;                   \
14036 +    accm |= ((ent) << bitno);          \
14037 +    do {                               \
14038 +        if(skb_out && skb_tailroom(skb_out) > 0)       \
14039 +               *(skb_put(skb_out,1)) = (unsigned char) (accm>>24); \
14040 +       accm <<= 8;                     \
14041 +       bitno += 8;                     \
14042 +       } while (bitno <= 24 && ++secure < 10000);              \
14043 +       if(secure >= 10000) {                                                   \
14044 +               printk(KERN_DEBUG "BSD in OUTPUT secure counter reached\n");    \
14045 +               return 0;                                                                       \
14046 +       }                                                                                               \
14047 +  }
14048 +#endif
14049  
14050         /*
14051          * If the protocol is not in the range we're interested in,
14052          * just return without compressing the packet.  If it is,
14053          * the protocol becomes the first byte to compress.
14054          */
14055 +#ifdef CONFIG_ISDN_WITH_ABC
14056 +       ent = proto;
14057 +
14058 +       if (proto < 0x21 || proto > 0xf9 || !(proto & 0x1) ) {
14059 +
14060 +               printk(KERN_DEBUG "bsd_compress called with %x\n",proto);
14061 +               return 0;
14062 +       }
14063 +#else
14064         printk(KERN_DEBUG "bsd_compress called with %x\n",proto);
14065         
14066         ent = proto;
14067         if (proto < 0x21 || proto > 0xf9 || !(proto & 0x1) )
14068                 return 0;
14069 +#endif
14070  
14071         db      = (struct bsd_db *) state;
14072         hshift  = db->hshift;
14073 @@ -538,6 +583,9 @@
14074         
14075                 /* continue probing until a match or invalid entry */
14076                 disp = (hval == 0) ? 1 : hval;
14077 +#ifdef CONFIG_ISDN_WITH_ABC
14078 +               secure = 0;
14079 +#endif
14080  
14081                 do {
14082                         hval += disp;
14083 @@ -546,7 +594,15 @@
14084                         dictp = dict_ptr (db, hval);
14085                         if (dictp->codem1 >= max_ent)
14086                                 goto nomatch;
14087 +#ifndef CONFIG_ISDN_WITH_ABC
14088                 } while (dictp->fcode != fcode);
14089 +#else
14090 +               } while (dictp->fcode != fcode && ++secure < 100000);
14091 +               if(secure >= 100000) {
14092 +                       printk(KERN_DEBUG "BSD: compress while dictp->fcode != fcode secure-counter reached\n");
14093 +                       return 0;
14094 +               }
14095 +#endif
14096  
14097                 ent = dictp->codem1 + 1;        /* finally found (prefix,suffix) */
14098                 continue;
14099 @@ -669,6 +725,9 @@
14100         int ilen;
14101         int codelen;
14102         int extra;
14103 +#ifdef CONFIG_ISDN_WITH_ABC
14104 +       unsigned long secure = 0;
14105 +#endif
14106  
14107         db       = (struct bsd_db *) state;
14108         max_ent  = db->max_ent;
14109 @@ -677,7 +736,9 @@
14110         n_bits   = db->n_bits;
14111         tgtbitno = 32 - n_bits; /* bitno when we have a code */
14112  
14113 +#ifndef CONFIG_ISDN_WITH_ABC
14114         printk(KERN_DEBUG "bsd_decompress called\n");
14115 +#endif
14116  
14117         if(!skb_in || !skb_out) {
14118                 printk(KERN_ERR "bsd_decompress called with NULL parameter\n");
14119 @@ -795,7 +856,11 @@
14120  
14121                 p     = skb_put(skb_out,codelen);
14122                 p += codelen;
14123 +#ifdef CONFIG_ISDN_WITH_ABC
14124 +               for(secure = 0; finchar > LAST && secure < 50000;secure++) {
14125 +#else
14126                 while (finchar > LAST) {
14127 +#endif
14128                         struct bsd_dict *dictp2 = dict_ptr (db, finchar);
14129             
14130                         dictp = dict_ptr (db, dictp2->cptr);
14131 @@ -822,6 +887,12 @@
14132                         }
14133                 }
14134                 *--p = finchar;
14135 +#ifdef CONFIG_ISDN_WITH_ABC
14136 +               if(secure >= 50000) {
14137 +                       printk(KERN_DEBUG "BSD: decompress secure-counter reached\n");
14138 +                       return DECOMP_FATALERROR;
14139 +               }
14140 +#endif
14141         
14142  #ifdef DEBUG
14143                 if (--codelen != 0)
14144 @@ -851,12 +922,23 @@
14145                         /* look for a free hash table entry */
14146                         if (dictp->codem1 < max_ent) {
14147                                 disp = (hval == 0) ? 1 : hval;
14148 +#ifdef CONFIG_ISDN_WITH_ABC
14149 +                               secure = 0;
14150 +#endif
14151                                 do {
14152                                         hval += disp;
14153                                         if (hval >= db->hsize)
14154                                                 hval -= db->hsize;
14155                                         dictp = dict_ptr (db, hval);
14156 +#ifndef CONFIG_ISDN_WITH_ABC
14157                                 } while (dictp->codem1 < max_ent);
14158 +#else
14159 +                               } while (dictp->codem1 < max_ent && ++secure < 50000);
14160 +                               if(secure >= 50000) {
14161 +                                       printk(KERN_DEBUG "BSD: decomp while (dictp->codem1 < max_ent) secure-counter reached\n");
14162 +                                       return DECOMP_FATALERROR;
14163 +                               }
14164 +#endif
14165                         }
14166             
14167                         /*
14168 @@ -895,11 +977,21 @@
14169         db->comp_bytes   += skb_in->len - BSD_OVHD;
14170         db->uncomp_bytes += skb_out->len;
14171  
14172 +#ifdef CONFIG_ISDN_WITH_ABC
14173 +       /*
14174 +       ** bsd_check will call bsd_clear 
14175 +       ** and so on the internal tables will be cleared.
14176 +       **
14177 +       ** I think that's not what we will at this point ?????
14178 +       ** For me at works without bsd_check.
14179 +       */
14180 +#else
14181         if (bsd_check(db)) {
14182                 if (db->debug)
14183                         printk(KERN_DEBUG "bsd_decomp%d: peer should have cleared dictionary on %d\n",
14184                                 db->unit, db->seqno - 1);
14185         }
14186 +#endif
14187         return skb_out->len;
14188  }
14189  
14190 Index: linux-2.4.35.4/drivers/isdn/isdn_common.c
14191 ===================================================================
14192 --- linux-2.4.35.4.orig/drivers/isdn/isdn_common.c      2007-12-15 05:19:40.582733716 +0100
14193 +++ linux-2.4.35.4/drivers/isdn/isdn_common.c   2007-12-15 05:19:55.687594492 +0100
14194 @@ -1,4 +1,4 @@
14195 -/* $Id: isdn_common.c,v 1.1.4.1 2001/11/20 14:19:34 kai Exp $
14196 +/* $Id: isdn_common.c,v 1.137 2002/02/09 21:19:11 keil Exp $
14197   *
14198   * Linux ISDN subsystem, common used functions (linklevel).
14199   *
14200 @@ -19,6 +19,7 @@
14201  #include <linux/vmalloc.h>
14202  #include <linux/isdn.h>
14203  #include <linux/smp_lock.h>
14204 +#include <linux/list.h>
14205  #include "isdn_common.h"
14206  #include "isdn_tty.h"
14207  #include "isdn_net.h"
14208 @@ -33,7 +34,9 @@
14209  #include <linux/isdn_divertif.h>
14210  #endif /* CONFIG_ISDN_DIVERSION */
14211  #include "isdn_v110.h"
14212 +#ifdef HAVE_DEVFS_FS
14213  #include <linux/devfs_fs_kernel.h>
14214 +#endif /* HAVE_DEVFS_FS */
14215  
14216  /* Debugflags */
14217  #undef ISDN_DEBUG_STATCALLB
14218 @@ -44,7 +47,7 @@
14219  
14220  isdn_dev *dev;
14221  
14222 -static char *isdn_revision = "$Revision: 1.1.4.1 $";
14223 +static char *isdn_revision = "$Revision: 1.137 $";
14224  
14225  extern char *isdn_net_revision;
14226  extern char *isdn_tty_revision;
14227 @@ -67,19 +70,19 @@
14228  
14229  static int isdn_writebuf_stub(int, int, const u_char *, int, int);
14230  static void set_global_features(void);
14231 +#ifdef HAVE_DEVFS_FS
14232  static void isdn_register_devfs(int);
14233  static void isdn_unregister_devfs(int);
14234 +#endif /* HAVE_DEVFS_FS */
14235  static int isdn_wildmat(char *s, char *p);
14236  
14237  void
14238  isdn_lock_drivers(void)
14239  {
14240         int i;
14241 -       isdn_ctrl cmd;
14242  
14243 -       for (i = 0; i < ISDN_MAX_DRIVERS; i++) {
14244 -               if (!dev->drv[i])
14245 -                       continue;
14246 +       for (i = 0; i < dev->drivers; i++) {
14247 +               isdn_ctrl cmd;
14248  
14249                 cmd.driver = i;
14250                 cmd.arg = 0;
14251 @@ -101,10 +104,7 @@
14252  {
14253         int i;
14254  
14255 -       for (i = 0; i < ISDN_MAX_DRIVERS; i++) {
14256 -               if (!dev->drv[i])
14257 -                       continue;
14258 -
14259 +       for (i = 0; i < dev->drivers; i++)
14260                 if (dev->drv[i]->locks > 0) {
14261                         isdn_ctrl cmd;
14262  
14263 @@ -114,7 +114,6 @@
14264                         isdn_command(&cmd);
14265                         dev->drv[i]->locks--;
14266                 }
14267 -       }
14268  }
14269  
14270  void
14271 @@ -473,6 +472,7 @@
14272                         dev->drv[di]->flags &= ~DRV_FLAG_RUNNING;
14273                         break;
14274                 case ISDN_STAT_ICALL:
14275 +               case ISDN_STAT_ICALLW:
14276                         if (i < 0)
14277                                 return -1;
14278  #ifdef ISDN_DEBUG_STATCALLB
14279 @@ -718,7 +718,9 @@
14280                                         dev->drvmap[i] = -1;
14281                                         dev->chanmap[i] = -1;
14282                                         dev->usage[i] &= ~ISDN_USAGE_DISABLED;
14283 +#ifdef HAVE_DEVFS_FS
14284                                         isdn_unregister_devfs(i);
14285 +#endif /* HAVE_DEVFS_FS */
14286                                 }
14287                         dev->drivers--;
14288                         dev->channels -= dev->drv[di]->channels;
14289 @@ -755,6 +757,10 @@
14290                          if (divert_if)
14291                            return(divert_if->stat_callback(c));
14292  #endif /* CONFIG_ISDN_DIVERSION */
14293 +               case ISDN_STAT_ALERT:
14294 +               case ISDN_STAT_PROCEED:
14295 +                       isdn_tty_stat_callback(i, c);
14296 +                       break;
14297                 default:
14298                         return -1;
14299         }
14300 @@ -900,72 +906,239 @@
14301         return (dev->chanmap[minor]);
14302  }
14303  
14304 -static char *
14305 -isdn_statstr(void)
14306 +// ----------------------------------------------------------------------
14307 +// /dev/isdninfo
14308 +// 
14309 +// This device has somewhat insane semantics, but we need to support
14310 +// them for the sake of compatibility.
14311 +//
14312 +// After opening, the first read will succeed and return the current state
14313 +// Then, unless O_NONBLOCK is set, it will block until a state change happens
14314 +// and then return the new state.
14315 +// Also, if the buffer size for the read is too small, we'll just return
14316 +// EOF
14317 +
14318 +struct isdnstatus_dev {
14319 +       struct list_head list;
14320 +       int update;
14321 +};
14322 +
14323 +static DECLARE_WAIT_QUEUE_HEAD(isdnstatus_waitq);
14324 +static LIST_HEAD(isdnstatus_devs);
14325 +static spinlock_t isdnstatus_devs_lock = SPIN_LOCK_UNLOCKED;
14326 +
14327 +void
14328 +isdn_info_update(void)
14329 +{
14330 +       struct list_head *p;
14331 +       struct isdnstatus_dev *idev;
14332 +
14333 +       spin_lock(&isdnstatus_devs_lock);
14334 +       list_for_each(p, &isdnstatus_devs) {
14335 +               idev = list_entry(p, struct isdnstatus_dev, list);
14336 +               idev->update = 1;
14337 +       }
14338 +       spin_unlock(&isdnstatus_devs_lock);
14339 +       wake_up_interruptible(&isdnstatus_waitq);
14340 +}
14341 +
14342 +static int
14343 +isdnstatus_open(struct inode *ino, struct file *filep)
14344 +{
14345 +       struct isdnstatus_dev *p;
14346 +
14347 +       p = kmalloc(sizeof(struct isdnstatus_dev), GFP_USER);
14348 +       if (!p)
14349 +               return -ENOMEM;
14350 +
14351 +       /* At opening time we allow a single update */
14352 +       p->update = 1;
14353 +       spin_lock(&isdnstatus_devs_lock);
14354 +       list_add(&p->list, &isdnstatus_devs);
14355 +       spin_unlock(&isdnstatus_devs_lock);
14356 +       filep->private_data = p;
14357 +
14358 +       return 0;
14359 +}
14360 +
14361 +static void
14362 +isdnstatus_close(struct inode *ino, struct file *filep)
14363 +{
14364 +       struct isdnstatus_dev *p = filep->private_data;
14365 +
14366 +       spin_lock(&isdnstatus_devs_lock);
14367 +       list_del(&p->list);
14368 +       spin_unlock(&isdnstatus_devs_lock);
14369 +       kfree(p);
14370 +}
14371 +
14372 +// FIXME we don't lock against the state changing whilst being
14373 +// printed
14374 +
14375 +void
14376 +isdn_statstr(char *buf)
14377  {
14378 -       static char istatbuf[2048];
14379         char *p;
14380         int i;
14381  
14382 -       sprintf(istatbuf, "idmap:\t");
14383 -       p = istatbuf + strlen(istatbuf);
14384 +       p = buf;
14385 +       p += sprintf(p, "idmap:\t");
14386         for (i = 0; i < ISDN_MAX_CHANNELS; i++) {
14387 -               sprintf(p, "%s ", (dev->drvmap[i] < 0) ? "-" : dev->drvid[dev->drvmap[i]]);
14388 -               p = istatbuf + strlen(istatbuf);
14389 +               p += sprintf(p, "%s ", (dev->drvmap[i] < 0) ? "-" : dev->drvid[dev->drvmap[i]]);
14390         }
14391 -       sprintf(p, "\nchmap:\t");
14392 -       p = istatbuf + strlen(istatbuf);
14393 +       p += sprintf(p, "\nchmap:\t");
14394         for (i = 0; i < ISDN_MAX_CHANNELS; i++) {
14395 -               sprintf(p, "%d ", dev->chanmap[i]);
14396 -               p = istatbuf + strlen(istatbuf);
14397 +               p += sprintf(p, "%d ", dev->chanmap[i]);
14398         }
14399 -       sprintf(p, "\ndrmap:\t");
14400 -       p = istatbuf + strlen(istatbuf);
14401 +       p += sprintf(p, "\ndrmap:\t");
14402         for (i = 0; i < ISDN_MAX_CHANNELS; i++) {
14403 -               sprintf(p, "%d ", dev->drvmap[i]);
14404 -               p = istatbuf + strlen(istatbuf);
14405 +               p += sprintf(p, "%d ", dev->drvmap[i]);
14406         }
14407 -       sprintf(p, "\nusage:\t");
14408 -       p = istatbuf + strlen(istatbuf);
14409 +       p += sprintf(p, "\nusage:\t");
14410         for (i = 0; i < ISDN_MAX_CHANNELS; i++) {
14411 -               sprintf(p, "%d ", dev->usage[i]);
14412 -               p = istatbuf + strlen(istatbuf);
14413 +               p += sprintf(p, "%d ", dev->usage[i]);
14414         }
14415 -       sprintf(p, "\nflags:\t");
14416 -       p = istatbuf + strlen(istatbuf);
14417 +       p += sprintf(p, "\nflags:\t");
14418         for (i = 0; i < ISDN_MAX_DRIVERS; i++) {
14419                 if (dev->drv[i]) {
14420 -                       sprintf(p, "%ld ", dev->drv[i]->online);
14421 -                       p = istatbuf + strlen(istatbuf);
14422 +                       p += sprintf(p, "%ld ", dev->drv[i]->online);
14423                 } else {
14424 -                       sprintf(p, "? ");
14425 -                       p = istatbuf + strlen(istatbuf);
14426 +                       p += sprintf(p, "? ");
14427                 }
14428         }
14429 -       sprintf(p, "\nphone:\t");
14430 -       p = istatbuf + strlen(istatbuf);
14431 +       p += sprintf(p, "\nphone:\t");
14432         for (i = 0; i < ISDN_MAX_CHANNELS; i++) {
14433 -               sprintf(p, "%s ", dev->num[i]);
14434 -               p = istatbuf + strlen(istatbuf);
14435 +               p += sprintf(p, "%s ", dev->num[i]);
14436         }
14437 -       sprintf(p, "\n");
14438 -       return istatbuf;
14439 +       p += sprintf(p, "\n");
14440  }
14441  
14442 -/* Module interface-code */
14443 +static ssize_t
14444 +isdnstatus_read(struct file *file, char *buf, size_t count, loff_t * off)
14445 +{
14446 +       static DECLARE_MUTEX(istatbuf_mutex);
14447 +       static char istatbuf[2048];
14448  
14449 -void
14450 -isdn_info_update(void)
14451 +        DECLARE_WAITQUEUE(wait, current);
14452 +       struct isdnstatus_dev *idev;
14453 +       int retval = 0;
14454 +       unsigned int len;
14455 +
14456 +       idev = file->private_data;
14457 +
14458 +       if (off != &file->f_pos)
14459 +               return -ESPIPE;
14460 +
14461 +        add_wait_queue(&isdnstatus_waitq, &wait);
14462 +        for (;;) {
14463 +                set_current_state(TASK_INTERRUPTIBLE);
14464 +                
14465 +               if (idev->update)
14466 +                        break;
14467 +
14468 +                retval = -EAGAIN;
14469 +                if (file->f_flags & O_NONBLOCK)
14470 +                        break;
14471 +
14472 +                retval = -ERESTARTSYS;
14473 +                if (signal_pending(current))
14474 +                        break;
14475 +
14476 +                schedule();
14477 +        }
14478 +        __set_current_state(TASK_RUNNING);
14479 +        remove_wait_queue(&isdnstatus_waitq, &wait);
14480 +
14481 +       if (!idev->update)
14482 +               goto out;
14483 +
14484 +       idev->update = 0;
14485 +       down(&istatbuf_mutex);
14486 +       isdn_statstr(istatbuf);
14487 +       len = strlen(istatbuf);
14488 +       if (len > count) {
14489 +               retval = 0;
14490 +               goto out_unlock;
14491 +       }
14492 +       if (copy_to_user(buf, istatbuf, len)) {
14493 +               retval = -EFAULT;
14494 +               goto out_unlock;
14495 +       }
14496 +       *off += len;
14497 +       retval = len;
14498 +
14499 + out_unlock:
14500 +       up(&istatbuf_mutex);
14501 + out:
14502 +       return retval;
14503 +}
14504 +
14505 +static ssize_t
14506 +isdnstatus_write(struct file *file, const char *buf, size_t count, loff_t * off)
14507  {
14508 -       infostruct *p = dev->infochain;
14509 +       return -EINVAL;
14510 +}
14511 +
14512 +static unsigned int
14513 +isdnstatus_poll(struct file *file, poll_table * wait)
14514 +{
14515 +       struct isdnstatus_dev *idev;
14516 +       unsigned int mask = 0;
14517 +
14518 +       idev = file->private_data;
14519  
14520 -       while (p) {
14521 -               *(p->private) = 1;
14522 -               p = (infostruct *) p->next;
14523 +       poll_wait(file, &isdnstatus_waitq, wait);
14524 +       if (idev->update) {
14525 +               mask |= POLLIN | POLLRDNORM;
14526         }
14527 -       wake_up_interruptible(&(dev->info_waitq));
14528 +       return mask;
14529  }
14530  
14531 +static int
14532 +isdnstatus_ioctl(struct inode *inode, struct file *file, uint cmd, ulong arg)
14533 +{
14534 +       int retval;
14535 +       isdn_net_ioctl_phone phone;
14536 +
14537 +       switch (cmd) {
14538 +       case IIOCGETDVR:
14539 +               return (TTY_DV +
14540 +                       (NET_DV << 8) +
14541 +                       (INF_DV << 16));
14542 +       case IIOCGETCPS:
14543 +               if (arg) {
14544 +                       ulong *p = (ulong *) arg;
14545 +                       int i;
14546 +                       if ((retval = verify_area(VERIFY_WRITE, (void *) arg,
14547 +                                              sizeof(ulong) * ISDN_MAX_CHANNELS * 2)))
14548 +                               return retval;
14549 +                       for (i = 0; i < ISDN_MAX_CHANNELS; i++) {
14550 +                               put_user(dev->ibytes[i], p++);
14551 +                               put_user(dev->obytes[i], p++);
14552 +                       }
14553 +                       return 0;
14554 +               } else
14555 +                       return -EINVAL;
14556 +               break;
14557 +#ifdef CONFIG_NETDEVICES
14558 +       case IIOCNETGPN:
14559 +               /* Get peer phone number of a connected 
14560 +                * isdn network interface */
14561 +               if (arg) {
14562 +                       if (copy_from_user((char *) &phone, (char *) arg, sizeof(phone)))
14563 +                               return -EFAULT;
14564 +                       return isdn_net_getpeer(&phone, (isdn_net_ioctl_phone *) arg);
14565 +               } else
14566 +                       return -EINVAL;
14567 +#endif
14568 +       default:
14569 +               return -EINVAL;
14570 +       }
14571 +}
14572 +
14573 +// ----------------------------------------------------------------------
14574 +
14575 +
14576  static ssize_t
14577  isdn_read(struct file *file, char *buf, size_t count, loff_t * off)
14578  {
14579 @@ -976,37 +1149,16 @@
14580         int chidx;
14581         int retval;
14582         char *p;
14583 -       loff_t pos = *off;
14584  
14585         if (off != &file->f_pos)
14586                 return -ESPIPE;
14587  
14588 -       if (pos != (unsigned) pos)
14589 -               return -EINVAL;
14590 -
14591 +#ifndef COMPAT_HAVE_READ_LOCK_KERNEL
14592         lock_kernel();
14593 -       if (minor == ISDN_MINOR_STATUS) {
14594 -               if (!file->private_data) {
14595 -                       if (file->f_flags & O_NONBLOCK) {
14596 -                               retval = -EAGAIN;
14597 -                               goto out;
14598 -                       }
14599 -                       interruptible_sleep_on(&(dev->info_waitq));
14600 -               }
14601 -               p = isdn_statstr();
14602 -               file->private_data = 0;
14603 -               if ((len = strlen(p)) <= count) {
14604 -                       if (copy_to_user(buf, p, len)) {
14605 -                               retval = -EFAULT;
14606 -                               goto out;
14607 -                       }
14608 -                       *off = pos + len;
14609 -                       retval = len;
14610 -                       goto out;
14611 -               }
14612 -               retval = 0;
14613 -               goto out;
14614 -       }
14615 +#endif
14616 +       if (minor == ISDN_MINOR_STATUS)
14617 +               return isdnstatus_read(file, buf, count, off);
14618 +         
14619         if (!dev->drivers) {
14620                 retval = -ENODEV;
14621                 goto out;
14622 @@ -1031,7 +1183,7 @@
14623                 cli();
14624                 len = isdn_readbchan(drvidx, chidx, p, 0, count,
14625                                      &dev->drv[drvidx]->rcv_waitq[chidx]);
14626 -               *off = pos + len;
14627 +               *off += len;
14628                 restore_flags(flags);
14629                 if (copy_to_user(buf,p,len)) 
14630                         len = -EFAULT;
14631 @@ -1052,6 +1204,9 @@
14632                         }
14633                         interruptible_sleep_on(&(dev->drv[drvidx]->st_waitq));
14634                 }
14635 +#ifdef CONFIG_ISDN_WITH_ABC_LCR_SUPPORT
14636 +               if(drvidx || (len = isdn_dw_abc_lcr_readstat(buf,count)) < 1) {
14637 +#endif
14638                 if (dev->drv[drvidx]->interface->readstat) {
14639                         if (count > dev->drv[drvidx]->stavail)
14640                                 count = dev->drv[drvidx]->stavail;
14641 @@ -1065,6 +1220,9 @@
14642                 } else {
14643                         len = 0;
14644                 }
14645 +#ifdef CONFIG_ISDN_WITH_ABC_LCR_SUPPORT
14646 +               }
14647 +#endif
14648                 save_flags(flags);
14649                 cli();
14650                 if (len)
14651 @@ -1072,7 +1230,7 @@
14652                 else
14653                         dev->drv[drvidx]->stavail = 0;
14654                 restore_flags(flags);
14655 -               *off = pos + len;
14656 +               *off += len;
14657                 retval = len;
14658                 goto out;
14659         }
14660 @@ -1084,7 +1242,9 @@
14661  #endif
14662         retval = -ENODEV;
14663   out:
14664 +#ifndef COMPAT_HAVE_READ_LOCK_KERNEL
14665         unlock_kernel();
14666 +#endif
14667         return retval;
14668  }
14669  
14670 @@ -1096,15 +1256,18 @@
14671         int chidx;
14672         int retval;
14673  
14674 +       if (minor == ISDN_MINOR_STATUS)
14675 +               return isdnstatus_write(file, buf, count, off);
14676 +
14677         if (off != &file->f_pos)
14678                 return -ESPIPE;
14679  
14680 -       if (minor == ISDN_MINOR_STATUS)
14681 -               return -EPERM;
14682         if (!dev->drivers)
14683                 return -ENODEV;
14684  
14685 +#ifndef COMPAT_HAVE_WRITE_LOCK_KERNEL
14686         lock_kernel();
14687 +#endif
14688         if (minor <= ISDN_MINOR_BMAX) {
14689                 printk(KERN_WARNING "isdn_write minor %d obsolete!\n", minor);
14690                 drvidx = isdn_minor2drv(minor);
14691 @@ -1149,7 +1312,9 @@
14692  #endif
14693         retval = -ENODEV;
14694   out:
14695 +#ifndef COMPAT_HAVE_WRITE_LOCK_KERNEL
14696         unlock_kernel();
14697 +#endif
14698         return retval;
14699  }
14700  
14701 @@ -1160,15 +1325,12 @@
14702         unsigned int minor = MINOR(file->f_dentry->d_inode->i_rdev);
14703         int drvidx = isdn_minor2drv(minor - ISDN_MINOR_CTRL);
14704  
14705 +#ifndef COMPAT_HAVE_POLL_LOCK_KERNEL
14706         lock_kernel();
14707 -       if (minor == ISDN_MINOR_STATUS) {
14708 -               poll_wait(file, &(dev->info_waitq), wait);
14709 -               /* mask = POLLOUT | POLLWRNORM; */
14710 -               if (file->private_data) {
14711 -                       mask |= POLLIN | POLLRDNORM;
14712 -               }
14713 -               goto out;
14714 -       }
14715 +#endif
14716 +       if (minor == ISDN_MINOR_STATUS)
14717 +               return isdnstatus_poll(file, wait);
14718 +
14719         if (minor >= ISDN_MINOR_CTRL && minor <= ISDN_MINOR_CTRLMAX) {
14720                 if (drvidx < 0) {
14721                         /* driver deregistered while file open */
14722 @@ -1190,7 +1352,9 @@
14723  #endif
14724         mask = POLLERR;
14725   out:
14726 +#ifndef COMPAT_HAVE_POLL_LOCK_KERNEL
14727         unlock_kernel();
14728 +#endif
14729         return mask;
14730  }
14731  
14732 @@ -1220,42 +1384,9 @@
14733  #define phone iocpar.phone
14734  #define cfg   iocpar.cfg
14735  
14736 -       if (minor == ISDN_MINOR_STATUS) {
14737 -               switch (cmd) {
14738 -                       case IIOCGETDVR:
14739 -                               return (TTY_DV +
14740 -                                       (NET_DV << 8) +
14741 -                                       (INF_DV << 16));
14742 -                       case IIOCGETCPS:
14743 -                               if (arg) {
14744 -                                       ulong *p = (ulong *) arg;
14745 -                                       int i;
14746 -                                       if ((ret = verify_area(VERIFY_WRITE, (void *) arg,
14747 -                                                              sizeof(ulong) * ISDN_MAX_CHANNELS * 2)))
14748 -                                               return ret;
14749 -                                       for (i = 0; i < ISDN_MAX_CHANNELS; i++) {
14750 -                                               put_user(dev->ibytes[i], p++);
14751 -                                               put_user(dev->obytes[i], p++);
14752 -                                       }
14753 -                                       return 0;
14754 -                               } else
14755 -                                       return -EINVAL;
14756 -                               break;
14757 -#ifdef CONFIG_NETDEVICES
14758 -                       case IIOCNETGPN:
14759 -                               /* Get peer phone number of a connected 
14760 -                                * isdn network interface */
14761 -                               if (arg) {
14762 -                                       if (copy_from_user((char *) &phone, (char *) arg, sizeof(phone)))
14763 -                                               return -EFAULT;
14764 -                                       return isdn_net_getpeer(&phone, (isdn_net_ioctl_phone *) arg);
14765 -                               } else
14766 -                                       return -EINVAL;
14767 -#endif
14768 -                       default:
14769 -                               return -EINVAL;
14770 -               }
14771 -       }
14772 +       if (minor == ISDN_MINOR_STATUS)
14773 +               return isdnstatus_ioctl(inode, file, cmd, arg);
14774 +
14775         if (!dev->drivers)
14776                 return -ENODEV;
14777         if (minor <= ISDN_MINOR_BMAX) {
14778 @@ -1277,11 +1408,34 @@
14779   */
14780                 switch (cmd) {
14781                         case IIOCNETDWRSET:
14782 +#ifdef CONFIG_ISDN_WITH_ABC
14783 +                               if (arg) {
14784 +
14785 +                                       if (copy_from_user(name, (char *) arg, sizeof(name))) {
14786 +
14787 +                                               return(-EFAULT);
14788 +
14789 +                                       } else {
14790 +
14791 +                                               isdn_net_dev *p = isdn_net_findif(name);
14792 +
14793 +                                               if(p == NULL)
14794 +                                                       return(-EINVAL);
14795 +
14796 +                                               return(isdn_dw_abc_reset_interface(p->local,1));
14797 +                                       }
14798 +                               } 
14799 +#else
14800                                 printk(KERN_INFO "INFO: ISDN_DW_ABC_EXTENSION not enabled\n");
14801 +#endif
14802                                 return(-EINVAL);
14803                         case IIOCNETLCR:
14804 +#ifdef CONFIG_ISDN_WITH_ABC_LCR_SUPPORT
14805 +                               return(isdn_dw_abc_lcr_ioctl(arg));
14806 +#else
14807                                 printk(KERN_INFO "INFO: ISDN_ABC_LCR_SUPPORT not enabled\n");
14808                                 return -ENODEV;
14809 +#endif
14810  #ifdef CONFIG_NETDEVICES
14811                         case IIOCNETAIF:
14812                                 /* Add a network-interface */
14813 @@ -1654,22 +1808,12 @@
14814         int chidx;
14815         int retval = -ENODEV;
14816  
14817 +#ifdef COMPAT_USE_MODCOUNT_LOCK
14818 +       MOD_INC_USE_COUNT;
14819 +#endif
14820  
14821         if (minor == ISDN_MINOR_STATUS) {
14822 -               infostruct *p;
14823 -
14824 -               if ((p = kmalloc(sizeof(infostruct), GFP_KERNEL))) {
14825 -                       p->next = (char *) dev->infochain;
14826 -                       p->private = (char *) &(filep->private_data);
14827 -                       dev->infochain = p;
14828 -                       /* At opening we allow a single update */
14829 -                       filep->private_data = (char *) 1;
14830 -                       retval = 0;
14831 -                       goto out;
14832 -               } else {
14833 -                       retval = -ENOMEM;
14834 -                       goto out;
14835 -               }
14836 +               return isdnstatus_open(ino, filep);
14837         }
14838         if (!dev->channels)
14839                 goto out;
14840 @@ -1692,6 +1836,9 @@
14841                 if (drvidx < 0)
14842                         goto out;
14843                 isdn_lock_drivers();
14844 +#ifdef CONFIG_ISDN_WITH_ABC_LCR_SUPPORT
14845 +               if(!drvidx) isdn_dw_abc_lcr_open();
14846 +#endif
14847                 retval = 0;
14848                 goto out;
14849         }
14850 @@ -1704,6 +1851,10 @@
14851         }
14852  #endif
14853   out:
14854 +#ifdef COMPAT_USE_MODCOUNT_LOCK
14855 +       if (retval)
14856 +               MOD_DEC_USE_COUNT;
14857 +#endif
14858         return retval;
14859  }
14860  
14861 @@ -1712,25 +1863,11 @@
14862  {
14863         uint minor = MINOR(ino->i_rdev);
14864  
14865 +#ifndef COMPAT_USE_MODCOUNT_LOCK
14866         lock_kernel();
14867 +#endif
14868         if (minor == ISDN_MINOR_STATUS) {
14869 -               infostruct *p = dev->infochain;
14870 -               infostruct *q = NULL;
14871 -
14872 -               while (p) {
14873 -                       if (p->private == (char *) &(filep->private_data)) {
14874 -                               if (q)
14875 -                                       q->next = p->next;
14876 -                               else
14877 -                                       dev->infochain = (infostruct *) (p->next);
14878 -                               kfree(p);
14879 -                               goto out;
14880 -                       }
14881 -                       q = p;
14882 -                       p = (infostruct *) (p->next);
14883 -               }
14884 -               printk(KERN_WARNING "isdn: No private data while closing isdnctrl\n");
14885 -               goto out;
14886 +               isdnstatus_close(ino, filep);
14887         }
14888         isdn_unlock_drivers();
14889         if (minor <= ISDN_MINOR_BMAX)
14890 @@ -1738,6 +1875,12 @@
14891         if (minor <= ISDN_MINOR_CTRLMAX) {
14892                 if (dev->profd == current)
14893                         dev->profd = NULL;
14894 +#ifdef CONFIG_ISDN_WITH_ABC_LCR_SUPPORT
14895 +               {
14896 +                       int drvidx = isdn_minor2drv(minor - ISDN_MINOR_CTRL);
14897 +                       if(!drvidx) isdn_dw_abc_lcr_close();
14898 +               }
14899 +#endif
14900                 goto out;
14901         }
14902  #ifdef CONFIG_ISDN_PPP
14903 @@ -1746,13 +1889,19 @@
14904  #endif
14905  
14906   out:
14907 +#ifdef COMPAT_USE_MODCOUNT_LOCK
14908 +       MOD_DEC_USE_COUNT;
14909 +#else
14910         unlock_kernel();
14911 +#endif
14912         return 0;
14913  }
14914  
14915  static struct file_operations isdn_fops =
14916  {
14917 +#ifdef COMPAT_HAS_FILEOP_OWNER
14918         owner:          THIS_MODULE,
14919 +#endif
14920         llseek:         no_llseek,
14921         read:           isdn_read,
14922         write:          isdn_write,
14923 @@ -1805,6 +1954,15 @@
14924                 if (USG_NONE(dev->usage[i]) &&
14925                     (dev->drvmap[i] != -1)) {
14926                         int d = dev->drvmap[i];
14927 +#ifdef CONFIG_ISDN_WITH_ABC_CH_EXTINUSE
14928 +                       if(jiffies < dev->dwabc_chan_external_inuse[i]) {
14929 +
14930 +                               if((dev->dwabc_chan_external_inuse[i] - jiffies) > (HZ * 120))
14931 +                                       dev->dwabc_chan_external_inuse[i] = 0;
14932 +                               else 
14933 +                                       continue;
14934 +                       }
14935 +#endif
14936                         if ((dev->usage[i] & ISDN_USAGE_EXCLUSIVE) &&
14937                         ((pre_dev != d) || (pre_chan != dev->chanmap[i])))
14938                                 continue;
14939 @@ -1823,7 +1981,11 @@
14940                                                 restore_flags(flags);
14941                                                 return i;
14942                                         } else {
14943 +#ifdef CONFIG_ISDN_WITH_ABC
14944 +                                               if ((pre_dev == d) && ((pre_chan == dev->chanmap[i]) || pre_chan > 1000)) {
14945 +#else
14946                                                 if ((pre_dev == d) && (pre_chan == dev->chanmap[i])) {
14947 +#endif
14948                                                         dev->usage[i] &= ISDN_USAGE_EXCLUSIVE;
14949                                                         dev->usage[i] |= usage;
14950                                                         isdn_info_update();
14951 @@ -2010,7 +2172,7 @@
14952  
14953         if ((adding) && (d->rcverr))
14954                 kfree(d->rcverr);
14955 -       if (!(d->rcverr = kmalloc(sizeof(int) * m, GFP_KERNEL))) {
14956 +       if (!(d->rcverr = (int *) kmalloc(sizeof(int) * m, GFP_KERNEL))) {
14957                 printk(KERN_WARNING "register_isdn: Could not alloc rcverr\n");
14958                 return -1;
14959         }
14960 @@ -2018,7 +2180,7 @@
14961  
14962         if ((adding) && (d->rcvcount))
14963                 kfree(d->rcvcount);
14964 -       if (!(d->rcvcount = kmalloc(sizeof(int) * m, GFP_KERNEL))) {
14965 +       if (!(d->rcvcount = (int *) kmalloc(sizeof(int) * m, GFP_KERNEL))) {
14966                 printk(KERN_WARNING "register_isdn: Could not alloc rcvcount\n");
14967                 if (!adding) kfree(d->rcverr);
14968                 return -1;
14969 @@ -2030,7 +2192,8 @@
14970                         skb_queue_purge(&d->rpqueue[j]);
14971                 kfree(d->rpqueue);
14972         }
14973 -       if (!(d->rpqueue = kmalloc(sizeof(struct sk_buff_head) * m, GFP_KERNEL))) {
14974 +       if (!(d->rpqueue =
14975 +             (struct sk_buff_head *) kmalloc(sizeof(struct sk_buff_head) * m, GFP_KERNEL))) {
14976                 printk(KERN_WARNING "register_isdn: Could not alloc rpqueue\n");
14977                 if (!adding) {
14978                         kfree(d->rcvcount);
14979 @@ -2044,7 +2207,8 @@
14980  
14981         if ((adding) && (d->rcv_waitq))
14982                 kfree(d->rcv_waitq);
14983 -       d->rcv_waitq = kmalloc(sizeof(wait_queue_head_t) * 2 * m, GFP_KERNEL);
14984 +       d->rcv_waitq = (wait_queue_head_t *)
14985 +               kmalloc(sizeof(wait_queue_head_t) * 2 * m, GFP_KERNEL);
14986         if (!d->rcv_waitq) {
14987                 printk(KERN_WARNING "register_isdn: Could not alloc rcv_waitq\n");
14988                 if (!adding) {
14989 @@ -2068,7 +2232,9 @@
14990                         if (dev->chanmap[k] < 0) {
14991                                 dev->chanmap[k] = j;
14992                                 dev->drvmap[k] = drvidx;
14993 +#ifdef HAVE_DEVFS_FS
14994                                 isdn_register_devfs(k);
14995 +#endif /* HAVE_DEVFS_FS */
14996                                 break;
14997                         }
14998         restore_flags(flags);
14999 @@ -2132,6 +2298,7 @@
15000          i_div->ll_cmd = isdn_command; /* set command function */
15001          i_div->drv_to_name = map_drvname; 
15002          i_div->name_to_drv = map_namedrv; 
15003 +        i_div->dial_net_name = isdn_net_force_dial; 
15004          MOD_INC_USE_COUNT;
15005          divert_if = i_div; /* remember interface */
15006          return(DIVERT_NO_ERR);
15007 @@ -2169,7 +2336,7 @@
15008                 printk(KERN_WARNING "register_isdn: No write routine given.\n");
15009                 return 0;
15010         }
15011 -       if (!(d = kmalloc(sizeof(driver), GFP_KERNEL))) {
15012 +       if (!(d = (driver *) kmalloc(sizeof(driver), GFP_KERNEL))) {
15013                 printk(KERN_WARNING "register_isdn: Could not alloc driver-struct\n");
15014                 return 0;
15015         }
15016 @@ -2229,6 +2396,7 @@
15017         return rev;
15018  }
15019  
15020 +#ifdef HAVE_DEVFS_FS
15021  #ifdef CONFIG_DEVFS_FS
15022  
15023  static devfs_handle_t devfs_handle;
15024 @@ -2318,6 +2486,7 @@
15025  }
15026  
15027  #endif  /* CONFIG_DEVFS_FS */
15028 +#endif /* HAVE_DEVFS_FS */
15029  
15030  /*
15031   * Allocate and initialize all data, register modem-devices
15032 @@ -2335,7 +2504,6 @@
15033         init_timer(&dev->timer);
15034         dev->timer.function = isdn_timer_funct;
15035         init_MUTEX(&dev->sem);
15036 -       init_waitqueue_head(&dev->info_waitq);
15037         for (i = 0; i < ISDN_MAX_CHANNELS; i++) {
15038                 dev->drvmap[i] = -1;
15039                 dev->chanmap[i] = -1;
15040 @@ -2349,7 +2517,9 @@
15041                 vfree(dev);
15042                 return -EIO;
15043         }
15044 +#ifdef HAVE_DEVFS_FS
15045         isdn_init_devfs();
15046 +#endif /* HAVE_DEVFS_FS */
15047         if ((i = isdn_tty_modem_init()) < 0) {
15048                 printk(KERN_WARNING "isdn: Could not register tty devices\n");
15049                 if (i == -3)
15050 @@ -2357,7 +2527,9 @@
15051                 if (i <= -2)
15052                         tty_unregister_driver(&dev->mdm.tty_modem);
15053                 vfree(dev);
15054 +#ifdef HAVE_DEVFS_FS
15055                 isdn_cleanup_devfs();
15056 +#endif /* HAVE_DEVFS_FS */
15057                 devfs_unregister_chrdev(ISDN_MAJOR, "isdn");
15058                 return -EIO;
15059         }
15060 @@ -2368,7 +2540,9 @@
15061                 tty_unregister_driver(&dev->mdm.cua_modem);
15062                 for (i = 0; i < ISDN_MAX_CHANNELS; i++)
15063                         kfree(dev->mdm.info[i].xmit_buf - 4);
15064 +#ifdef HAVE_DEVFS_FS
15065                 isdn_cleanup_devfs();
15066 +#endif /* HAVE_DEVFS_FS */
15067                 devfs_unregister_chrdev(ISDN_MAJOR, "isdn");
15068                 vfree(dev);
15069                 return -EIO;
15070 @@ -2394,6 +2568,9 @@
15071         printk("\n");
15072  #endif
15073         isdn_info_update();
15074 +#ifdef CONFIG_ISDN_WITH_ABC
15075 +       isdn_dw_abc_init_func();
15076 +#endif
15077         return 0;
15078  }
15079  
15080 @@ -2402,7 +2579,7 @@
15081   */
15082  static void __exit isdn_exit(void)
15083  {
15084 -       unsigned long flags;
15085 +       int flags;
15086         int i;
15087  
15088  #ifdef CONFIG_ISDN_PPP
15089 @@ -2436,13 +2613,18 @@
15090                 printk(KERN_WARNING "isdn: controldevice busy, remove cancelled\n");
15091                 restore_flags(flags);
15092         } else {
15093 +#ifdef HAVE_DEVFS_FS
15094                 isdn_cleanup_devfs();
15095 +#endif /* HAVE_DEVFS_FS */
15096                 del_timer(&dev->timer);
15097                 restore_flags(flags);
15098                 /* call vfree with interrupts enabled, else it will hang */
15099                 vfree(dev);
15100                 printk(KERN_NOTICE "ISDN-subsystem unloaded\n");
15101         }
15102 +#ifdef CONFIG_ISDN_WITH_ABC
15103 +       isdn_dw_abc_release_func();
15104 +#endif
15105  }
15106  
15107  module_init(isdn_init);
15108 Index: linux-2.4.35.4/drivers/isdn/isdn_common.h
15109 ===================================================================
15110 --- linux-2.4.35.4.orig/drivers/isdn/isdn_common.h      2007-12-15 05:19:40.590734172 +0100
15111 +++ linux-2.4.35.4/drivers/isdn/isdn_common.h   2007-12-15 05:19:55.687594492 +0100
15112 @@ -1,4 +1,4 @@
15113 -/* $Id: isdn_common.h,v 1.1.4.1 2001/11/20 14:19:34 kai Exp $
15114 +/* $Id: isdn_common.h,v 1.22 2001/09/24 13:22:42 kai Exp $
15115   *
15116   * header for Linux ISDN subsystem
15117   * common used functions and debugging-switches (linklevel).
15118 @@ -24,6 +24,9 @@
15119  #undef  ISDN_DEBUG_NET_DIAL
15120  #undef  ISDN_DEBUG_NET_ICALL
15121  
15122 +#ifdef CONFIG_ISDN_WITH_ABC
15123 +int isdn_net_force_dial_lp(isdn_net_local *);
15124 +#endif
15125  /* Prototypes */
15126  extern void isdn_MOD_INC_USE_COUNT(void);
15127  extern void isdn_MOD_DEC_USE_COUNT(void);
15128 Index: linux-2.4.35.4/drivers/isdn/isdn_concap.c
15129 ===================================================================
15130 --- linux-2.4.35.4.orig/drivers/isdn/isdn_concap.c      2007-12-15 05:19:40.598734627 +0100
15131 +++ linux-2.4.35.4/drivers/isdn/isdn_concap.c   2007-12-15 05:19:55.687594492 +0100
15132 @@ -1,4 +1,4 @@
15133 -/* $Id: isdn_concap.c,v 1.1.4.1 2001/11/20 14:19:34 kai Exp $
15134 +/* $Id: isdn_concap.c,v 1.9 2001/09/24 13:22:42 kai Exp $
15135   * 
15136   * Linux ISDN subsystem, protocol encapsulation
15137   *
15138 Index: linux-2.4.35.4/drivers/isdn/isdn_concap.h
15139 ===================================================================
15140 --- linux-2.4.35.4.orig/drivers/isdn/isdn_concap.h      2007-12-15 05:19:40.606735085 +0100
15141 +++ linux-2.4.35.4/drivers/isdn/isdn_concap.h   2007-12-15 05:19:55.687594492 +0100
15142 @@ -1,4 +1,4 @@
15143 -/* $Id: isdn_concap.h,v 1.1.4.1 2001/11/20 14:19:34 kai Exp $
15144 +/* $Id: isdn_concap.h,v 1.4 2001/09/24 13:22:42 kai Exp $
15145   *
15146   * Linux ISDN subsystem, protocol encapsulation
15147   *
15148 Index: linux-2.4.35.4/drivers/isdn/isdn_dwabc.c
15149 ===================================================================
15150 --- /dev/null   1970-01-01 00:00:00.000000000 +0000
15151 +++ linux-2.4.35.4/drivers/isdn/isdn_dwabc.c    2007-12-15 05:19:55.695594949 +0100
15152 @@ -0,0 +1,1053 @@
15153 +
15154 +/* $Id: isdn_dwabc.c,v 1.27 2001/12/01 23:18:21 detabc Exp $
15155 +
15156 + * Linux ISDN subsystem, abc-extension releated funktions.
15157 + *
15158 + * Copyright           by abc GmbH
15159 + *                     written by Detlef Wengorz <detlefw@isdn4linux.de>
15160 + *
15161 + * This program is free software; you can redistribute it and/or modify
15162 + * it under the terms of the GNU General Public License as published by
15163 + * the Free Software Foundation; either version 2, or (at your option)
15164 + * any later version.
15165 + *
15166 + */
15167 +
15168 +#include <linux/config.h>
15169 +#define __NO_VERSION__
15170 +
15171 +#ifdef CONFIG_ISDN_WITH_ABC
15172 +
15173 +static char *dwabcrevison = "$Revision: 1.27 $";
15174 +
15175 +#include <asm/semaphore.h>
15176 +#define CONFIG_ISDN_WITH_ABC_NEED_DWSJIFFIES   1
15177 +#include <linux/list.h>
15178 +#include <linux/isdn.h>
15179 +#include "isdn_common.h"
15180 +#include "isdn_net.h"
15181 +
15182 +#include <linux/skbuff.h>
15183 +
15184 +#include <net/udp.h>
15185 +#include <net/checksum.h>
15186 +#include <linux/isdn_dwabc.h>
15187 +
15188 +
15189 +#if CONFIG_ISDN_WITH_ABC_RAWIPCOMPRESS && CONFIG_ISDN_PPP
15190 +#include <linux/isdn_ppp.h>
15191 +extern struct isdn_ppp_compressor *isdn_ippp_comp_head;
15192 +#define ipc_head isdn_ippp_comp_head
15193 +#ifndef CI_BSD_COMPRESS
15194 +#define CI_BSD_COMPRESS 21
15195 +#endif
15196 +#endif
15197 +
15198 +#define NBYTEORDER_30BYTES      0x1e00 
15199 +#define DWABC_TMRES (HZ / 10)
15200 +
15201 +#define VERBLEVEL (dev->net_verbose > 2)
15202 +
15203 +static struct timer_list dw_abc_timer;
15204 +
15205 +
15206 +#ifdef CONFIG_ISDN_WITH_ABC_LCR_SUPPORT
15207 +static ISDN_DWSPINLOCK lcr_spin = ISDN_DWSPIN_UNLOCKED;
15208 +#define LCR_LOCK() isdn_dwspin_trylock(&lcr_spin)
15209 +#define LCR_ULOCK() isdn_dwspin_unlock(&lcr_spin)
15210 +
15211 +typedef struct ISDN_DW_ABC_LCR {
15212 +
15213 +       struct list_head dll;
15214 +       char lcr_printbuf[64 + ISDN_MSNLEN + ISDN_MSNLEN];
15215 +       char *lcr_poin;
15216 +       char *lcr_epoin;
15217 +
15218 +} ISDN_DW_ABC_LCR;
15219 +
15220 +static LIST_HEAD(lcr_dll);
15221 +static atomic_t lcr_open_count         =       ATOMIC_INIT(0);
15222 +static volatile  ulong lcr_call_counter        = 0;
15223 +
15224 +
15225 +static int myjiftime(char *p,u_long nj)
15226 +{
15227 +       sprintf(p,"%02ld:%02ld.%02ld",
15228 +               ((nj / 100) / 60) % 100, (nj / 100) % 60,nj % 100);
15229 +
15230 +       return(8);
15231 +}
15232 +
15233 +
15234 +static void dw_lcr_clear_all(void)
15235 +{
15236 +       struct list_head *lh;
15237 +
15238 +       if(!LCR_LOCK()) {
15239 +
15240 +               while((lh = lcr_dll.next) != &lcr_dll) {
15241 +
15242 +                       ISDN_DW_ABC_LCR *p = list_entry(lh,ISDN_DW_ABC_LCR,dll);
15243 +                       list_del(&p->dll);
15244 +                       kfree(p);
15245 +               }
15246 +
15247 +               LCR_ULOCK();
15248 +       }
15249 +}
15250 +
15251 +void isdn_dw_abc_lcr_open(void) 
15252 +{ atomic_inc(&lcr_open_count); }
15253 +
15254 +void isdn_dw_abc_lcr_close(void) 
15255 +{ 
15256 +       if(atomic_dec_and_test(&lcr_open_count))
15257 +               dw_lcr_clear_all();
15258 +}
15259 +
15260 +int isdn_dw_abc_lcr_lock(void) 
15261 +{ return(LCR_LOCK()); }
15262 +
15263 +void isdn_dw_abc_lcr_ulock(void) 
15264 +{ LCR_ULOCK(); }
15265 +
15266 +
15267 +size_t isdn_dw_abc_lcr_readstat(char *buf,size_t count) 
15268 +{
15269 +       size_t  retw = 0;
15270 +
15271 +       while(buf != NULL && count > 0) {
15272 +
15273 +               struct list_head *lh = NULL;
15274 +               ISDN_DW_ABC_LCR *p = NULL;
15275 +               char *dp = NULL;
15276 +               size_t  n;
15277 +
15278 +               if((n = LCR_LOCK())) {
15279 +
15280 +                       if(!retw)
15281 +                               retw = n;
15282 +
15283 +                       break;
15284 +               }
15285 +
15286 +
15287 +               while((lh = lcr_dll.next) != &lcr_dll) {
15288 +
15289 +                       p = list_entry(lh,ISDN_DW_ABC_LCR,dll);
15290 +
15291 +                       if(p->lcr_poin >= p->lcr_epoin) {
15292 +
15293 +                               list_del(&p->dll);
15294 +                               kfree(p);
15295 +                               p = NULL;
15296 +
15297 +                       } else break;
15298 +               }
15299 +
15300 +               if(p == NULL) {
15301 +                               
15302 +                       LCR_ULOCK();
15303 +                       break;
15304 +               }
15305 +
15306 +               n = p->lcr_epoin - p->lcr_poin;
15307 +
15308 +               if(n > count)
15309 +                       n = count;
15310 +
15311 +               dp = p->lcr_poin;
15312 +               p->lcr_poin += n;
15313 +               retw += n;
15314 +               LCR_ULOCK();
15315 +               copy_to_user(buf,dp,n);
15316 +               buf += n;
15317 +       }
15318 +
15319 +       return(retw);
15320 +}
15321 +
15322 +
15323 +static void isdn_dw_abc_lcr_clear_helper(isdn_net_local *lp)
15324 +{
15325 +       if(lp != NULL) {
15326 +
15327 +               void *a,*b;
15328 +
15329 +               a = lp->dw_abc_lcr_cmd;  
15330 +               b = lp->dw_abc_lcr_io;
15331 +               lp->dw_abc_lcr_io = NULL;
15332 +               lp->dw_abc_lcr_cmd = NULL;
15333 +               lp->dw_abc_lcr_callid = 
15334 +               lp->dw_abc_lcr_start_request =
15335 +               lp->dw_abc_lcr_end_request = 0;
15336 +               
15337 +               if(a) kfree(a);
15338 +               if(b) kfree(b);
15339 +       }
15340 +}
15341 +
15342 +void isdn_dw_abc_lcr_clear(isdn_net_local *lp)
15343 +{
15344 +       if(!LCR_LOCK()) {
15345 +               isdn_dw_abc_lcr_clear_helper(lp);
15346 +               LCR_ULOCK();
15347 +       }
15348 +}
15349 +
15350 +
15351 +u_long isdn_dw_abc_lcr_call_number( isdn_net_local *lp,isdn_ctrl *call_cmd)
15352 +{
15353 +       u_long mid = 0;
15354 +
15355 +       if(LCR_LOCK())
15356 +               return(0);
15357 +
15358 +       isdn_dw_abc_lcr_clear_helper(lp);
15359 +
15360 +       if( atomic_read(&lcr_open_count) > 0 && 
15361 +               lp != NULL                                              && 
15362 +               call_cmd != NULL) {
15363 +
15364 +               ISDN_DW_ABC_LCR  *lc = NULL;
15365 +               int ab = 0;
15366 +
15367 +               if((lp->dw_abc_lcr_cmd = 
15368 +                       ( isdn_ctrl *)kmalloc(sizeof(isdn_ctrl),GFP_ATOMIC)) == NULL) {
15369 +
15370 +no_mem_out:;
15371 +                       isdn_dw_abc_lcr_clear_helper(lp);
15372 +                       LCR_ULOCK();
15373 +                       printk(KERN_DEBUG "%s %d : LCR no memory\n",__FILE__,__LINE__);
15374 +                       return(0);
15375 +               }
15376 +
15377 +               memcpy(lp->dw_abc_lcr_cmd,call_cmd,sizeof(*call_cmd));
15378 +               while(!(lp->dw_abc_lcr_callid = mid = lcr_call_counter++));
15379 +               
15380 +               lp->dw_abc_lcr_end_request = lp->dw_abc_lcr_start_request = jiffies;
15381 +               lp->dw_abc_lcr_end_request += HZ * 3;
15382 +
15383 +               if((lc = (ISDN_DW_ABC_LCR  *)kmalloc(sizeof(*lc),GFP_KERNEL)) == NULL)
15384 +                       goto no_mem_out;
15385 +
15386 +               lc->lcr_poin = lc->lcr_epoin = lc->lcr_printbuf;
15387 +               lc->lcr_epoin += myjiftime(lc->lcr_epoin,jiffies);
15388 +
15389 +               sprintf(lc->lcr_epoin," DW_ABC_LCR\t%lu\t%.*s\t%.*s\n",
15390 +                       mid,
15391 +                       (int)ISDN_MSNLEN,
15392 +                       call_cmd->parm.setup.eazmsn,
15393 +                       (int)ISDN_MSNLEN,
15394 +                       call_cmd->parm.setup.phone);
15395 +
15396 +               lc->lcr_epoin += strlen(lc->lcr_epoin);
15397 +               ab = lc->lcr_epoin - lc->lcr_poin;
15398 +
15399 +               list_add_tail(&lc->dll,&lcr_dll);
15400 +               LCR_ULOCK();
15401 +
15402 +               if(ab > 0) {
15403 +
15404 +                       if(dev->drv[0] != NULL ) {
15405 +
15406 +                               dev->drv[0]->stavail += ab;
15407 +                               wake_up_interruptible(&dev->drv[0]->st_waitq);
15408 +                       }
15409 +               }
15410 +
15411 +       } else LCR_ULOCK();
15412 +
15413 +       return(mid);
15414 +}
15415 +
15416 +
15417 +int isdn_dw_abc_lcr_ioctl(u_long arg)
15418 +{
15419 +       struct ISDN_DWABC_LCR_IOCTL     i;
15420 +       int need = sizeof(struct ISDN_DWABC_LCR_IOCTL); 
15421 +       isdn_net_dev *p; 
15422 +
15423 +       memset(&i,0,sizeof(struct ISDN_DWABC_LCR_IOCTL));
15424 +       copy_from_user(&i,(char *)arg,sizeof(int));
15425 +
15426 +       if(i.lcr_ioctl_sizeof < need)
15427 +               need = i.lcr_ioctl_sizeof;
15428 +
15429 +       if(need > 0) 
15430 +               copy_from_user(&i,(char *)arg,need);
15431 +
15432 +        if(LCR_LOCK())
15433 +               return(-EAGAIN);
15434 +
15435 +        p = dev->netdev; 
15436 +
15437 +        for(;p ; p = p->next) {
15438 +
15439 +               isdn_net_local *lp = p->local;
15440 +
15441 +               if(     lp->dw_abc_lcr_callid != i.lcr_ioctl_callid)
15442 +                       continue;
15443 +
15444 +               if(lp->dw_abc_lcr_cmd == NULL) 
15445 +                       continue;
15446 +
15447 +               if(lp->dw_abc_lcr_io == NULL)
15448 +                       lp->dw_abc_lcr_io = (struct ISDN_DWABC_LCR_IOCTL *)
15449 +                               kmalloc(sizeof(struct ISDN_DWABC_LCR_IOCTL),GFP_ATOMIC);
15450 +
15451 +               if(lp->dw_abc_lcr_io == NULL) {
15452 +
15453 +                       printk(KERN_DEBUG "%s %d : no memory\n",__FILE__,__LINE__);
15454 +                       continue;
15455 +               }
15456 +
15457 +               memcpy(lp->dw_abc_lcr_io,&i,sizeof(struct ISDN_DWABC_LCR_IOCTL));
15458 +
15459 +               if(i.lcr_ioctl_flags & DWABC_LCR_FLG_NEWNUMBER) {
15460 +
15461 +                       char *xx = i.lcr_ioctl_nr;
15462 +                       char *exx = xx + sizeof(i.lcr_ioctl_nr);
15463 +                       char *d = lp->dw_abc_lcr_cmd->parm.setup.phone;
15464 +                       char *ed = d + sizeof(lp->dw_abc_lcr_cmd->parm.setup.phone) - 1;
15465 +
15466 +                       while(d < ed && xx < exx && *xx) *(d++) = *(xx++);
15467 +                       while(d < ed) *(d++) = 0;
15468 +                       *d = 0;
15469 +               }
15470 +        }
15471 +
15472 +        LCR_ULOCK();
15473 +        return(0);
15474 +}
15475 +
15476 +#endif
15477 +
15478 +
15479 +#ifdef CONFIG_ISDN_WITH_ABC_UDP_CHECK
15480 +int dw_abc_udp_test(struct sk_buff *skb,struct net_device *ndev)
15481 +{
15482 +       if(ndev != NULL && skb != NULL && skb->protocol == htons(ETH_P_IP)) {
15483 +
15484 +               struct iphdr *iph = (struct iphdr *)skb->data;
15485 +               isdn_net_local *lp = (isdn_net_local *) ndev->priv;
15486 +               int rklen = skb->len;
15487 +
15488 +               if (skb->nh.raw > skb->data && skb->nh.raw < skb->tail) {
15489 +
15490 +                       rklen -= (char *)skb->nh.raw - (char *)skb->data;
15491 +                       iph = (struct iphdr *)skb->nh.raw;
15492 +               }
15493 +
15494 +               if(rklen >= 20 && iph->version == 4 && 
15495 +                       !(lp->dw_abc_flags & ISDN_DW_ABC_FLAG_NO_UDP_CHECK)) {
15496 +
15497 +                       if(     iph->tot_len == NBYTEORDER_30BYTES      && 
15498 +                               iph->protocol == IPPROTO_UDP) {
15499 +
15500 +                               struct udphdr *udp = 
15501 +                                       (struct udphdr *)((char *)iph + (iph->ihl << 2));
15502 +
15503 +                               ushort usrc = ntohs(udp->source);
15504 +
15505 +                               if(     udp->dest == htons(25001) && 
15506 +                                       usrc >= 20000 && usrc < 25000) {
15507 +
15508 +                                       char *p = (char *)(udp + 1);
15509 +
15510 +                                       if(p[0] == p[1]) {
15511 +
15512 +                                               char mc = 0;
15513 +
15514 +                                               switch(*p) {
15515 +                                               case 0x30:
15516 +
15517 +                                                       mc = *p;
15518 +
15519 +                                                       if((lp->flags & ISDN_NET_CONNECTED) && (!lp->dialstate))
15520 +                                                               mc++;
15521 +
15522 +                                                       break;
15523 +
15524 +                                               case 0x32:
15525 +
15526 +                                                       mc = *p;
15527 +#ifdef CONFIG_ISDN_WITH_ABC_UDP_CHECK_DIAL
15528 +                                                       if((lp->flags & ISDN_NET_CONNECTED) && (!lp->dialstate)) {
15529 +
15530 +                                                               mc++;
15531 +                                                               break;
15532 +                                                       }
15533 +
15534 +                                                       if(!isdn_net_force_dial_lp(lp)) mc++;
15535 +#endif
15536 +                                                       break;
15537 +
15538 +                                               case 0x11:
15539 +                                                       mc = *p + 1;
15540 +                                                       isdn_dw_abc_reset_interface(lp,1);
15541 +                                                       break;
15542 +
15543 +                                               case 0x28:      mc = *p + 1;    break;
15544 +                                               case 0x2a:
15545 +                                               case 0x2c:
15546 +
15547 +                                                       mc = *p;
15548 +#ifdef CONFIG_ISDN_WITH_ABC_UDP_CHECK_HANGUP
15549 +                                                       if(!(lp->dw_abc_flags & ISDN_DW_ABC_FLAG_NO_UDP_HANGUP)) {
15550 +
15551 +                                                               if(lp->isdn_device >= 0) {
15552 +
15553 +                                                                       isdn_net_hangup(ndev);
15554 +                                                                       mc = *p + 1;
15555 +                                                               }
15556 +                                                       }
15557 +#endif
15558 +                                                       break;
15559 +                                               }
15560 +
15561 +                                               if(mc) {
15562 +
15563 +                                                       struct sk_buff *nskb;
15564 +                                                       int need = 2+sizeof(struct iphdr)+sizeof(struct udphdr);
15565 +                                                       int hneed = need + ndev->hard_header_len;
15566 +
15567 +                                                       if((nskb = (struct sk_buff *)dev_alloc_skb(hneed)) != NULL) {
15568 +
15569 +                                                               ushort n = sizeof(struct udphdr) + 2;
15570 +                                                               struct iphdr *niph;
15571 +                                                               struct udphdr *nup;
15572 +                                                               skb_reserve(nskb,ndev->hard_header_len);
15573 +
15574 +                                                               if((niph = (struct iphdr *)skb_put(nskb,need))==NULL){
15575 +
15576 +                                                                       printk(KERN_DEBUG "%s: skb_put failt (%d bytes)\n", lp->name,hneed);
15577 +                                                                       dev_kfree_skb(nskb);
15578 +                                                                       return(0);
15579 +                                                               }
15580 +
15581 +                                                               nup = (struct udphdr *)(niph + 1);
15582 +                                                               ((char *)(nup + 1))[0] = mc;
15583 +                                                               ((char *)(nup + 1))[1] = mc;
15584 +                                                               nup->source=udp->dest;
15585 +                                                               nup->dest=udp->source;
15586 +                                                               nup->len=htons(n);
15587 +                                                               nup->check=0; /* dont need checksum */
15588 +                                                               memset((void *)niph,0,sizeof(*niph));
15589 +                                                               niph->version=4;
15590 +                                                               niph->ihl=5;
15591 +                                                               niph->tot_len=NBYTEORDER_30BYTES;
15592 +                                                               niph->ttl = 32;
15593 +                                                               niph->protocol = IPPROTO_UDP;
15594 +                                                               niph->saddr=iph->daddr;
15595 +                                                               niph->daddr=iph->saddr;
15596 +                                                               niph->id=iph->id;
15597 +                                                               niph->check=ip_fast_csum((unsigned char *)niph,niph->ihl);
15598 +                                                               nskb->dev = ndev;
15599 +                                                               nskb->pkt_type = PACKET_HOST;
15600 +                                                               nskb->protocol = htons(ETH_P_IP);
15601 +                                                               nskb->mac.raw = nskb->data;
15602 +                                                               netif_rx(nskb);
15603 +                                                       }
15604 +
15605 +                                                       return(1);
15606 +                                               }
15607 +                                       }
15608 +                               }
15609 +                       }
15610 +               }
15611 +       }
15612 +
15613 +       return(0);
15614 +}
15615 +#endif
15616 +
15617 +
15618 +void isdn_dw_clear_if(ulong pm,isdn_net_local *lp)
15619 +{
15620 +       if(lp != NULL) {
15621 +#ifdef CONFIG_ISDN_WITH_ABC_LCR_SUPPORT
15622 +               isdn_dw_abc_lcr_clear(lp);
15623 +#endif
15624 +       }
15625 +}
15626 +
15627 +
15628 +
15629 +static void dw_abc_timer_func(u_long dont_need_yet)
15630 +{
15631 +       register u_long t;
15632 +
15633 +       if(!((t = ++isdn_dwabc_jiffies.msec_100) & 1))
15634 +               if(isdn_dwabc_jiffies.msec_200++ & 1)
15635 +                       isdn_dwabc_jiffies.msec_400++;
15636 +       
15637 +       if(!(t % 5)) 
15638 +               if(isdn_dwabc_jiffies.msec_500++ & 1)
15639 +                       isdn_dwabc_jiffies.msec_1000++;
15640 +
15641 +       dw_abc_timer.expires = jiffies + DWABC_TMRES;
15642 +       add_timer(&dw_abc_timer);
15643 +}
15644 +
15645 +
15646 +void isdn_dw_abc_init_func(void)
15647 +{
15648 +
15649 +       init_timer(&dw_abc_timer);
15650 +       dw_abc_timer.function = dw_abc_timer_func;
15651 +
15652 +
15653 +       printk( KERN_INFO
15654 +               "abc-extension %s Kernel 0x%06X\n"
15655 +               "written by\nDetlef Wengorz <detlefw@isdn4linux.de>\n"
15656 +               "Installed options:\n"
15657 +#ifdef CONFIG_ISDN_WITH_ABC_CALLB
15658 +               "CONFIG_ISDN_WITH_ABC_CALLB\n"
15659 +#endif
15660 +#ifdef CONFIG_ISDN_WITH_ABC_UDP_CHECK
15661 +               "CONFIG_ISDN_WITH_ABC_UDP_CHECK\n"
15662 +#endif
15663 +#ifdef CONFIG_ISDN_WITH_ABC_UDP_CHECK_HANGUP
15664 +               "CONFIG_ISDN_WITH_ABC_UDP_CHECK_HANGUP\n"
15665 +#endif
15666 +#ifdef CONFIG_ISDN_WITH_ABC_UDP_CHECK_DIAL
15667 +               "CONFIG_ISDN_WITH_ABC_UDP_CHECK_DIAL\n"
15668 +#endif
15669 +#ifdef CONFIG_ISDN_WITH_ABC_OUTGOING_EAZ
15670 +               "CONFIG_ISDN_WITH_ABC_OUTGOING_EAZ\n"
15671 +#endif
15672 +#ifdef CONFIG_ISDN_WITH_ABC_LCR_SUPPORT
15673 +               "CONFIG_ISDN_WITH_ABC_LCR_SUPPORT\n"
15674 +#endif
15675 +#ifdef CONFIG_ISDN_WITH_ABC_RCV_NO_HUPTIMER
15676 +               "CONFIG_ISDN_WITH_ABC_RCV_NO_HUPTIMER\n"
15677 +#endif
15678 +#ifdef CONFIG_ISDN_WITH_ABC_CH_EXTINUSE
15679 +               "CONFIG_ISDN_WITH_ABC_CH_EXTINUSE\n"
15680 +#endif
15681 +#ifdef CONFIG_ISDN_WITH_ABC_CONN_ERROR
15682 +               "CONFIG_ISDN_WITH_ABC_CONN_ERROR\n"
15683 +#endif
15684 +#ifdef CONFIG_ISDN_WITH_ABC_RAWIPCOMPRESS
15685 +               "CONFIG_ISDN_WITH_ABC_RAWIPCOMPRESS\n"
15686 +#endif
15687 +               "loaded\n",
15688 +               dwabcrevison,LINUX_VERSION_CODE);
15689 +               dwsjiffies = 0;
15690 +               dw_abc_timer.expires = jiffies + DWABC_TMRES;
15691 +               add_timer(&dw_abc_timer);
15692 +}
15693 +
15694 +void isdn_dw_abc_release_func(void)
15695 +{
15696 +       del_timer(&dw_abc_timer);
15697 +#ifdef CONFIG_ISDN_WITH_ABC_LCR_SUPPORT
15698 +       dw_lcr_clear_all();
15699 +#endif
15700 +       printk( KERN_INFO
15701 +               "abc-extension %s  Kernel 0x%06X\n"
15702 +               "written by\n"
15703 +               "Detlef Wengorz <detlefw@isdn4linux.de>\n"
15704 +               "unloaded\n",
15705 +               dwabcrevison,LINUX_VERSION_CODE);
15706 +}
15707 +
15708 +
15709 +void isdn_dwabc_test_phone(isdn_net_local *lp) 
15710 +{
15711 +       if(lp != NULL) {
15712 +
15713 +               isdn_net_phone *h = lp->phone[0];
15714 +               ulong oflags = lp->dw_abc_flags;
15715 +               int secure = 0;
15716 +
15717 +               lp->dw_abc_flags = 0;
15718 +#ifdef CONFIG_ISDN_WITH_ABC_OUTGOING_EAZ
15719 +               *lp->dw_out_msn = 0;
15720 +#endif
15721 +
15722 +               for(;h != NULL && secure < 1000;secure++,h = h->next) {
15723 +
15724 +                       char *p         =       h->num;
15725 +                       char *ep        =       p + ISDN_MSNLEN;
15726 +
15727 +                       for(;p < ep && *p && (*p <= ' ' || *p == '"' || *p == '\'');p++);
15728 +
15729 +                       if(p >= ep)
15730 +                               continue;
15731 +
15732 +#ifdef CONFIG_ISDN_WITH_ABC_OUTGOING_EAZ
15733 +                       if(*p == '>') {
15734 +
15735 +                               if(++p < ep && *p != '<' && *p != '>') {
15736 +
15737 +                                       char *d = lp->dw_out_msn;
15738 +
15739 +                                       for(;*p && (p < ep) && (*p == ' ' || *p == '\t');p++);
15740 +                                       for(ep--;*p && (p < ep);) *(d++) = *(p++);
15741 +                                       *d = 0;
15742 +                                       continue;
15743 +                               }
15744 +                       }
15745 +#endif
15746 +
15747 +                       if(*p == '~') {
15748 +
15749 +                               /* abc switch's */
15750 +
15751 +                               for(p++;p < ep && *p;p++) switch(*p) {
15752 +                               case 'u':       lp->dw_abc_flags |= ISDN_DW_ABC_FLAG_NO_UDP_CHECK;                      break;
15753 +                               case 'h':       lp->dw_abc_flags |= ISDN_DW_ABC_FLAG_NO_UDP_HANGUP;                     break;
15754 +                               case 'd':       lp->dw_abc_flags |= ISDN_DW_ABC_FLAG_NO_UDP_DIAL;                       break;
15755 +                               case 'c':       lp->dw_abc_flags |= ISDN_DW_ABC_FLAG_NO_CH_EXTINUSE;            break;
15756 +                               case 'e':   lp->dw_abc_flags |= ISDN_DW_ABC_FLAG_NO_CONN_ERROR;                 break;
15757 +                               case 'l':   lp->dw_abc_flags |= ISDN_DW_ABC_FLAG_NO_LCR;                                break;
15758 +
15759 +                               case 'x':
15760 +                               case 'X':       lp->dw_abc_flags |= ISDN_DW_ABC_FLAG_RCV_NO_HUPTIMER;           break;
15761 +
15762 +                               case 'B':       lp->dw_abc_flags |= ISDN_DW_ABC_FLAG_BSD_COMPRESS;                      break;
15763 +                               case 'L':       lp->dw_abc_flags |= ISDN_DW_ABC_FLAG_LEASED_LINE;                       break;
15764 +
15765 +                               case '"':
15766 +                               case ' ':
15767 +                               case '\t':
15768 +                               case '\'':      break;
15769 +
15770 +                               default:        
15771 +                                       printk(KERN_DEBUG"isdn_net: %s abc-switch <~%c> unknown\n",lp->name,*p);
15772 +                                       break;
15773 +                               }
15774 +                       }
15775 +               }
15776 +
15777 +               if(lp->dw_abc_flags & ISDN_DW_ABC_FLAG_LEASED_LINE) {
15778 +
15779 +                       lp->dw_abc_flags |= 
15780 +                                       ISDN_DW_ABC_FLAG_NO_UDP_CHECK           |
15781 +                                       ISDN_DW_ABC_FLAG_NO_UDP_HANGUP          |
15782 +                                       ISDN_DW_ABC_FLAG_NO_UDP_DIAL            |
15783 +                                       ISDN_DW_ABC_FLAG_NO_CH_EXTINUSE         |
15784 +                                       ISDN_DW_ABC_FLAG_NO_CONN_ERROR          |
15785 +                                       ISDN_DW_ABC_FLAG_NO_LCR;
15786 +               }
15787 +
15788 +               if(dev->net_verbose  && (lp->dw_abc_flags != oflags || dev->net_verbose > 4))
15789 +                       printk(KERN_DEBUG "isdn_net %s abc-flags 0x%lx\n",lp->name,lp->dw_abc_flags);
15790 +
15791 +       }
15792 +}
15793 +
15794 +
15795 +int isdn_dw_abc_reset_interface(isdn_net_local *lp,int with_message)
15796 +{
15797 +       int r = -EINVAL;
15798 +
15799 +       if(lp != NULL) {
15800 +
15801 +               r = 0;
15802 +
15803 +               lp->dw_abc_bchan_last_connect = 0;
15804 +               lp->dw_abc_dialstart = 0;
15805 +               lp->dw_abc_inuse_secure = 0;
15806 +#ifdef CONFIG_ISDN_WITH_ABC_CONN_ERROR
15807 +               lp->dw_abc_bchan_errcnt = 0;
15808 +#endif
15809 +
15810 +               if(with_message && dev->net_verbose > 0)
15811 +                       printk(KERN_INFO
15812 +                               "%s: NOTE: reset (clear) abc-interface-secure-counter\n",
15813 +                               lp->name);
15814 +       }
15815 +
15816 +       return(r);
15817 +}
15818 +
15819 +       
15820 +#if CONFIG_ISDN_WITH_ABC_RAWIPCOMPRESS && CONFIG_ISDN_PPP
15821 +
15822 +#define DWBSD_PKT_FIRST_LEN 16
15823 +#define DWBSD_PKT_SWITCH       165
15824 +#define DWBSD_PKT_BSD          189
15825 +
15826 +#define DWBSD_VERSION          0x2
15827 +
15828 +void dwabc_bsd_first_gen(isdn_net_local *lp)
15829 +{
15830 +       if(lp != NULL && lp->p_encap == ISDN_NET_ENCAP_RAWIP && 
15831 +               (lp->dw_abc_flags & ISDN_DW_ABC_FLAG_BSD_COMPRESS)) { 
15832 +               
15833 +               struct sk_buff *skb = NULL;
15834 +               char *p = NULL;
15835 +               char *ep = NULL;
15836 +
15837 +               if((skb =(struct sk_buff *)dev_alloc_skb(128)) == NULL) {
15838 +
15839 +                       printk(KERN_INFO "%s: dwabc: alloc-skb failed for 128 bytes\n",lp->name);
15840 +                       return;
15841 +               }
15842 +
15843 +               skb_reserve(skb,64);
15844 +               p = skb_put(skb,DWBSD_PKT_FIRST_LEN);
15845 +               ep = p + DWBSD_PKT_FIRST_LEN;
15846 +
15847 +               *(p++) = DWBSD_PKT_SWITCH;
15848 +               *(p++) = DWBSD_VERSION;
15849 +               for(;p < ep;p++)        *(p++) = 0;
15850 +
15851 +               isdn_net_write_super(lp, skb);
15852 +
15853 +               if(dev->net_verbose > 2)
15854 +                       printk(KERN_INFO "%s: dwabc: sending comm-header version 0x%x\n",lp->name,DWBSD_VERSION);
15855 +       }
15856 +}
15857 +
15858 +
15859 +void dwabc_bsd_free(isdn_net_local *lp)
15860 +{
15861 +       if(lp != NULL) {
15862 +
15863 +               if(lp->dw_abc_bsd_stat_rx || lp->dw_abc_bsd_stat_tx) {
15864 +
15865 +                       struct isdn_ppp_compressor *c = NULL;
15866 +
15867 +                       if(!(c = (struct isdn_ppp_compressor *)lp->dw_abc_bsd_compressor)) {
15868 +
15869 +                               printk(KERN_WARNING
15870 +                               "%s: PANIC: freeing bsd compressmemory without compressor\n",
15871 +                                       lp->name);
15872 +
15873 +                       } else {
15874 +
15875 +                               if(lp->dw_abc_bsd_stat_rx) (*c->free)(lp->dw_abc_bsd_stat_rx);
15876 +                               if(lp->dw_abc_bsd_stat_tx) (*c->free)(lp->dw_abc_bsd_stat_tx);
15877 +
15878 +                               if(dev->net_verbose > 2)
15879 +                                       printk(KERN_INFO
15880 +                                               "%s: free bsd compress-memory\n",
15881 +                                               lp->name);
15882 +                       }
15883 +               }
15884 +
15885 +               lp->dw_abc_bsd_compressor = NULL;
15886 +               lp->dw_abc_bsd_stat_rx = NULL;
15887 +               lp->dw_abc_bsd_stat_tx = NULL;
15888 +               lp->dw_abc_if_flags &= ~ISDN_DW_ABC_IFFLAG_BSDAKTIV;
15889 +
15890 +               if(dev->net_verbose > 0) {
15891 +
15892 +                       if(lp->dw_abc_bsd_rcv != lp->dw_abc_bsd_bsd_rcv) {
15893 +
15894 +                               printk(KERN_INFO "%s: Receive %lu<-%lu kb\n",lp->name,
15895 +                                       lp->dw_abc_bsd_rcv >> 10 , lp->dw_abc_bsd_bsd_rcv >> 10);
15896 +                       }
15897 +
15898 +
15899 +                       if(lp->dw_abc_bsd_snd != lp->dw_abc_bsd_bsd_snd) {
15900 +
15901 +                               printk(KERN_INFO "%s: Send  %lu->%lu kb\n",lp->name,
15902 +                                       lp->dw_abc_bsd_snd >> 10 , lp->dw_abc_bsd_bsd_snd >> 10);
15903 +                       }
15904 +               }
15905 +
15906 +               lp->dw_abc_bsd_rcv              =
15907 +               lp->dw_abc_bsd_bsd_rcv  =
15908 +               lp->dw_abc_bsd_snd              =
15909 +               lp->dw_abc_bsd_bsd_snd  = 0;
15910 +       }
15911 +}
15912 +
15913 +
15914 +int dwabc_bsd_init(isdn_net_local *lp)
15915 +{
15916 +       int r = 1;
15917 +
15918 +       if(lp != NULL) {
15919 +
15920 +               dwabc_bsd_free(lp);
15921 +
15922 +               if(lp->p_encap == ISDN_NET_ENCAP_RAWIP) {
15923 +
15924 +                       void *rx = NULL;
15925 +                       void *tx = NULL;
15926 +                       struct isdn_ppp_comp_data *cp = NULL;
15927 +                       struct isdn_ppp_compressor *c = NULL;
15928 +
15929 +                       if(lp->dw_abc_flags & ISDN_DW_ABC_FLAG_BSD_COMPRESS) do {
15930 +
15931 +                               for(c = ipc_head ;
15932 +                                       c != NULL && c->num != CI_BSD_COMPRESS; c = c->next);
15933 +
15934 +                               if(c == NULL) {
15935 +
15936 +                                       printk(KERN_INFO
15937 +                                               "%s: Module isdn_bsdcompress not loaded\n",
15938 +                                               lp->name);
15939 +
15940 +                                       break;
15941 +                               }
15942 +
15943 +                               cp = (struct isdn_ppp_comp_data *)
15944 +                                       kmalloc(sizeof(struct isdn_ppp_comp_data),GFP_ATOMIC);
15945 +
15946 +                               if(cp == NULL) {
15947 +
15948 +                                       printk(KERN_INFO
15949 +                                               "%s: allocation of isdn_ppp_comp_data failed\n",
15950 +                                               lp->name);
15951 +
15952 +                                       break;
15953 +                               }
15954 +
15955 +                               memset(cp,0,sizeof(*cp));
15956 +                               cp->num = CI_BSD_COMPRESS;
15957 +                               cp->optlen = 1;
15958 +                                       
15959 +                               /*
15960 +                               ** set BSD_VERSION 1 and 12 bits compressmode
15961 +                               */
15962 +                               *cp->options = (1 << 5) | 12;
15963 +
15964 +                               if((rx = (*c->alloc)(cp)) == NULL) {
15965 +
15966 +                                       printk(KERN_INFO
15967 +                                               "%s: allocation of bsd rx-memory failed\n",
15968 +                                               lp->name);
15969 +
15970 +                                       break;
15971 +                               }
15972 +                                       
15973 +                               if(!(*c->init)(rx,cp,0,1)) {
15974 +
15975 +                                       printk(KERN_INFO 
15976 +                                               "%s: init of bsd rx-stream  failed\n",lp->name);
15977 +
15978 +                                       break;
15979 +                               }
15980 +
15981 +                               cp->flags = IPPP_COMP_FLAG_XMIT;
15982 +                                               
15983 +                               if((tx = (*c->alloc)(cp)) == NULL) {
15984 +
15985 +                                       printk(KERN_INFO
15986 +                                               "%s: allocation of bsd tx-memory failed\n",
15987 +                                               lp->name);
15988 +
15989 +                                       break;
15990 +                               }
15991 +
15992 +                               if(!(*c->init)(tx,cp,0,1)) {
15993 +
15994 +                                       printk(KERN_INFO
15995 +                                               "%s: init of bsd tx-stream  failed\n",
15996 +                                               lp->name);
15997 +
15998 +                                       break;
15999 +                               }
16000 +
16001 +                               lp->dw_abc_bsd_compressor = (void *)c;
16002 +                               lp->dw_abc_bsd_stat_rx = rx;
16003 +                               lp->dw_abc_bsd_stat_tx = tx;
16004 +                               rx = tx = NULL;
16005 +                               r = 0;
16006 +
16007 +                               if(dev->net_verbose > 2)
16008 +                                       printk(KERN_INFO
16009 +                                               "%s: bsd compress-memory and init ok\n",
16010 +                                               lp->name);
16011 +
16012 +                       } while(0);
16013 +
16014 +                       if(cp != NULL)
16015 +                               kfree(cp);
16016 +
16017 +                       if(c != NULL) {
16018 +
16019 +                               if(tx != NULL) (*c->free)(tx);
16020 +                               if(rx != NULL) (*c->free)(rx);
16021 +                       }
16022 +
16023 +               } else if(lp->dw_abc_flags & ISDN_DW_ABC_FLAG_BSD_COMPRESS) {
16024 +               
16025 +                       printk(KERN_INFO
16026 +                               "%s: bsd-compress only with encapsulation rawip allowed\n",
16027 +                               lp->name);
16028 +               }
16029 +       }
16030 +
16031 +       return(r);
16032 +}
16033 +
16034 +struct sk_buff *dwabc_bsd_compress(    isdn_net_local *lp,
16035 +                                                                       struct sk_buff *skb,
16036 +                                                                       struct net_device *ndev)
16037 +{
16038 +       if(lp != NULL && lp->p_encap == ISDN_NET_ENCAP_RAWIP    && 
16039 +               (lp->dw_abc_flags & ISDN_DW_ABC_FLAG_BSD_COMPRESS)      &&
16040 +               (lp->dw_abc_if_flags & ISDN_DW_ABC_IFFLAG_BSDAKTIV)) {
16041 +
16042 +               if(lp->dw_abc_bsd_stat_tx != NULL && lp->dw_abc_bsd_compressor) {
16043 +
16044 +                       struct isdn_ppp_compressor *cp = 
16045 +                               (struct isdn_ppp_compressor *)lp->dw_abc_bsd_compressor;
16046 +
16047 +                       struct sk_buff *nskb = (struct sk_buff *)
16048 +                               dev_alloc_skb(skb->len * 2 + ndev->hard_header_len);
16049 +
16050 +                       int l = 0;
16051 +
16052 +                       if(nskb == NULL) {
16053 +
16054 +                               (void)(*cp->reset)(lp->dw_abc_bsd_stat_tx,0,0,NULL,0,NULL);
16055 +                               printk(KERN_INFO "%s: dwabc-compress no memory\n",lp->name);
16056 +
16057 +                       } else {
16058 +
16059 +                               skb_reserve(nskb,ndev->hard_header_len);
16060 +                               *(unsigned char *)skb_put(nskb,1) = DWBSD_PKT_BSD;
16061 +                               l = (*cp->compress)(lp->dw_abc_bsd_stat_tx,skb,nskb,0x21);
16062 +
16063 +                               if(l < 1 || l > skb->len) {
16064 +
16065 +                                       (void)(*cp->reset)(lp->dw_abc_bsd_stat_tx,0,0,NULL,0,NULL);
16066 +                                       dev_kfree_skb(nskb);
16067 +
16068 +                               } else {
16069 +
16070 +                                       u_short sqnr;
16071 +
16072 +                                       dev_kfree_skb(skb);
16073 +                                       skb = nskb;
16074 +                                       sqnr = ((*(u_char *)skb->data) << 8) + 
16075 +                                                       ((u_char)skb->data[1]);
16076 +
16077 +                                       if(sqnr > 65500)
16078 +                                               (void)(*cp->reset)
16079 +                                                       (lp->dw_abc_bsd_stat_tx,0,0,NULL,0,NULL);
16080 +                               }
16081 +                       }
16082 +               }
16083 +       }
16084 +
16085 +       return(skb);
16086 +}
16087 +
16088 +struct sk_buff *dwabc_bsd_rx_pkt(      isdn_net_local *lp,
16089 +                                                                       struct sk_buff *skb,
16090 +                                                                       struct net_device *ndev)
16091 +{
16092 +       struct sk_buff *r = skb;
16093 +
16094 +       if(lp != NULL && lp->p_encap == ISDN_NET_ENCAP_RAWIP && 
16095 +               (lp->dw_abc_flags & ISDN_DW_ABC_FLAG_BSD_COMPRESS)) { 
16096 +
16097 +               unsigned char *p = (unsigned char *)skb->data;
16098 +               struct isdn_ppp_compressor *cp = 
16099 +                       (struct isdn_ppp_compressor *)lp->dw_abc_bsd_compressor;
16100 +
16101 +               if(*p == DWBSD_PKT_SWITCH) {
16102 +
16103 +                       if(skb->len == DWBSD_PKT_FIRST_LEN) {
16104 +
16105 +                               if((lp->dw_abc_remote_version = p[1]) < 0x2) {
16106 +
16107 +                                       printk(KERN_INFO 
16108 +                                               "%s: I can't really talk with remote version 0x%x\n"
16109 +                                               "Please upgrade remote or disable rawip-compression\n",
16110 +                                               lp->name,
16111 +                                               p[1]);
16112 +                               }
16113 +
16114 +                               lp->dw_abc_if_flags |= ISDN_DW_ABC_IFFLAG_BSDAKTIV;
16115 +                               dev_kfree_skb(skb);
16116 +
16117 +                               if(cp && lp->dw_abc_bsd_stat_tx) 
16118 +                                       (void)(*cp->reset)(lp->dw_abc_bsd_stat_tx,0,0,NULL,0,NULL);
16119 +
16120 +                               if(dev->net_verbose > 2)
16121 +                                       printk(KERN_INFO 
16122 +                                               "%s: receive comm-header rem-version 0x%02x\n",
16123 +                                               lp->name,
16124 +                                               lp->dw_abc_remote_version);
16125 +
16126 +                               return(NULL);
16127 +                       }
16128 +
16129 +               } else if(*p == DWBSD_PKT_BSD && lp->dw_abc_bsd_stat_rx != NULL && cp) {
16130 +
16131 +                       struct sk_buff *nskb = NULL;
16132 +
16133 +                       if(test_and_set_bit(ISDN_DW_ABC_BITLOCK_RECEIVE,
16134 +                               &lp->dw_abc_bitlocks)) {
16135 +
16136 +                               printk(KERN_INFO "%s: bsd-decomp called recursivly\n",lp->name);
16137 +                               dev_kfree_skb(skb);
16138 +                               dwabc_bsd_first_gen(lp);
16139 +                               return(NULL);
16140 +                       } 
16141 +                       
16142 +                       nskb = (struct sk_buff *)
16143 +                               dev_alloc_skb(2048 + ndev->hard_header_len);
16144 +
16145 +                       if(nskb != NULL) {
16146 +
16147 +                               int l = 0;
16148 +                               u_short sqnr;
16149 +
16150 +                               skb_reserve(nskb,ndev->hard_header_len);
16151 +                               skb_pull(skb, 1);
16152 +                               sqnr = ((*(u_char *)skb->data) << 8) | ((u_char)skb->data[1]);
16153 +
16154 +                               if(!sqnr && cp && lp->dw_abc_bsd_stat_rx)
16155 +                                       (void)(*cp->reset)(lp->dw_abc_bsd_stat_rx,0,0,NULL,0,NULL);
16156 +
16157 +                               if((l = (*cp->decompress)
16158 +                                       (lp->dw_abc_bsd_stat_rx,skb,nskb,NULL)) < 1 || l>8000) {
16159 +
16160 +                                       printk(KERN_INFO "%s: abc-decomp failed\n",lp->name);
16161 +                                       dev_kfree_skb(nskb);
16162 +                                       dev_kfree_skb(skb);
16163 +                                       nskb = NULL;
16164 +                                       dwabc_bsd_first_gen(lp);
16165 +
16166 +                               } else {
16167 +
16168 +                                       if (nskb->data[0] & 0x1)
16169 +                                               skb_pull(nskb, 1);   /* protocol ID is only 8 bit */
16170 +                                       else
16171 +                                               skb_pull(nskb, 2);
16172 +
16173 +                                       nskb->dev = skb->dev;
16174 +                                       nskb->pkt_type = skb->pkt_type;
16175 +                                       nskb->mac.raw = nskb->data;
16176 +                                       dev_kfree_skb(skb);
16177 +                               }
16178 +
16179 +                       } else {
16180 +
16181 +                               printk(KERN_INFO "%s: PANIC abc-decomp no memory\n",lp->name);
16182 +                               dev_kfree_skb(skb);
16183 +                               dwabc_bsd_first_gen(lp);
16184 +                       }
16185 +
16186 +                       clear_bit(ISDN_DW_ABC_BITLOCK_RECEIVE,&lp->dw_abc_bitlocks);
16187 +                       r = nskb;
16188 +               }
16189 +       }
16190 +
16191 +       return(r);
16192 +}
16193 +
16194 +#else
16195 +int dwabc_bsd_init(isdn_net_local *lp) { return(1); }
16196 +void dwabc_bsd_free(isdn_net_local *lp) { return; }
16197 +void dwabc_bsd_first_gen(isdn_net_local *lp) { return ; }
16198 +
16199 +struct sk_buff *dwabc_bsd_compress(isdn_net_local *lp,struct sk_buff *skb,struct net_device *ndev)
16200 +{ return(skb); }
16201 +
16202 +struct sk_buff *dwabc_bsd_rx_pkt(isdn_net_local *lp,struct sk_buff *skb,struct net_device *ndev)
16203 +{ return(skb); }
16204 +#endif
16205 +#endif
16206 Index: linux-2.4.35.4/drivers/isdn/isdn_net.c
16207 ===================================================================
16208 --- linux-2.4.35.4.orig/drivers/isdn/isdn_net.c 2007-12-15 05:19:40.618735767 +0100
16209 +++ linux-2.4.35.4/drivers/isdn/isdn_net.c      2007-12-15 05:19:55.699595179 +0100
16210 @@ -1,4 +1,4 @@
16211 -/* $Id: isdn_net.c,v 1.1.4.1 2001/11/20 14:19:34 kai Exp $
16212 +/* $Id: isdn_net.c,v 1.153 2002/08/17 18:35:23 detabc Exp $
16213   *
16214   * Linux ISDN subsystem, network interfaces and related functions (linklevel).
16215   *
16216 @@ -9,14 +9,6 @@
16217   * This software may be used and distributed according to the terms
16218   * of the GNU General Public License, incorporated herein by reference.
16219   *
16220 - * Data Over Voice (DOV) support added - Guy Ellis 23-Mar-02 
16221 - *                                       guy@traverse.com.au
16222 - * Outgoing calls - looks for a 'V' in first char of dialed number
16223 - * Incoming calls - checks first character of eaz as follows:
16224 - *   Numeric - accept DATA only - original functionality
16225 - *   'V'     - accept VOICE (DOV) only
16226 - *   'B'     - accept BOTH DATA and DOV types
16227 - *
16228   * Jan 2001: fix CISCO HDLC      Bjoern A. Zeeb <i4l@zabbadoz.net>
16229   *           for info on the protocol, see 
16230   *           http://i4l.zabbadoz.net/i4l/cisco-hdlc.txt
16231 @@ -38,6 +30,10 @@
16232  #include "isdn_concap.h"
16233  #endif
16234  
16235 +#ifdef CONFIG_ISDN_WITH_ABC
16236 +#include <linux/isdn_dwabc.h>
16237 +#define isdn_net_log_skb(skb,lp) isdn_net_log_skb_dwabc(skb,lp,NULL)
16238 +#endif
16239  
16240  /*
16241   * Outline of new tbusy handling: 
16242 @@ -79,7 +75,11 @@
16243                 dev = lp->master;
16244         else
16245                 dev = &n->dev;
16246 +#ifdef COMPAT_NO_SOFTNET
16247 +       return dev->start;
16248 +#else
16249         return netif_running(dev);
16250 +#endif
16251  }
16252  
16253  /*
16254 @@ -143,6 +143,10 @@
16255         atomic_inc(&lp->frame_cnt);
16256         if (isdn_net_device_busy(lp))
16257                 isdn_net_device_stop_queue(lp);
16258 +#if 0
16259 +       printk(KERN_DEBUG "%s: inc_frame_cnt now %d\n", lp->name, 
16260 +             atomic_read(&lp->frame_cnt));
16261 +#endif
16262  }
16263  
16264  static __inline__ void isdn_net_dec_frame_cnt(isdn_net_local *lp)
16265 @@ -157,11 +161,19 @@
16266                         isdn_net_device_wake_queue(lp);
16267                 }
16268         }                                                                      
16269 +#if 0
16270 +       printk(KERN_DEBUG "%s: dec_frame_cnt now %d\n", lp->name, 
16271 +              atomic_read(&lp->frame_cnt));
16272 +#endif
16273  }
16274  
16275  static __inline__ void isdn_net_zero_frame_cnt(isdn_net_local *lp)
16276  {
16277         atomic_set(&lp->frame_cnt, 0);
16278 +#if 0
16279 +       printk(KERN_DEBUG "%s: zero_frame_cnt now %d\n", lp->name,
16280 +              atomic_read(&lp->frame_cnt));
16281 +#endif
16282  }
16283  
16284  /* For 2.2.x we leave the transmitter busy timeout at 2 secs, just 
16285 @@ -173,23 +185,101 @@
16286   * which might rely on the tx timeout. If so, we'll find out this way...
16287   */
16288  
16289 +#ifdef COMPAT_NO_SOFTNET
16290 +#define ISDN_NET_TX_TIMEOUT (2*HZ)
16291 +#else
16292  #define ISDN_NET_TX_TIMEOUT (20*HZ) 
16293 +#endif
16294  
16295  /* Prototypes */
16296  
16297 +#ifndef CONFIG_ISDN_WITH_ABC
16298  int isdn_net_force_dial_lp(isdn_net_local *);
16299 +#endif
16300  static int isdn_net_start_xmit(struct sk_buff *, struct net_device *);
16301  
16302  static void isdn_net_ciscohdlck_connected(isdn_net_local *lp);
16303  static void isdn_net_ciscohdlck_disconnected(isdn_net_local *lp);
16304  
16305 -char *isdn_net_revision = "$Revision: 1.1.4.1 $";
16306 +char *isdn_net_revision = "$Revision: 1.153 $";
16307  
16308   /*
16309    * Code for raw-networking over ISDN
16310    */
16311 +#ifdef CONFIG_ISDN_WITH_ABC
16312 +#ifdef CONFIG_ISDN_WITH_ABC_CONN_ERROR
16313 +static int isdn_dwabc_encap_with_conerr(isdn_net_local *lp)
16314 +{
16315 +       if(lp->dw_abc_flags & ISDN_DW_ABC_FLAG_NO_CONN_ERROR)
16316 +               return(0);
16317 +
16318 +       return( 
16319 +               lp->p_encap == ISDN_NET_ENCAP_SYNCPPP                   ||
16320 +               lp->p_encap == ISDN_NET_ENCAP_RAWIP                     ||
16321 +               lp->p_encap == ISDN_NET_ENCAP_CISCOHDLCK                ||
16322 +               lp->p_encap == ISDN_NET_ENCAP_UIHDLC                    );
16323 +}
16324 +
16325 +static int isdn_dwabc_conerr_ippktok(struct sk_buff *skb)
16326 +{
16327 +               struct iphdr *iph = (struct iphdr *)skb->data;
16328 +               return(iph->version == 6 || (skb->len >= 20 && iph->version == 4));
16329 +}
16330 +
16331 +#endif
16332 +
16333 +static int isdn_dwabc_is_interface_disabled(isdn_net_local *lp)
16334 +{
16335 +       if(lp == NULL)
16336 +               return(0);
16337 +
16338 +       lp->dw_abc_inuse_secure = 0;
16339 +       lp->dw_abc_dialstart = 0;
16340 +
16341 +       /*
16342 +       ** check for jiffies overflow
16343 +       */
16344 +       if(lp->dw_abc_bchan_last_connect > jiffies) {
16345 +
16346 +#ifdef CONFIG_ISDN_WITH_ABC_CONN_ERROR
16347 +               lp->dw_abc_bchan_errcnt = 0;
16348 +#endif
16349 +               lp->dw_abc_bchan_last_connect = 0;
16350 +       }
16351 +
16352 +#ifdef CONFIG_ISDN_WITH_ABC_CONN_ERROR
16353 +       if(!(lp->dw_abc_flags & ISDN_DW_ABC_FLAG_NO_CONN_ERROR) && isdn_dwabc_encap_with_conerr(lp)) {
16354 +
16355 +               if(lp->dw_abc_bchan_errcnt > 3 && !(lp->dw_abc_bchan_errcnt & 3)) {
16356  
16357 +                       ulong nj = jiffies;
16358 +                       ulong delay =   lp->dw_abc_bchan_errcnt * 
16359 +                                                       lp->dw_abc_bchan_errcnt * 
16360 +                                                       lp->dw_abc_bchan_errcnt;
16361 +
16362 +                       if(delay > 86400) delay = 86400;
16363 +                       delay = (lp->dw_abc_bchan_last_connect + delay * HZ);
16364 +
16365 +                       if(delay > nj) {
16366 +
16367 +                               printk(KERN_INFO 
16368 +                                       "%s: interface auto-disabled (bchannel connect-error %lu seconds left)\n",
16369 +                                       lp->name,(delay - nj) / HZ);
16370 +
16371 +                               return(1);
16372 +                       }
16373 +               }
16374 +       }
16375 +#endif
16376 +       return(0);
16377 +}
16378 +#endif
16379 +
16380 +#ifdef CONFIG_ISDN_WITH_ABC
16381 +void
16382 +#else
16383  static void
16384 +#endif
16385  isdn_net_unreachable(struct net_device *dev, struct sk_buff *skb, char *reason)
16386  {
16387         if(skb) {
16388 @@ -297,6 +387,12 @@
16389  
16390         save_flags(flags);
16391         cli();
16392 +#ifdef CONFIG_ISDN_WITH_ABC
16393 +       isdn_dw_clear_if(0l,lp);
16394 +       lp->dw_abc_if_flags &= ~ISDN_DW_ABC_IFFLAG_NODCHAN;
16395 +       lp->dw_abc_inuse_secure = 0;
16396 +       dwabc_bsd_free(lp);
16397 +#endif
16398         skb_queue_purge(&lp->super_tx_queue);
16399  
16400         if (!lp->master) {      /* reset only master device */
16401 @@ -351,6 +447,26 @@
16402                 if ((l->flags & ISDN_NET_CONNECTED) && (!l->dialstate)) {
16403                         anymore = 1;
16404                         l->huptimer++;
16405 +#ifdef CONFIG_ISDN_WITH_ABC
16406 +#ifdef CONFIG_ISDN_WITH_ABC_CONN_ERROR
16407 +                       if(     isdn_dwabc_encap_with_conerr(l) && l->dw_abc_bchan_errcnt > 0) {
16408 +
16409 +                               int n = 180;
16410 +
16411 +                               if(l->dw_abc_bchan_errcnt > 3) n = 120;
16412 +                               if(l->dw_abc_bchan_errcnt > 6) n = 90;
16413 +                               if(l->dw_abc_bchan_errcnt > 9) n = 60;
16414 +
16415 +                               if(l->huptimer > n) {
16416 +
16417 +                                       printk(KERN_INFO "%s: bchan conf-error auto-secure-hangup\n",l->name);
16418 +                                       isdn_net_hangup(&p->dev);
16419 +                                       p = (isdn_net_dev *) p->next;
16420 +                                       continue;
16421 +                               }
16422 +                       }
16423 +#endif
16424 +#endif
16425                         /*
16426                          * if there is some dialmode where timeout-hangup
16427                          * should _not_ be done, check for that here
16428 @@ -465,8 +581,32 @@
16429                                         printk(KERN_INFO "%s: Chargesum is %d\n", lp->name,
16430                                                lp->charge);
16431                                         isdn_net_unbind_channel(lp);
16432 +#ifdef CONFIG_ISDN_WITH_ABC_CONN_ERROR
16433 +                                       if(lp->dw_abc_bchan_errcnt) {
16434 +
16435 +                                               printk(KERN_INFO
16436 +                                                       "%s: Note: bchannel-error-counter is %hd\n",
16437 +                                                       lp->name,
16438 +                                                       lp->dw_abc_bchan_errcnt);
16439 +                                       }
16440 +#endif
16441                                         return 1;
16442                                 }
16443 +#ifdef CONFIG_ISDN_WITH_ABC_CH_EXTINUSE
16444 +                               if(!(lp->dw_abc_flags & ISDN_DW_ABC_FLAG_NO_CH_EXTINUSE)) {
16445 +                                       if((lp->dialstate == 4 || lp->dialstate == 12) && 
16446 +                                               lp->dw_abc_dialstart && (idx < ISDN_MAX_CHANNELS)) {
16447 +                                       
16448 +                                               if((jiffies - lp->dw_abc_dialstart) < (HZ >>2)) {
16449 +
16450 +                                                       lp->dw_abc_if_flags |= ISDN_DW_ABC_IFFLAG_NODCHAN;
16451 +                                                       lp->dialstate = 1;
16452 +                                                       dev->dwabc_chan_external_inuse[idx] = jiffies + HZ * 30;
16453 +                                                       printk(KERN_INFO "%s: Channel %d look like external in use\n",lp->name,idx);
16454 +                                               }
16455 +                                       }
16456 +                               }
16457 +#endif
16458                                 break;
16459  #ifdef CONFIG_ISDN_X25
16460                         case ISDN_STAT_BHUP:
16461 @@ -507,6 +647,19 @@
16462                                                         }
16463                                                 }
16464                                                 printk(KERN_INFO "isdn_net: %s connected\n", lp->name);
16465 +#ifdef CONFIG_ISDN_WITH_ABC
16466 +                                               if(!dwabc_bsd_init(lp)) dwabc_bsd_first_gen(lp);
16467 +                                               lp->dw_abc_bchan_last_connect = jiffies;
16468 +#ifdef CONFIG_ISDN_WITH_ABC_CONN_ERROR
16469 +                                               if(!(lp->dw_abc_flags & ISDN_DW_ABC_FLAG_NO_CONN_ERROR)) {
16470 +
16471 +                                                       lp->dw_abc_bchan_errcnt += isdn_dwabc_encap_with_conerr(lp);
16472 +                                                       
16473 +                                                       if(lp->dw_abc_bchan_errcnt > 32000)
16474 +                                                               lp->dw_abc_bchan_errcnt = 32000;
16475 +                                               }
16476 +#endif
16477 +#endif
16478                                                 /* If first Chargeinfo comes before B-Channel connect,
16479                                                  * we correct the timestamp here.
16480                                                  */
16481 @@ -578,7 +731,6 @@
16482         int i;
16483         unsigned long flags;
16484         isdn_ctrl cmd;
16485 -        u_char *phone_number;
16486  
16487         while (p) {
16488                 isdn_net_local *lp = p->local;
16489 @@ -597,6 +749,47 @@
16490                                  */
16491                                 save_flags(flags);
16492                                 cli();
16493 +#ifdef CONFIG_ISDN_WITH_ABC_CH_EXTINUSE
16494 +                               if(!(lp->dw_abc_flags & ISDN_DW_ABC_FLAG_NO_CH_EXTINUSE) &&
16495 +                                       (lp->dw_abc_if_flags & ISDN_DW_ABC_IFFLAG_NODCHAN)) {
16496 +
16497 +                                       int chi = 0;
16498 +                                       short lsecure = 0;
16499 +
16500 +                                       lsecure = lp->dw_abc_inuse_secure;
16501 +                                       isdn_net_unbind_channel(lp);
16502 +                                       lp->dw_abc_inuse_secure = lsecure + 1;
16503 +
16504 +                                       /* Grab a free ISDN-Channel */
16505 +                                       if ((lsecure >= ISDN_MAX_CHANNELS ) || (chi = 
16506 +                                               isdn_get_free_channel(
16507 +                                                       ISDN_USAGE_NET,
16508 +                                                       lp->l2_proto,
16509 +                                                       lp->l3_proto,
16510 +                                                       lp->pre_device,
16511 +                                                       lp->pre_channel,
16512 +#ifdef CONFIG_ISDN_WITH_ABC_OUTGOING_EAZ
16513 +                                                       (*lp->dw_out_msn) ? lp->dw_out_msn : lp->msn)
16514 +#else
16515 +                                                       lp->msn)
16516 +#endif
16517 +                                                       ) < 0) {
16518 +
16519 +                                               restore_flags(flags);
16520 +                                               isdn_net_unreachable(&p->dev, NULL,
16521 +                                                       "DWABC: redial-external-inuse NO FREE CHANNEL\n");
16522 +                                               isdn_net_hangup(&p->dev);
16523 +                                               break;
16524 +                                       }
16525 +
16526 +                                       isdn_net_bind_channel(lp, chi);
16527 +                                       lp->dialstate = 1;
16528 +                                       lp->dialstarted = 0;
16529 +                                       lp->dialwait_timer = 0;
16530 +                               }
16531 +
16532 +                               lp->dw_abc_if_flags &= ~ISDN_DW_ABC_IFFLAG_NODCHAN;
16533 +#endif
16534                                 lp->dial = lp->phone[1];
16535                                 restore_flags(flags);
16536                                 if (!lp->dial) {
16537 @@ -621,18 +814,69 @@
16538                                 cmd.arg = lp->isdn_channel;
16539                                 cmd.command = ISDN_CMD_CLREAZ;
16540                                 isdn_command(&cmd);
16541 +#ifdef CONFIG_ISDN_WITH_ABC_OUTGOING_EAZ
16542 +                               sprintf(cmd.parm.num, "%s",
16543 +                                       isdn_map_eaz2msn((*lp->dw_out_msn) ? lp->dw_out_msn : lp->msn, cmd.driver));
16544 +#else
16545                                 sprintf(cmd.parm.num, "%s", isdn_map_eaz2msn(lp->msn, cmd.driver));
16546 +#endif
16547                                 cmd.command = ISDN_CMD_SETEAZ;
16548                                 isdn_command(&cmd);
16549                                 lp->dialretry = 0;
16550                                 anymore = 1;
16551                                 lp->dialstate++;
16552 +#ifdef CONFIG_ISDN_WITH_ABC
16553 +                               lp->onhtime = lp->dw_abc_old_onhtime;
16554 +#ifdef CONFIG_ISDN_WITH_ABC_LCR_SUPPORT
16555 +                               isdn_dw_abc_lcr_clear(lp);
16556 +#endif
16557 +#endif
16558                                 /* Fall through */
16559                         case 3:
16560                                 /* Setup interface, dial current phone-number, switch to next number.
16561                                  * If list of phone-numbers is exhausted, increment
16562                                  * retry-counter.
16563                                  */
16564 +#ifdef CONFIG_ISDN_WITH_ABC_LCR_SUPPORT
16565 +                               if(!isdn_dw_abc_lcr_lock()) {
16566 +
16567 +                                       if(     lp->dw_abc_lcr_cmd != NULL              &&
16568 +                                               lp->dw_abc_lcr_start_request    != 
16569 +                                               lp->dw_abc_lcr_end_request) {
16570 +
16571 +                                               if(     lp->dw_abc_lcr_io == NULL                               && 
16572 +                                                       lp->dw_abc_lcr_start_request <= jiffies &&
16573 +                                                       lp->dw_abc_lcr_end_request > jiffies) {
16574 +                                                       
16575 +                                                       isdn_dw_abc_lcr_ulock();
16576 +                                                       anymore = 1;
16577 +                                                       break;
16578 +                                               }
16579 +
16580 +                                               if(lp->dw_abc_lcr_io != NULL) {
16581 +
16582 +                                                       if(lp->dw_abc_lcr_io->lcr_ioctl_flags & 
16583 +                                                               DWABC_LCR_FLG_DISABLE) {
16584 +
16585 +                                                               isdn_dw_abc_lcr_ulock();
16586 +                                                               isdn_net_hangup(&p->dev);
16587 +                                                               break;
16588 +                                                       }
16589 +
16590 +                                                       if(lp->dw_abc_lcr_io->lcr_ioctl_flags & 
16591 +                                                               DWABC_LCR_FLG_NEWHUPTIME) {
16592 +                                                               lp->onhtime = lp->dw_abc_lcr_io->lcr_ioctl_onhtime;
16593 +                                                       }
16594 +                                               }
16595 +
16596 +                                               memcpy(&cmd,lp->dw_abc_lcr_cmd,sizeof(cmd));
16597 +                                               isdn_dw_abc_lcr_ulock();
16598 +                                               goto dw_abc_lcr_next_click;
16599 +                                       }
16600 +
16601 +                                       isdn_dw_abc_lcr_ulock();
16602 +                               }
16603 +#endif
16604                                 if(dev->global_flags & ISDN_GLOBAL_STOPPED || (ISDN_NET_DIALMODE(*lp) == ISDN_NET_DM_OFF)) {
16605                                         char *s;
16606                                         if (dev->global_flags & ISDN_GLOBAL_STOPPED)
16607 @@ -677,20 +921,7 @@
16608                                                         break;
16609                                                 }
16610  
16611 -                                       cmd.driver = lp->isdn_device;
16612 -                                       cmd.command = ISDN_CMD_DIAL;
16613 -                                       cmd.parm.setup.si2 = 0;
16614 -
16615 -                                        /* check for DOV */
16616 -                                        phone_number = lp->dial->num;
16617 -                                        if ((*phone_number == 'v') ||
16618 -                                           (*phone_number == 'V')) { /* DOV call */
16619 -                                                cmd.parm.setup.si1 = 1;
16620 -                                        } else { /* DATA call */
16621 -                                                cmd.parm.setup.si1 = 7;
16622 -                                       }
16623 -
16624 -                                       strcpy(cmd.parm.setup.phone, phone_number);
16625 +                                       sprintf(cmd.parm.setup.phone, "%s", lp->dial->num);
16626                                         /*
16627                                          * Switch to next number or back to start if at end of list.
16628                                          */
16629 @@ -710,17 +941,70 @@
16630                                                 }
16631                                         }
16632                                         restore_flags(flags);
16633 +                                       cmd.driver = lp->isdn_device;
16634 +                                       cmd.command = ISDN_CMD_DIAL;
16635 +                                       cmd.parm.setup.si1 = 7;
16636 +                                       cmd.parm.setup.si2 = 0;
16637 +#ifdef CONFIG_ISDN_WITH_ABC_OUTGOING_EAZ 
16638 +                                       sprintf(cmd.parm.setup.eazmsn, "%s",
16639 +                                               isdn_map_eaz2msn((*lp->dw_out_msn) ? lp->dw_out_msn : lp->msn, cmd.driver));
16640 +#else
16641                                         sprintf(cmd.parm.setup.eazmsn, "%s",
16642                                                 isdn_map_eaz2msn(lp->msn, cmd.driver));
16643 +#endif
16644 +#ifdef CONFIG_ISDN_WITH_ABC_LCR_SUPPORT
16645 +                                       /*
16646 +                                       ** if callback-out we dont need 
16647 +                                       ** low-cost-routing LCR
16648 +                                       */
16649 +                                   if(!(lp->flags & ISDN_NET_CBOUT) &&
16650 +                                               !(lp->dw_abc_flags & ISDN_DW_ABC_FLAG_NO_LCR)) {
16651 +
16652 +                                               isdn_dw_abc_lcr_call_number(lp,&cmd);
16653 +                                               
16654 +                                               if(lp->dw_abc_lcr_start_request != lp->dw_abc_lcr_end_request) {
16655 +
16656 +                                                       if(dev->net_verbose > 2) {
16657 +
16658 +                                                               printk(KERN_INFO 
16659 +                                       "%s: Waiting for LCR-response from isdnlog %s -> %s...\n",
16660 +                                                                       lp->name,
16661 +                                                                       cmd.parm.setup.eazmsn,
16662 +                                                                       cmd.parm.setup.phone);
16663 +                                                       }
16664 +                                                               
16665 +                                                       anymore = 1;
16666 +                                                       break;
16667 +                                               }
16668 +                                       } 
16669 +
16670 +dw_abc_lcr_next_click:;
16671 +                                       isdn_dw_abc_lcr_clear(lp);
16672 +#endif
16673                                         i = isdn_dc2minor(lp->isdn_device, lp->isdn_channel);
16674                                         if (i >= 0) {
16675                                                 strcpy(dev->num[i], cmd.parm.setup.phone);
16676                                                 dev->usage[i] |= ISDN_USAGE_OUTGOING;
16677                                                 isdn_info_update();
16678                                         }
16679 -                                       printk(KERN_INFO "%s: dialing %d %s... %s\n", lp->name,
16680 -                                              lp->dialretry, cmd.parm.setup.phone,
16681 -                                              (cmd.parm.setup.si1 == 1) ? "DOV" : "");
16682 +#ifdef CONFIG_ISDN_WITH_ABC
16683 +                                       printk(KERN_INFO "%s: dialing %d %s -> %s...\n", lp->name,
16684 +                                              lp->dialretry, 
16685 +                                                  cmd.parm.setup.eazmsn,
16686 +                                                  cmd.parm.setup.phone);
16687 +#ifdef CONFIG_ISDN_WITH_ABC_CONN_ERROR
16688 +                                       if(lp->dw_abc_bchan_errcnt) {
16689 +
16690 +                                               printk(KERN_INFO
16691 +                                                       "%s: Note: bchannel-error-counter is %hd\n",
16692 +                                                       lp->name,
16693 +                                                       lp->dw_abc_bchan_errcnt);
16694 +                                       }
16695 +#endif
16696 +#else
16697 +                                       printk(KERN_INFO "%s: dialing %d %s...\n", lp->name,
16698 +                                              lp->dialretry, cmd.parm.setup.phone);
16699 +#endif
16700                                         lp->dtimer = 0;
16701  #ifdef ISDN_DEBUG_NET_DIAL
16702                                         printk(KERN_DEBUG "dial: d=%d c=%d\n", lp->isdn_device,
16703 @@ -741,6 +1025,10 @@
16704                                 lp->dialstate =
16705                                     (lp->cbdelay &&
16706                                      (lp->flags & ISDN_NET_CBOUT)) ? 12 : 4;
16707 +#ifdef CONFIG_ISDN_WITH_ABC
16708 +                               lp->dw_abc_if_flags &= ~ISDN_DW_ABC_IFFLAG_NODCHAN;
16709 +                               lp->dw_abc_dialstart = jiffies;
16710 +#endif
16711                                 break;
16712                         case 4:
16713                                 /* Wait for D-Channel-connect.
16714 @@ -890,6 +1178,15 @@
16715                 isdn_command(&cmd);
16716                 printk(KERN_INFO "%s: Chargesum is %d\n", lp->name, lp->charge);
16717                 isdn_all_eaz(lp->isdn_device, lp->isdn_channel);
16718 +#ifdef CONFIG_ISDN_WITH_ABC_CONN_ERROR
16719 +               if(lp->dw_abc_bchan_errcnt) {
16720 +
16721 +                       printk(KERN_INFO
16722 +                               "%s: Note: bchannel-error-counter is %hd\n",
16723 +                               lp->name,
16724 +                               lp->dw_abc_bchan_errcnt);
16725 +               }
16726 +#endif
16727         }
16728         isdn_net_unbind_channel(lp);
16729  }
16730 @@ -899,8 +1196,13 @@
16731         unsigned short dest;
16732  } ip_ports;
16733  
16734 +#ifdef CONFIG_ISDN_WITH_ABC
16735 +void
16736 +isdn_net_log_skb_dwabc(struct sk_buff * skb, isdn_net_local * lp,char *reason)
16737 +#else
16738  static void
16739  isdn_net_log_skb(struct sk_buff * skb, isdn_net_local * lp)
16740 +#endif
16741  {
16742         u_char *p = skb->nh.raw; /* hopefully, this was set correctly */
16743         unsigned short proto = ntohs(skb->protocol);
16744 @@ -972,7 +1274,13 @@
16745                                         break;
16746                         }
16747                         printk(KERN_INFO
16748 +#ifdef CONFIG_ISDN_WITH_ABC
16749 +                               "%s %s: %d.%d.%d.%d -> %d.%d.%d.%d%s\n",
16750 +                               (reason == NULL) ? "OPEN" : reason,
16751 +                               (lp != NULL) ? lp->name : "",
16752 +#else
16753                                 "OPEN: %d.%d.%d.%d -> %d.%d.%d.%d%s\n",
16754 +#endif
16755  
16756                                p[12], p[13], p[14], p[15],
16757                                p[16], p[17], p[18], p[19],
16758 @@ -980,7 +1288,13 @@
16759                         break;
16760                 case ETH_P_ARP:
16761                         printk(KERN_INFO
16762 +#ifdef CONFIG_ISDN_WITH_ABC
16763 +                               "%s %s: ARP %d.%d.%d.%d -> *.*.*.* ?%d.%d.%d.%d\n",
16764 +                               (reason == NULL) ? "OPEN" : reason,
16765 +                               (lp != NULL) ? lp->name : "",
16766 +#else
16767                                 "OPEN: ARP %d.%d.%d.%d -> *.*.*.* ?%d.%d.%d.%d\n",
16768 +#endif
16769                                p[14], p[15], p[16], p[17],
16770                                p[24], p[25], p[26], p[27]);
16771                         break;
16772 @@ -1004,11 +1318,22 @@
16773         }
16774  
16775         spin_lock_bh(&lp->xmit_lock);
16776 +
16777         if (!isdn_net_lp_busy(lp)) {
16778 +#ifdef CONFIG_ISDN_WITH_ABC
16779 +               if(!skb_queue_empty(&lp->super_tx_queue)) {
16780 +                       /*
16781 +                       ** don't reverse the frame flow
16782 +                       ** compression need frames in order and maybe other's too
16783 +                       */
16784 +                       skb_queue_tail(&lp->super_tx_queue, skb); 
16785 +                       skb = skb_dequeue(&lp->super_tx_queue);
16786 +               }
16787 +#endif
16788                 isdn_net_writebuf_skb(lp, skb);
16789 -       } else {
16790 -               skb_queue_tail(&lp->super_tx_queue, skb);
16791 -       }
16792 +
16793 +       } else skb_queue_tail(&lp->super_tx_queue, skb);
16794 +
16795         spin_unlock_bh(&lp->xmit_lock);
16796  }
16797  
16798 @@ -1056,7 +1381,6 @@
16799                 printk(KERN_WARNING "%s: HL driver queue full\n", lp->name);
16800                 goto error;
16801         }
16802 -       
16803         lp->transcount += len;
16804         isdn_net_inc_frame_cnt(lp);
16805         return;
16806 @@ -1064,9 +1388,19 @@
16807   error:
16808         dev_kfree_skb(skb);
16809         lp->stats.tx_errors++;
16810 -
16811  }
16812  
16813 +#if 0
16814 +int isdn_net_send_skb(struct net_device *ndev, isdn_net_local * lp,struct sk_buff *skb)
16815 +{
16816 +       if (isdn_net_lp_busy(lp)) {
16817 +               printk(KERN_WARNING "isdn_net_send_skb: HL channel busy\n");
16818 +               return 1;
16819 +       }
16820 +       isdn_net_writebuf_skb(lp, skb);
16821 +       return 0;
16822 +}
16823 +#endif
16824  
16825  /*
16826   *  Helper function for isdn_net_start_xmit.
16827 @@ -1109,7 +1443,54 @@
16828  
16829         /* Reset hangup-timeout */
16830         lp->huptimer = 0; // FIXME?
16831 +#ifdef CONFIG_ISDN_WITH_ABC
16832 +
16833 +       if(test_and_set_bit(ISDN_DW_ABC_BITLOCK_SEND,&lp->dw_abc_bitlocks)) {
16834 +
16835 +               if(dev->net_verbose > 2)
16836 +                       printk(KERN_INFO "%s: isdn_net_xmit  called recursivly\n",lp->name);
16837 +
16838 +               spin_unlock_bh(&lp->xmit_lock);
16839 +               return(1);
16840 +       }
16841 +
16842 +       if(skb != NULL) {
16843 +
16844 +               int l = skb->len;
16845 +               int nl = l;
16846 +
16847 +               if(     lp->p_encap == ISDN_NET_ENCAP_RAWIP &&
16848 +                               (lp->dw_abc_if_flags & ISDN_DW_ABC_IFFLAG_BSDAKTIV)) {
16849 +
16850 +                       if((skb = dwabc_bsd_compress(lp,skb,ndev)) != NULL) {
16851 +
16852 +                               int r = 0;
16853 +                               nl = skb->len;
16854 +                               skb_queue_tail(&lp->super_tx_queue,skb);
16855 +
16856 +                               if(l != nl && (r = isdn_dc2minor(lp->isdn_device,lp->isdn_channel)) >= 0) {
16857 +
16858 +                                       dev->obytes[r] += l - nl;
16859 +                                       lp->stats.tx_bytes += l - nl;
16860 +                               }
16861 +                       }
16862 +
16863 +               } else skb_queue_tail(&lp->super_tx_queue,skb);
16864 +
16865 +               if(lp->p_encap == ISDN_NET_ENCAP_RAWIP) {
16866 +
16867 +                       lp->dw_abc_bsd_snd += l;
16868 +                       lp->dw_abc_bsd_bsd_snd += nl;
16869 +               }
16870 +       }
16871 +       clear_bit(ISDN_DW_ABC_BITLOCK_SEND,&lp->dw_abc_bitlocks);
16872 +
16873 +       while(!isdn_net_lp_busy(lp) && (skb = skb_dequeue(&lp->super_tx_queue)))
16874 +               isdn_net_writebuf_skb(lp, skb);
16875 +
16876 +#else
16877         isdn_net_writebuf_skb(lp, skb);
16878 +#endif
16879         spin_unlock_bh(&lp->xmit_lock);
16880  
16881         /* the following stuff is here for backwards compatibility.
16882 @@ -1143,6 +1524,69 @@
16883  
16884         return retv;
16885  
16886 +#if 0
16887 +       if (lp->cps > lp->triggercps) {
16888 +               /* Device overloaded */
16889 +
16890 +               /*
16891 +                * Packet-delivery via round-robin over master
16892 +                * and all connected slaves.
16893 +                */
16894 +               if (lp->master) {
16895 +                       /* Slaves always deliver themselves */
16896 +                       spin_lock_bh(&lp->xmit_lock);
16897 +                       if (!isdn_net_lp_busy(lp)) {
16898 +                               isdn_net_writebuf_skb(lp, skb);
16899 +                               ret = 0;
16900 +                       } else {
16901 +                               isdn_net_device_stop_queue(lp);
16902 +                               ret = 1;
16903 +                       }
16904 +                       ret = isdn_net_send_skb(ndev, lp, skb);
16905 +                       spin_unlock_bh(&lp->xmit_lock);
16906 +               } else {
16907 +                       isdn_net_local *slp = (isdn_net_local *) (lp->srobin->priv);
16908 +                       /* Master delivers via srobin and maintains srobin */
16909 +                       if (lp->srobin == ndev) {
16910 +                               spin_lock_bh(&lp->xmit_lock);
16911 +                               ret = isdn_net_send_skb(ndev, lp, skb);
16912 +                               spin_unlock_bh(&lp->xmit_lock);
16913 +                       } else {
16914 +                               ret = isdn_net_start_xmit(skb, lp->srobin);
16915 +                       }
16916 +                       lp->srobin = (slp->slave) ? slp->slave : ndev;
16917 +                       slp = (isdn_net_local *) (lp->srobin->priv);
16918 +                       if (!((slp->flags & ISDN_NET_CONNECTED) && (slp->dialstate == 0)))
16919 +                               lp->srobin = ndev;
16920 +               }
16921 +               /* Slave-startup using delay-variable */
16922 +               if (lp->slave) {
16923 +                       if (!lp->sqfull) {
16924 +                               /* First time overload: set timestamp only */
16925 +                               lp->sqfull = 1;
16926 +                               lp->sqfull_stamp = jiffies;
16927 +                       } else {
16928 +                               /* subsequent overload: if slavedelay exceeded, start dialing */
16929 +                               if ((jiffies - lp->sqfull_stamp) > lp->slavedelay)
16930 +                                       isdn_net_force_dial_lp((isdn_net_local *) lp->slave->priv);
16931 +                       }
16932 +               }
16933 +       } else {
16934 +               /* Not overloaded, deliver locally */
16935 +               spin_lock_bh(&lp->xmit_lock);
16936 +               if (!isdn_net_lp_busy(lp)) {
16937 +                       isdn_net_writebuf_skb(lp, skb);
16938 +                       ret = 0;
16939 +               } else {
16940 +                       isdn_net_device_stop_queue(lp);
16941 +                       ret = 1;
16942 +               }
16943 +               spin_unlock_bh(&lp->xmit_lock);
16944 +               if (lp->sqfull && ((jiffies - lp->sqfull_stamp) > (lp->slavedelay + (10 * HZ))))
16945 +                       lp->sqfull = 0;
16946 +       }
16947 +       return ret;
16948 +#endif
16949  }
16950  
16951  static void
16952 @@ -1161,6 +1605,7 @@
16953  }
16954  
16955  
16956 +#ifndef COMPAT_NO_SOFTNET
16957  void isdn_net_tx_timeout(struct net_device * ndev)
16958  {
16959         isdn_net_local *lp = (isdn_net_local *) ndev->priv;
16960 @@ -1188,19 +1633,206 @@
16961         ndev->trans_start = jiffies;
16962         netif_wake_queue(ndev);
16963  }
16964 +#endif
16965  
16966  /*
16967   * Try sending a packet.
16968   * If this interface isn't connected to a ISDN-Channel, find a free channel,
16969   * and start dialing.
16970   */
16971 +#ifdef CONFIG_ISDN_WITH_ABC
16972 +static int dwabc_isdn_net_start_xmit(struct sk_buff *,struct net_device *);
16973 +
16974 +static int isdn_net_start_xmit(struct sk_buff *skb, struct net_device *ndev)
16975 +{
16976 +       if(skb == NULL || ndev == NULL)
16977 +               return(dwabc_isdn_net_start_xmit(skb,ndev));
16978 +#ifdef CONFIG_ISDN_WITH_ABC_UDP_CHECK
16979 +       if(!(((isdn_net_local *)ndev->priv)->dw_abc_flags & 
16980 +               ISDN_DW_ABC_FLAG_NO_UDP_CHECK)) {
16981 +
16982 +               if(dw_abc_udp_test(skb,ndev)) {
16983 +                       dev_kfree_skb(skb);
16984 +                       return(0);
16985 +               }
16986 +       }
16987 +#endif
16988 +       return(dwabc_isdn_net_start_xmit(skb,ndev));
16989 +}
16990 +
16991 +
16992 +#ifdef CONFIG_ISDN_WITH_ABC
16993 +int isdn_auto_dial_helper(     isdn_net_local *lp,
16994 +                                                       struct sk_buff *skb,
16995 +                                                       int dm_manual_allowed)
16996 +/**********************************************************************
16997 +       return's:
16998 +               -1              dial not allowed or impossible
16999 +               0               interface is connected
17000 +               1               dial is started
17001 +***********************************************************************/
17002 +{
17003 +       int retw = -1;
17004 +       int chi;
17005 +       ulong flags;
17006 +       char *errmsg = NULL;
17007 +
17008 +#ifdef ISDN_DEBUG_NET_DUMP
17009 +       {
17010 +               char *buf = skb->data;
17011 +               isdn_dumppkt("S:", buf, skb->len, 40);
17012 +       }
17013 +#endif
17014 +       if (lp->flags & ISDN_NET_CONNECTED) 
17015 +               return(0);
17016 +
17017 +       save_flags(flags);
17018 +       cli();
17019 +
17020 +       do {
17021 +
17022 +               /* Log packet, which triggered dialing */
17023 +               if (dev->net_verbose)
17024 +                       isdn_net_log_skb(skb, lp);
17025 +               /* only do autodial if allowed by config */
17026 +               if (!(ISDN_NET_DIALMODE(*lp) == ISDN_NET_DM_AUTO)) {
17027 +                       errmsg = "dial rejected: interface not in dialmode `auto'";
17028 +
17029 +                       if(dm_manual_allowed &&
17030 +                               !(ISDN_NET_DIALMODE(*lp) == ISDN_NET_DM_MANUAL)) {
17031 +
17032 +                               errmsg = 
17033 +                               "dial rejected: interface not in dialmode `auto or manual'";
17034 +                       }
17035 +                       break;
17036 +               }
17037 +
17038 +               if (!lp->phone[1]) {
17039 +
17040 +                       errmsg = "No phone number";
17041 +                       break;
17042 +               }
17043 +
17044 +               if(lp->dialwait_timer <= 0) {
17045 +
17046 +                       if(     lp->dialstarted > 0 &&
17047 +                               lp->dialtimeout > 0 && 
17048 +                               jiffies < (lp->dialstarted + lp->dialtimeout + lp->dialwait)) {
17049 +
17050 +                               lp->dialwait_timer = 
17051 +                                       lp->dialstarted + lp->dialtimeout + lp->dialwait;
17052 +                       }
17053 +               }
17054 +
17055 +               if(lp->dialwait_timer > 0) {
17056 +
17057 +                       if(jiffies < lp->dialwait_timer) {
17058 +
17059 +                               errmsg = "dial rejected: retry-time not reached";
17060 +                               break;
17061 +
17062 +                       } else lp->dialwait_timer = 0;
17063 +               }
17064 +#ifdef CONFIG_ISDN_WITH_ABC
17065 +               if(isdn_dwabc_is_interface_disabled(lp))
17066 +                       break;
17067 +#endif
17068 +               /* Grab a free ISDN-Channel */
17069 +               if (((chi =
17070 +                               isdn_get_free_channel(
17071 +                                       ISDN_USAGE_NET,
17072 +                                       lp->l2_proto,
17073 +                                       lp->l3_proto,
17074 +                                       lp->pre_device,
17075 +                                       lp->pre_channel,
17076 +#ifdef CONFIG_ISDN_WITH_ABC_OUTGOING_EAZ
17077 +                                       (*lp->dw_out_msn) ? lp->dw_out_msn :
17078 +#endif
17079 +                                       lp->msn)
17080 +                       ) < 0) &&
17081 +                       ((chi =
17082 +                               isdn_get_free_channel(
17083 +                                       ISDN_USAGE_NET,
17084 +                                       lp->l2_proto,
17085 +                                       lp->l3_proto,
17086 +                                       lp->pre_device,
17087 +                                       lp->pre_channel^1,
17088 +#ifdef CONFIG_ISDN_WITH_ABC_OUTGOING_EAZ
17089 +                                       (*lp->dw_out_msn) ? lp->dw_out_msn :
17090 +#endif
17091 +                                       lp->msn)
17092 +                       ) < 0)) {
17093 +
17094 +                               errmsg = "No channel";
17095 +                               break;
17096 +               }
17097 +
17098 +               lp->dialstate = 1;
17099 +               /* Connect interface with channel */
17100 +               isdn_net_bind_channel(lp, chi);
17101 +#ifdef CONFIG_ISDN_PPP
17102 +               if (lp->p_encap == ISDN_NET_ENCAP_SYNCPPP) {
17103 +                       /* no 'first_skb' handling for syncPPP */
17104 +                       if (isdn_ppp_bind(lp) < 0) {
17105 +                               isdn_net_unbind_channel(lp);
17106 +                               break;
17107 +                       }
17108 +
17109 +                       isdn_net_dial();        /* Initiate dialing */
17110 +                       netif_stop_queue(&lp->netdev->dev);
17111 +                       retw = 1;
17112 +                       break;
17113 +                       /* let upper layer requeue skb packet */
17114 +               }
17115 +#endif
17116 +               /* Initiate dialing */
17117 +               isdn_net_dial();
17118 +               isdn_net_device_stop_queue(lp);
17119 +               retw = 1;
17120 +
17121 +       } while(0);
17122 +
17123 +       if(retw < 0 && errmsg != NULL)
17124 +               isdn_net_unreachable(&lp->netdev->dev, skb, errmsg);
17125 +
17126 +       restore_flags(flags);
17127 +       return(retw);
17128 +}
17129 +#endif
17130 +
17131 +
17132 +
17133 +static int
17134 +dwabc_isdn_net_start_xmit(struct sk_buff *skb, struct net_device *ndev)
17135 +#else
17136  static int
17137  isdn_net_start_xmit(struct sk_buff *skb, struct net_device *ndev)
17138 +#endif
17139  {
17140         isdn_net_local *lp = (isdn_net_local *) ndev->priv;
17141  #ifdef CONFIG_ISDN_X25
17142         struct concap_proto * cprot = lp -> netdev -> cprot;
17143  #endif
17144 +#ifdef COMPAT_NO_SOFTNET 
17145 +       /* some comment as with the softnet TX timeout
17146 +          when this happens, it's a bug in the HL card driver
17147 +          and should be fixed there, so we can supposedly get rid of 
17148 +          this here at all. 
17149 +          I added a debugging message to find out if it ever occurs --KG
17150 +       */
17151 +
17152 +       if (ndev->tbusy) {
17153 +               if (jiffies - ndev->trans_start < ISDN_NET_TX_TIMEOUT)
17154 +                       return 1;
17155 +               if (!lp->dialstate){
17156 +                       lp->stats.tx_errors++;
17157 +                       printk(KERN_WARNING "isdn_tx_timeout dev %s dialstate %d\n",
17158 +                               ndev->name, lp->dialstate);
17159 +               }
17160 +               ndev->trans_start = jiffies;
17161 +               netif_wake_queue(ndev);
17162 +       }
17163 +#endif
17164  #ifdef CONFIG_ISDN_X25
17165  /* At this point hard_start_xmit() passes control to the encapsulation
17166     protocol (if present).
17167 @@ -1220,6 +1852,40 @@
17168         } else
17169  #endif
17170         /* auto-dialing xmit function */
17171 +#ifdef CONFIG_ISDN_WITH_ABC
17172 +       {
17173 +               int r;
17174 +
17175 +               isdn_net_adjust_hdr(skb, ndev);
17176 +
17177 +               if(!(r = isdn_auto_dial_helper(lp,skb,0))) {
17178 +
17179 +                       /* 
17180 +                       ** Device is connected to an ISDN channel
17181 +                       */ 
17182 +                       ndev->trans_start = jiffies;
17183 +
17184 +                       if (!lp->dialstate) {
17185 +
17186 +                               /* 
17187 +                               ** ISDN connection is established, try sending 
17188 +                               */
17189 +                               r = isdn_net_xmit(ndev, skb);
17190 +
17191 +                       } else r = 1;
17192 +
17193 +                       if(r)
17194 +                               netif_stop_queue(ndev);
17195 +
17196 +               } else if(r < 0) {
17197 +
17198 +                       dev_kfree_skb(skb);
17199 +                       r = 0;
17200 +               }
17201 +
17202 +               return(r);
17203 +       }
17204 +#else
17205         {
17206  #ifdef ISDN_DEBUG_NET_DUMP
17207                 u_char *buf;
17208 @@ -1256,6 +1922,14 @@
17209                                         } else
17210                                                 lp->dialwait_timer = 0;
17211                                 }
17212 +#ifdef CONFIG_ISDN_WITH_ABC
17213 +                               if(isdn_dwabc_is_interface_disabled(lp)) {
17214 +
17215 +                                       dev_kfree_skb(skb);
17216 +                                       restore_flags(flags);
17217 +                                       return(0);
17218 +                               }
17219 +#endif
17220                                 /* Grab a free ISDN-Channel */
17221                                 if (((chi =
17222                                      isdn_get_free_channel(
17223 @@ -1264,6 +1938,9 @@
17224                                                         lp->l3_proto,
17225                                                         lp->pre_device,
17226                                                         lp->pre_channel,
17227 +#ifdef CONFIG_ISDN_WITH_ABC_OUTGOING_EAZ
17228 +                                                       (*lp->dw_out_msn) ? lp->dw_out_msn : 
17229 +#endif
17230                                                         lp->msn)
17231                                                         ) < 0) &&
17232                                         ((chi =
17233 @@ -1273,6 +1950,9 @@
17234                                                         lp->l3_proto,
17235                                                         lp->pre_device,
17236                                                         lp->pre_channel^1,
17237 +#ifdef CONFIG_ISDN_WITH_ABC_OUTGOING_EAZ
17238 +                                                       (*lp->dw_out_msn) ? lp->dw_out_msn :
17239 +#endif
17240                                                         lp->msn)
17241                                                         ) < 0)) {
17242                                         restore_flags(flags);
17243 @@ -1296,16 +1976,6 @@
17244                                                 restore_flags(flags);
17245                                                 return 0;       /* STN (skb to nirvana) ;) */
17246                                         }
17247 -#ifdef CONFIG_IPPP_FILTER
17248 -                                       if (isdn_ppp_autodial_filter(skb, lp)) {
17249 -                                               isdn_ppp_free(lp);
17250 -                                               isdn_net_unbind_channel(lp);
17251 -                                               restore_flags(flags);
17252 -                                               isdn_net_unreachable(ndev, skb, "dial rejected: packet filtered");
17253 -                                               dev_kfree_skb(skb);
17254 -                                               return 0;
17255 -                                       }
17256 -#endif
17257                                         restore_flags(flags);
17258                                         isdn_net_dial();        /* Initiate dialing */
17259                                         netif_stop_queue(ndev);
17260 @@ -1337,6 +2007,7 @@
17261                 }
17262         }
17263         return 1;
17264 +#endif
17265  }
17266  
17267  /*
17268 @@ -1356,6 +2027,9 @@
17269         if( cprot && cprot -> pops ) cprot -> pops -> close( cprot );
17270  #endif
17271         netif_stop_queue(dev);
17272 +#ifdef COMPAT_NO_SOFTNET
17273 +       dev->start = 0;
17274 +#endif
17275         if ((p = (((isdn_net_local *) dev->priv)->slave))) {
17276                 /* If this interface has slaves, stop them also */
17277                 while (p) {
17278 @@ -1776,6 +2450,10 @@
17279         }
17280  
17281         switch (type) {
17282 +       case CISCO_TYPE_INET:
17283 +               skb->protocol = htons(ETH_P_IP);
17284 +               netif_rx(skb);
17285 +               break;
17286         case CISCO_TYPE_SLARP:
17287                 isdn_net_ciscohdlck_slarp_in(lp, skb);
17288                 goto out_free;
17289 @@ -1785,11 +2463,11 @@
17290                                 "\"no cdp enable\" on cisco.\n", lp->name);
17291                 goto out_free;
17292         default:
17293 -               /* no special cisco protocol */
17294 -               skb->protocol = htons(type);
17295 -               netif_rx(skb);
17296 -               return;
17297 +               printk(KERN_WARNING "%s: Unknown Cisco type 0x%04x\n",
17298 +                      lp->name, type);
17299 +               goto out_free;
17300         }
17301 +       return;
17302  
17303   out_free:
17304         kfree_skb(skb);
17305 @@ -1803,9 +2481,19 @@
17306  {
17307         isdn_net_local *lp = (isdn_net_local *) ndev->priv;
17308         isdn_net_local *olp = lp;       /* original 'lp' */
17309 +#ifdef CONFIG_ISDN_PPP
17310 +       int proto = PPP_PROTOCOL(skb->data);
17311 +#endif
17312  #ifdef CONFIG_ISDN_X25
17313         struct concap_proto *cprot = lp -> netdev -> cprot;
17314  #endif
17315 +#ifdef CONFIG_ISDN_WITH_ABC
17316 +       struct net_device *ondev = ndev;
17317 +#ifdef CONFIG_ISDN_WITH_ABC_RCV_NO_HUPTIMER
17318 +       ulong lp_huptimer  = 0;
17319 +       ulong olp_huptimer = 0;
17320 +#endif
17321 +#endif
17322         lp->transcount += skb->len;
17323  
17324         lp->stats.rx_packets++;
17325 @@ -1819,6 +2507,10 @@
17326                 lp->stats.rx_packets++;
17327                 lp->stats.rx_bytes += skb->len;
17328         }
17329 +#ifdef CONFIG_ISDN_WITH_ABC_RCV_NO_HUPTIMER
17330 +       lp_huptimer  = lp->huptimer;
17331 +       olp_huptimer = olp->huptimer;
17332 +#endif
17333         skb->dev = ndev;
17334         skb->pkt_type = PACKET_HOST;
17335         skb->mac.raw = skb->data;
17336 @@ -1840,9 +2532,40 @@
17337                         /* Fall through */
17338                 case ISDN_NET_ENCAP_RAWIP:
17339                         /* RAW-IP without MAC-Header */
17340 +#ifdef CONFIG_ISDN_WITH_ABC
17341 +                       if(olp->p_encap == ISDN_NET_ENCAP_RAWIP) {
17342 +
17343 +                               ushort l = skb->len;
17344 +                               short r = 0;
17345 +
17346 +                               olp->dw_abc_bsd_bsd_rcv += l;
17347 +
17348 +                               if((skb = dwabc_bsd_rx_pkt(olp,skb,ondev)) == NULL) {
17349 +
17350 +                                       olp->dw_abc_bsd_rcv += l;
17351 +                                       return;
17352 +                               }
17353 +
17354 +                               olp->dw_abc_bsd_rcv += skb->len;
17355 +
17356 +                               if(     l != skb->len && 
17357 +                                       (r=isdn_dc2minor(olp->isdn_device,olp->isdn_channel))>=0) {
17358 +
17359 +                                       dev->ibytes[r] += skb->len - l;
17360 +                                       olp->stats.rx_bytes += skb->len - l;
17361 +
17362 +                                       if(olp != lp)
17363 +                                               lp->stats.rx_bytes += skb->len - l;
17364 +                               }
17365 +                       }
17366 +#endif
17367                         olp->huptimer = 0;
17368                         lp->huptimer = 0;
17369                         skb->protocol = htons(ETH_P_IP);
17370 +#ifdef CONFIG_ISDN_WITH_ABC_CONN_ERROR
17371 +                       if(isdn_dwabc_conerr_ippktok(skb))
17372 +                               lp->dw_abc_bchan_errcnt = 0;
17373 +#endif
17374                         break;
17375                 case ISDN_NET_ENCAP_CISCOHDLCK:
17376                         isdn_net_ciscohdlck_receive(lp, skb);
17377 @@ -1862,8 +2585,22 @@
17378                         break;
17379  #ifdef CONFIG_ISDN_PPP
17380                 case ISDN_NET_ENCAP_SYNCPPP:
17381 -                       /* huptimer is done in isdn_ppp_push_higher */
17382 +                       /*
17383 +                        * If encapsulation is syncppp, don't reset
17384 +                        * huptimer on LCP packets.
17385 +                        */
17386 +                       if (proto != PPP_LCP) {
17387 +                               olp->huptimer = 0;
17388 +                               lp->huptimer = 0;
17389 +                       }
17390                         isdn_ppp_receive(lp->netdev, olp, skb);
17391 +#ifdef CONFIG_ISDN_WITH_ABC_RCV_NO_HUPTIMER
17392 +                       if(olp->dw_abc_flags & ISDN_DW_ABC_FLAG_RCV_NO_HUPTIMER) {
17393 +
17394 +                               lp->huptimer = lp_huptimer + 1;
17395 +                               olp->huptimer = olp_huptimer+ 1;
17396 +                       }
17397 +#endif
17398                         return;
17399  #endif
17400  
17401 @@ -1873,6 +2610,15 @@
17402                         if(cprot) if(cprot -> pops)
17403                                 if( cprot -> pops -> data_ind){
17404                                         cprot -> pops -> data_ind(cprot,skb);
17405 +#ifdef CONFIG_ISDN_WITH_ABC_CONN_ERROR
17406 +                                       lp->dw_abc_bchan_errcnt = 0;
17407 +#ifdef CONFIG_ISDN_WITH_ABC_RCV_NO_HUPTIMER
17408 +                                       if(olp->dw_abc_flags & ISDN_DW_ABC_FLAG_RCV_NO_HUPTIMER) {
17409 +                                               lp->huptimer = lp_huptimer;
17410 +                                               olp->huptimer = olp_huptimer;
17411 +                                       }
17412 +#endif
17413 +#endif
17414                                         return;
17415                                 };
17416  #endif /* CONFIG_ISDN_X25 */
17417 @@ -1882,6 +2628,15 @@
17418                         return;
17419         }
17420  
17421 +#ifdef CONFIG_ISDN_WITH_ABC
17422 +#ifdef CONFIG_ISDN_WITH_ABC_RCV_NO_HUPTIMER
17423 +       if(olp->dw_abc_flags & ISDN_DW_ABC_FLAG_RCV_NO_HUPTIMER) {
17424 +
17425 +               lp->huptimer = lp_huptimer;
17426 +               olp->huptimer = olp_huptimer;
17427 +       }
17428 +#endif
17429 +#endif
17430         netif_rx(skb);
17431         return;
17432  }
17433 @@ -2160,8 +2915,10 @@
17434         isdn_net_phone *n;
17435         ulong flags;
17436         char nr[32];
17437 -       char *my_eaz;
17438 -
17439 +#ifdef CONFIG_ISDN_WITH_ABC
17440 +       if(dev->net_verbose > 2)
17441 +               printk(KERN_DEBUG "n_fi: di=%d ch=%d idx=%d usg=0x%04X\n", di, ch, idx,dev->usage[idx]);
17442 +#endif
17443         /* Search name in netdev-chain */
17444         save_flags(flags);
17445         cli();
17446 @@ -2180,17 +2937,15 @@
17447                 eaz = setup->eazmsn;
17448         if (dev->net_verbose > 1)
17449                 printk(KERN_INFO "isdn_net: call from %s,%d,%d -> %s\n", nr, si1, si2, eaz);
17450 -        /* Accept DATA and VOICE calls at this stage
17451 -        local eaz is checked later for allowed call types */
17452 -        if ((si1 != 7) && (si1 != 1)) {
17453 -                restore_flags(flags);
17454 -                if (dev->net_verbose > 1)
17455 -                        printk(KERN_INFO "isdn_net: Service-Indicator not 1 or 7, ignored\n");
17456 -                return 0;
17457 -        }
17458 -
17459 -n = (isdn_net_phone *) 0;
17460 -p = dev->netdev;
17461 +       /* Accept only calls with Si1 = 7 (Data-Transmission) */
17462 +       if (si1 != 7) {
17463 +               restore_flags(flags);
17464 +               if (dev->net_verbose > 1)
17465 +                       printk(KERN_INFO "isdn_net: Service-Indicator not 7, ignored\n");
17466 +               return 0;
17467 +       }
17468 +       n = (isdn_net_phone *) 0;
17469 +       p = dev->netdev;
17470         ematch = wret = swapped = 0;
17471  #ifdef ISDN_DEBUG_NET_ICALL
17472         printk(KERN_DEBUG "n_fi: di=%d ch=%d idx=%d usg=%d\n", di, ch, idx,
17473 @@ -2210,25 +2965,8 @@
17474                                 break;
17475                 }
17476                 swapped = 0;
17477 -                /* check acceptable call types for DOV */
17478 -                my_eaz = isdn_map_eaz2msn(lp->msn, di);
17479 -                if (si1 == 1) { /* it's a DOV call, check if we allow it */
17480 -                        if (*my_eaz == 'v' || *my_eaz == 'V' ||
17481 -                           *my_eaz == 'b' || *my_eaz == 'B')
17482 -                                my_eaz++; /* skip to allow a match */
17483 -                        else
17484 -                                my_eaz = 0; /* force non match */
17485 -                } else { /* it's a DATA call, check if we allow it */
17486 -                        if (*my_eaz == 'b' || *my_eaz == 'B')
17487 -                                my_eaz++; /* skip to allow a match */
17488 -                }
17489 -                if (my_eaz)
17490 -                        matchret = isdn_msncmp(eaz, my_eaz);
17491 -                else
17492 -                        matchret = 1;
17493 -                if (!matchret)
17494 -                        ematch = 1;
17495 -
17496 +               if (!(matchret = isdn_msncmp(eaz, isdn_map_eaz2msn(lp->msn, di))))
17497 +                       ematch = 1;
17498                 /* Remember if more numbers eventually can match */
17499                 if (matchret > wret)
17500                         wret = matchret;
17501 @@ -2236,17 +2974,122 @@
17502                 printk(KERN_DEBUG "n_fi: if='%s', l.msn=%s, l.flags=%d, l.dstate=%d\n",
17503                        lp->name, lp->msn, lp->flags, lp->dialstate);
17504  #endif
17505 +#ifdef CONFIG_ISDN_WITH_ABC_CALLB
17506 +               if ((!matchret) &&                                        /* EAZ is matching   */
17507 +                   (((!(lp->flags & ISDN_NET_CONNECTED)) &&              /* but not connected */
17508 +                     (USG_NONE(dev->usage[idx]))) ||                     /* and ch. unused or */
17509 +                    (lp->dialstate == 4) || (lp->dialstate == 12) ||           /* if dialing        */
17510 +                         ((lp->flags & ISDN_NET_CBOUT) != 0 &&                         /* init a callback      */
17511 +                         lp->outgoing != 0 )))
17512 +
17513 +               /*
17514 +               ** we dont stop call's anymore (both sides call's syncron)
17515 +               ** it will be problem in any case.
17516 +               ** both sides will make the same.
17517 +               ** i try later to make a switch (check the phon-numbers)
17518 +               ** to detect with side must be stop the call.
17519 +               */
17520 +#else
17521                 if ((!matchret) &&                                        /* EAZ is matching   */
17522                     (((!(lp->flags & ISDN_NET_CONNECTED)) &&              /* but not connected */
17523                       (USG_NONE(dev->usage[idx]))) ||                     /* and ch. unused or */
17524                      ((((lp->dialstate == 4) || (lp->dialstate == 12)) && /* if dialing        */
17525                        (!(lp->flags & ISDN_NET_CALLBACK)))                /* but no callback   */
17526                      )))
17527 +#endif
17528                          {
17529  #ifdef ISDN_DEBUG_NET_ICALL
17530                         printk(KERN_DEBUG "n_fi: match1, pdev=%d pch=%d\n",
17531                                lp->pre_device, lp->pre_channel);
17532  #endif
17533 +#ifdef CONFIG_ISDN_WITH_ABC
17534 +#ifdef CONFIG_ISDN_WITH_ABC_CALLB
17535 +                       {
17536 +                               int use_this_call = 0;
17537 +
17538 +                               if(!(lp->flags & ISDN_NET_CBOUT) && ((lp->dialstate == 4) || (lp->dialstate == 12))) {
17539 +
17540 +                                       /*
17541 +                                       ** searching for a diff. in the calling-number and the EAZ
17542 +                                       ** the remote will make the same
17543 +                                       */
17544 +
17545 +                                       char *pnr = nr;
17546 +                                       char *pea = eaz;
17547 +
17548 +                                       for(;*pnr;pnr++);
17549 +                                       for(;*pea;pea++);
17550 +                                       for(pnr--,pea--;pnr >= nr && pea >= eaz && *pea != *pnr;pnr--,pea--);
17551 +
17552 +                                       if(pnr < nr || pea < eaz || *pea > *pnr) {
17553 +
17554 +                                               p = (isdn_net_dev *) p->next;
17555 +                                               continue;
17556 +                                       }
17557 +
17558 +                                       use_this_call = 1;
17559 +                               }
17560 +                               
17561 +                               if( use_this_call || 
17562 +                                       ((lp->flags & ISDN_NET_CBOUT) && (lp->flags & ISDN_NET_CONNECTED))) {
17563 +
17564 +                                       /*
17565 +                                       ** the incoming call was to quick.
17566 +                                       ** the callback-delay-time ist not reached.
17567 +                                       ** in that case we can stop the call
17568 +                                       */
17569 +
17570 +                                       if(lp->isdn_device > -1 && lp->isdn_channel > -1) {
17571 +
17572 +                                               int minor = isdn_dc2minor(lp->isdn_device,lp->isdn_channel);
17573 +
17574 +                                               if(lp->isdn_device != di || lp->isdn_channel != ch) {
17575 +
17576 +                                                       isdn_ctrl cmd;
17577 +
17578 +                                                       memset((void *)&cmd,0,sizeof(cmd));
17579 +                                                       cmd.driver = lp->isdn_device;
17580 +                                                       cmd.command = ISDN_CMD_HANGUP;
17581 +                                                       cmd.arg = lp->isdn_channel;
17582 +                                                       (void) dev->drv[cmd.driver]->interface->command(&cmd);
17583 +                                                       isdn_all_eaz(lp->isdn_device, lp->isdn_channel);
17584 +
17585 +                                                       if(dev->net_verbose > 1) {
17586 +
17587 +                                                               printk(KERN_INFO 
17588 +                               "%s: found outgoing call hangup old call on di %d ch %d\n",
17589 +                                                                       lp->name,lp->isdn_device,lp->isdn_channel);
17590 +                                                       }
17591 +
17592 +                                               } else if (dev->net_verbose > 1) {
17593 +
17594 +                                                       printk(KERN_INFO "%s: found outgoing call on same di %d ch %d\n",
17595 +                                                               lp->name,lp->isdn_device,lp->isdn_channel);
17596 +                                               }
17597 +
17598 +                                               if(minor >= 0) {
17599 +
17600 +                                                       dev->rx_netdev[minor] = NULL;
17601 +                                                       dev->st_netdev[minor] = NULL;
17602 +                                               }
17603 +
17604 +                                               isdn_free_channel(lp->isdn_device,
17605 +                                                       lp->isdn_channel, ISDN_USAGE_NET);
17606 +
17607 +                                       } else if (dev->net_verbose > 1) {
17608 +
17609 +                                               printk(KERN_INFO "%s: found outgoing call reset callstate \n",lp->name);
17610 +                                       }
17611 +
17612 +                                       lp->flags &= ~ISDN_NET_CONNECTED;
17613 +                                       lp->isdn_device = -1;
17614 +                                       lp->isdn_channel = -1;
17615 +                                       lp->dtimer = 0;
17616 +                                       lp->dialstate = 0;
17617 +                               }
17618 +                       }
17619 +#endif
17620 +#endif
17621                         if (dev->usage[idx] & ISDN_USAGE_EXCLUSIVE) {
17622                                 if ((lp->pre_channel != ch) ||
17623                                     (lp->pre_device != di)) {
17624 @@ -2375,6 +3218,12 @@
17625                                                 continue;
17626                                         }
17627                                 } 
17628 +#ifdef CONFIG_ISDN_WITH_ABC_CONN_ERROR
17629 +                               if(isdn_dwabc_is_interface_disabled(lp)) {
17630 +                                       restore_flags(flags);
17631 +                                       return 3;
17632 +                               }
17633 +#endif
17634                                 if (lp->flags & ISDN_NET_CALLBACK) {
17635                                         int chi;
17636                                         /*
17637 @@ -2427,6 +3276,47 @@
17638                                         restore_flags(flags);
17639                                         return 0;
17640                                 } else {
17641 +#ifdef CONFIG_ISDN_WITH_ABC_CALLB
17642 +                                       {
17643 +                                       /*
17644 +                                       ** this is a sanity-check.
17645 +                                       ** check for double use (device and channel)
17646 +                                       ** will be very near to a kernel-crash in that case
17647 +                                       */
17648 +                                       isdn_net_dev *sp = dev->netdev;
17649 +                                       int s_shl;
17650 +                                       isdn_net_local *ml;
17651 +
17652 +                                       for(s_shl=0; s_shl < 2048 && sp != NULL; sp = (isdn_net_dev *)sp->next, s_shl++) {
17653 +
17654 +                                               if(sp == p || (ml = sp->local) == NULL)
17655 +                                                       continue;
17656 +
17657 +                                               if(ml->isdn_device != di || ml->isdn_channel != ch)
17658 +                                                       continue;
17659 +
17660 +                                               if(ml->dialstate != 4 && ml->dialstate != 12) {
17661 +
17662 +                                                       /*
17663 +                                                       ** wrong situation
17664 +                                                       */
17665 +                                                       break;
17666 +                                               }
17667 +
17668 +                                               isdn_net_unbind_channel(ml);
17669 +                                       }
17670 +
17671 +                                       if(sp != NULL) {
17672 +
17673 +                                               printk(KERN_DEBUG
17674 +"%s: call from %s -> %s (drv %d chan %d duplicated with %s) \n",
17675 +                                                       lp->name, nr, eaz,di,ch,
17676 +                                                       sp->local->name );
17677 +
17678 +                                               restore_flags(flags);
17679 +                                               return 3;
17680 +                                       }}
17681 +#endif
17682                                         printk(KERN_DEBUG "%s: call from %s -> %s accepted\n", lp->name, nr,
17683                                                eaz);
17684                                         /* if this interface is dialing, it does it probably on a different
17685 @@ -2516,7 +3406,11 @@
17686                                                         lp->l3_proto,
17687                                                         lp->pre_device,
17688                                                         lp->pre_channel,
17689 +#ifdef CONFIG_ISDN_WITH_ABC_OUTGOING_EAZ
17690 +                                                       (*lp->dw_out_msn) ? lp->dw_out_msn : lp->msn)
17691 +#else
17692                                                         lp->msn)
17693 +#endif
17694                                                         ) < 0) {
17695                                 printk(KERN_WARNING "isdn_net_force_dial: No channel for %s\n", lp->name);
17696                                 restore_flags(flags);
17697 @@ -2599,7 +3493,11 @@
17698                 strcpy(netdev->local->name, "         ");
17699         else
17700                 strcpy(netdev->local->name, name);
17701 +#ifdef COMPAT_NO_SOFTNET
17702 +       netdev->dev.name = netdev->local->name;
17703 +#else
17704         strcpy(netdev->dev.name, netdev->local->name);
17705 +#endif
17706         netdev->dev.priv = netdev->local;
17707         netdev->dev.init = isdn_net_init;
17708         netdev->local->p_encap = ISDN_NET_ENCAP_RAWIP;
17709 @@ -2617,11 +3515,13 @@
17710                 ((isdn_net_local *) q->priv)->slave = &(netdev->dev);
17711         } else {
17712                 /* Device shall be a master */
17713 +#ifndef COMPAT_NO_SOFTNET
17714                 /*
17715                  * Watchdog timer (currently) for master only.
17716                  */
17717                 netdev->dev.tx_timeout = isdn_net_tx_timeout;
17718                 netdev->dev.watchdog_timeo = ISDN_NET_TX_TIMEOUT;
17719 +#endif
17720                 if (register_netdev(&netdev->dev) != 0) {
17721                         printk(KERN_WARNING "isdn_net: Could not register net-device\n");
17722                         kfree(netdev->local);
17723 @@ -2658,6 +3558,9 @@
17724         netdev->local->hupflags = ISDN_INHUP;   /* Do hangup even on incoming calls */
17725         netdev->local->onhtime = 10;    /* Default hangup-time for saving costs
17726            of those who forget configuring this */
17727 +#ifdef CONFIG_ISDN_WITH_ABC 
17728 +       netdev->local->dw_abc_old_onhtime = netdev->local->onhtime;
17729 +#endif
17730         netdev->local->dialmax = 1;
17731         netdev->local->flags = ISDN_NET_CBHUP | ISDN_NET_DM_MANUAL;     /* Hangup before Callback, manual dial */
17732         netdev->local->cbdelay = 25;    /* Wait 5 secs before Callback */
17733 @@ -2831,7 +3734,6 @@
17734  
17735                         /* If binding is exclusive, try to grab the channel */
17736                         save_flags(flags);
17737 -                       cli();
17738                         if ((i = isdn_get_free_channel(ISDN_USAGE_NET,
17739                                 lp->l2_proto, lp->l3_proto, drvidx,
17740                                 chidx, lp->msn)) < 0) {
17741 @@ -2859,6 +3761,9 @@
17742                 lp->pre_device = drvidx;
17743                 lp->pre_channel = chidx;
17744                 lp->onhtime = cfg->onhtime;
17745 +#ifdef CONFIG_ISDN_WITH_ABC 
17746 +               lp->dw_abc_old_onhtime = lp->onhtime;
17747 +#endif
17748                 lp->charge = cfg->charge;
17749                 lp->l2_proto = cfg->l2_proto;
17750                 lp->l3_proto = cfg->l3_proto;
17751 @@ -2932,6 +3837,9 @@
17752                         }
17753                 }
17754                 lp->p_encap = cfg->p_encap;
17755 +#ifdef CONFIG_ISDN_WITH_ABC 
17756 +               isdn_dw_abc_reset_interface(lp,0);
17757 +#endif
17758                 return 0;
17759         }
17760         return -ENODEV;
17761 @@ -3007,6 +3915,9 @@
17762                 strcpy(n->num, phone->phone);
17763                 n->next = p->local->phone[phone->outgoing & 1];
17764                 p->local->phone[phone->outgoing & 1] = n;
17765 +#ifdef CONFIG_ISDN_WITH_ABC
17766 +               isdn_dwabc_test_phone(p->local);
17767 +#endif
17768                 return 0;
17769         }
17770         return -ENODEV;
17771 @@ -3100,6 +4011,9 @@
17772                                 else
17773                                         p->local->phone[inout] = n->next;
17774                                 kfree(n);
17775 +#ifdef CONFIG_ISDN_WITH_ABC
17776 +                               isdn_dwabc_test_phone(p->local);
17777 +#endif
17778                                 restore_flags(flags);
17779                                 return 0;
17780                         }
17781 @@ -3135,6 +4049,9 @@
17782                 p->local->phone[i] = NULL;
17783         }
17784         p->local->dial = NULL;
17785 +#ifdef CONFIG_ISDN_WITH_ABC
17786 +       isdn_dwabc_test_phone(p->local);
17787 +#endif
17788         restore_flags(flags);
17789         return 0;
17790  }
17791 @@ -3218,6 +4135,10 @@
17792         /* If no more net-devices remain, disable auto-hangup timer */
17793         if (dev->netdev == NULL)
17794                 isdn_timer_ctrl(ISDN_TIMER_NETHANGUP, 0);
17795 +#ifdef CONFIG_ISDN_WITH_ABC
17796 +       isdn_dw_clear_if(~0l,p->local);
17797 +       dwabc_bsd_free(p->local);
17798 +#endif
17799         restore_flags(flags);
17800         kfree(p->local);
17801         kfree(p);
17802 Index: linux-2.4.35.4/drivers/isdn/isdn_net.h
17803 ===================================================================
17804 --- linux-2.4.35.4.orig/drivers/isdn/isdn_net.h 2007-12-15 05:19:40.626736225 +0100
17805 +++ linux-2.4.35.4/drivers/isdn/isdn_net.h      2007-12-15 05:19:55.699595179 +0100
17806 @@ -1,4 +1,4 @@
17807 -/* $Id: isdn_net.h,v 1.1.4.1 2001/11/20 14:19:34 kai Exp $
17808 +/* $Id: isdn_net.h,v 1.23 2001/11/07 22:35:48 kai Exp $
17809   *
17810   * header for Linux ISDN subsystem, network related functions (linklevel).
17811   *
17812 @@ -26,6 +26,7 @@
17813  #define CISCO_ADDR_BROADCAST  0x8f
17814  #define CISCO_CTRL            0x00
17815  #define CISCO_TYPE_CDP        0x2000
17816 +#define CISCO_TYPE_INET       0x0800
17817  #define CISCO_TYPE_SLARP      0x8035
17818  #define CISCO_SLARP_REQUEST   0
17819  #define CISCO_SLARP_REPLY     1
17820 @@ -106,8 +107,6 @@
17821         spin_lock_irqsave(&nd->queue_lock, flags);
17822  
17823         lp = nd->queue;
17824 -//     printk(KERN_DEBUG __FUNCTION__": lp:%s(%p) nlp:%s(%p) last(%p)\n",
17825 -//             lp->name, lp, nlp->name, nlp, lp->last); 
17826         nlp->last = lp->last;
17827         lp->last->next = nlp;
17828         lp->last = nlp;
17829 @@ -127,20 +126,12 @@
17830         if (lp->master)
17831                 master_lp = (isdn_net_local *) lp->master->priv;
17832  
17833 -//     printk(KERN_DEBUG __FUNCTION__": lp:%s(%p) mlp:%s(%p) last(%p) next(%p) mndq(%p)\n",
17834 -//             lp->name, lp, master_lp->name, master_lp, lp->last, lp->next, master_lp->netdev->queue); 
17835         spin_lock_irqsave(&master_lp->netdev->queue_lock, flags);
17836         lp->last->next = lp->next;
17837         lp->next->last = lp->last;
17838 -       if (master_lp->netdev->queue == lp) {
17839 +       if (master_lp->netdev->queue == lp)
17840                 master_lp->netdev->queue = lp->next;
17841 -               if (lp->next == lp) { /* last in queue */
17842 -                       master_lp->netdev->queue = master_lp->netdev->local;
17843 -               }
17844 -       }
17845         lp->next = lp->last = lp;       /* (re)set own pointers */
17846 -//     printk(KERN_DEBUG __FUNCTION__": mndq(%p)\n",
17847 -//             master_lp->netdev->queue); 
17848         spin_unlock_irqrestore(&master_lp->netdev->queue_lock, flags);
17849  }
17850  
17851 Index: linux-2.4.35.4/drivers/isdn/isdn_ppp.c
17852 ===================================================================
17853 --- linux-2.4.35.4.orig/drivers/isdn/isdn_ppp.c 2007-12-15 05:19:40.634736680 +0100
17854 +++ linux-2.4.35.4/drivers/isdn/isdn_ppp.c      2007-12-15 05:19:55.703595405 +0100
17855 @@ -1,4 +1,4 @@
17856 -/* $Id: isdn_ppp.c,v 1.1.4.1 2001/11/20 14:19:34 kai Exp $
17857 +/* $Id: isdn_ppp.c,v 1.94 2001/11/07 22:35:48 kai Exp $
17858   *
17859   * Linux ISDN subsystem, functions for synchronous PPP (linklevel).
17860   *
17861 @@ -13,9 +13,6 @@
17862  #include <linux/isdn.h>
17863  #include <linux/poll.h>
17864  #include <linux/ppp-comp.h>
17865 -#ifdef CONFIG_IPPP_FILTER
17866 -#include <linux/filter.h>
17867 -#endif
17868  
17869  #include "isdn_common.h"
17870  #include "isdn_ppp.h"
17871 @@ -72,11 +69,19 @@
17872  static int isdn_ppp_bundle(struct ippp_struct *, int unit);
17873  #endif /* CONFIG_ISDN_MPP */
17874    
17875 -char *isdn_ppp_revision = "$Revision: 1.1.4.1 $";
17876 +char *isdn_ppp_revision = "$Revision: 1.94 $";
17877  
17878  static struct ippp_struct *ippp_table[ISDN_MAX_CHANNELS];
17879  
17880 +#ifndef CONFIG_ISDN_WITH_ABC
17881  static struct isdn_ppp_compressor *ipc_head = NULL;
17882 +#else
17883 +       /*
17884 +       ** make compressor's common usable
17885 +       */
17886 +struct isdn_ppp_compressor *isdn_ippp_comp_head = NULL;
17887 +#define ipc_head isdn_ippp_comp_head
17888 +#endif
17889  
17890  /*
17891   * frame log (debug)
17892 @@ -110,11 +115,8 @@
17893         unsigned long flags;
17894         struct ippp_struct *is;
17895  
17896 -       if (lp->ppp_slot < 0 || lp->ppp_slot > ISDN_MAX_CHANNELS) {
17897 -               printk(KERN_ERR "%s: ppp_slot(%d) out of range\n",
17898 -                       __FUNCTION__, lp->ppp_slot);
17899 +       if (lp->ppp_slot < 0 || lp->ppp_slot > ISDN_MAX_CHANNELS)
17900                 return 0;
17901 -       }
17902  
17903         save_flags(flags);
17904         cli();
17905 @@ -130,12 +132,7 @@
17906         lp->netdev->pb->ref_ct--;
17907         spin_unlock(&lp->netdev->pb->lock);
17908  #endif /* CONFIG_ISDN_MPP */
17909 -       if (lp->ppp_slot < 0 || lp->ppp_slot > ISDN_MAX_CHANNELS) {
17910 -               printk(KERN_ERR "%s: ppp_slot(%d) now invalid\n",
17911 -                       __FUNCTION__, lp->ppp_slot);
17912 -               restore_flags(flags);
17913 -               return 0;
17914 -       }
17915 +
17916         is = ippp_table[lp->ppp_slot];
17917         if ((is->state & IPPP_CONNECT))
17918                 isdn_ppp_closewait(lp->ppp_slot);       /* force wakeup on ippp device */
17919 @@ -231,13 +228,12 @@
17920  void
17921  isdn_ppp_wakeup_daemon(isdn_net_local * lp)
17922  {
17923 -       if (lp->ppp_slot < 0 || lp->ppp_slot >= ISDN_MAX_CHANNELS) {
17924 -               printk(KERN_ERR "%s: ppp_slot(%d) out of range\n",
17925 -                       __FUNCTION__, lp->ppp_slot);
17926 +       if (lp->ppp_slot < 0 || lp->ppp_slot >= ISDN_MAX_CHANNELS)
17927                 return;
17928 -       }
17929 +
17930         ippp_table[lp->ppp_slot]->state = IPPP_OPEN | IPPP_CONNECT | IPPP_NOBLOCK;
17931 -       wake_up_interruptible(&ippp_table[lp->ppp_slot]->wq);
17932 +
17933 +               wake_up_interruptible(&ippp_table[lp->ppp_slot]->wq);
17934  }
17935  
17936  /*
17937 @@ -250,14 +246,13 @@
17938  {
17939         struct ippp_struct *is;
17940  
17941 -       if (slot < 0 || slot >= ISDN_MAX_CHANNELS) {
17942 -               printk(KERN_ERR "%s: slot(%d) out of range\n",
17943 -                       __FUNCTION__, slot);
17944 +       if (slot < 0 || slot >= ISDN_MAX_CHANNELS)
17945                 return 0;
17946 -       }
17947         is = ippp_table[slot];
17948 +
17949         if (is->state)
17950                 wake_up_interruptible(&is->wq);
17951 +
17952         is->state = IPPP_CLOSEWAIT;
17953         return 1;
17954  }
17955 @@ -295,9 +290,11 @@
17956                 return -EBUSY;
17957         }
17958         is = file->private_data = ippp_table[slot];
17959 -       
17960 -       printk(KERN_DEBUG "ippp, open, slot: %d, minor: %d, state: %04x\n",
17961 -              slot, min, is->state);
17962 +
17963 +#if 0
17964 +       if (is->debug & 0x1)
17965 +#endif
17966 +               printk(KERN_DEBUG "ippp, open, slot: %d, minor: %d, state: %04x\n", slot, min, is->state);
17967  
17968         /* compression stuff */
17969         is->link_compressor   = is->compressor = NULL;
17970 @@ -327,10 +324,7 @@
17971          */
17972         is->slcomp = slhc_init(16, 16); /* not necessary for 2. link in bundle */
17973  #endif
17974 -#ifdef CONFIG_IPPP_FILTER
17975 -       is->pass_filter.filter = NULL;
17976 -       is->active_filter.filter = NULL;
17977 -#endif
17978 +
17979         is->state = IPPP_OPEN;
17980  
17981         return 0;
17982 @@ -349,20 +343,12 @@
17983                 return;
17984         is = file->private_data;
17985  
17986 -       if (!is) {
17987 -               printk(KERN_ERR "%s: no file->private_data\n", __FUNCTION__);
17988 -               return;
17989 -       }
17990         if (is->debug & 0x1)
17991                 printk(KERN_DEBUG "ippp: release, minor: %d %lx\n", min, (long) is->lp);
17992  
17993         if (is->lp) {           /* a lp address says: this link is still up */
17994                 isdn_net_dev *p = is->lp->netdev;
17995  
17996 -               if (!p) {
17997 -                       printk(KERN_ERR "%s: no lp->netdev\n", __FUNCTION__);
17998 -                       return;
17999 -               }
18000                 is->state &= ~IPPP_CONNECT;     /* -> effect: no call of wakeup */
18001                 /*
18002                  * isdn_net_hangup() calls isdn_ppp_free()
18003 @@ -385,18 +371,8 @@
18004         slhc_free(is->slcomp);
18005         is->slcomp = NULL;
18006  #endif
18007 -#ifdef CONFIG_IPPP_FILTER
18008 -       if (is->pass_filter.filter) {
18009 -               kfree(is->pass_filter.filter);
18010 -               is->pass_filter.filter = NULL;
18011 -       }
18012 -       if (is->active_filter.filter) {
18013 -               kfree(is->active_filter.filter);
18014 -               is->active_filter.filter = NULL;
18015 -       }
18016 -#endif
18017  
18018 -/* TODO: if this was the previous master: link the stuff to the new master */
18019 +/* TODO: if this was the previous master: link the the stuff to the new master */
18020         if(is->comp_stat)
18021                 is->compressor->free(is->comp_stat);
18022         if(is->link_comp_stat)
18023 @@ -509,13 +485,15 @@
18024                         if (val & SC_ENABLE_IP && !(is->pppcfg & SC_ENABLE_IP) && (is->state & IPPP_CONNECT)) {
18025                                 if (lp) {
18026                                         /* OK .. we are ready to send buffers */
18027 -                                       is->pppcfg = val; /* isdn_ppp_xmit test for SC_ENABLE_IP !!! */
18028                                         netif_wake_queue(&lp->netdev->dev);
18029 -                                       break;
18030                                 }
18031                         }
18032                         is->pppcfg = val;
18033                         break;
18034 +#if 0
18035 +               case PPPIOCGSTAT:       /* read PPP statistic information */
18036 +                       break;
18037 +#endif
18038                 case PPPIOCGIDLE:       /* get idle time information */
18039                         if (lp) {
18040                                 struct ppp_idle pidle;
18041 @@ -604,39 +582,6 @@
18042                                 }
18043                                 return set_arg((void *)arg,&pci,sizeof(struct pppcallinfo));
18044                         }
18045 -#ifdef CONFIG_IPPP_FILTER
18046 -               case PPPIOCSPASS:
18047 -               case PPPIOCSACTIVE:
18048 -                       {
18049 -                               struct sock_fprog uprog, *filtp;
18050 -                               struct sock_filter *code = NULL;
18051 -                               int len, err;
18052 -
18053 -                               if (copy_from_user(&uprog, (void *) arg, sizeof(uprog)))
18054 -                                       return -EFAULT;
18055 -                               if (uprog.len > 0 && uprog.len < 65536) {
18056 -                                       len = uprog.len * sizeof(struct sock_filter);
18057 -                                       code = kmalloc(len, GFP_KERNEL);
18058 -                                       if (code == NULL)
18059 -                                               return -ENOMEM;
18060 -                                       if (copy_from_user(code, uprog.filter, len)) {
18061 -                                               kfree(code);
18062 -                                               return -EFAULT;
18063 -                                       }
18064 -                                       err = sk_chk_filter(code, uprog.len);
18065 -                                       if (err) {
18066 -                                               kfree(code);
18067 -                                               return err;
18068 -                                       }
18069 -                               }
18070 -                               filtp = (cmd == PPPIOCSPASS) ? &is->pass_filter : &is->active_filter;
18071 -                               if (filtp->filter)
18072 -                                       kfree(filtp->filter);
18073 -                               filtp->filter = code;
18074 -                               filtp->len = uprog.len;
18075 -                               break;
18076 -                       }
18077 -#endif /* CONFIG_IPPP_FILTER */
18078                 default:
18079                         break;
18080         }
18081 @@ -699,7 +644,7 @@
18082         struct ippp_struct *is;
18083  
18084         if (slot < 0 || slot >= ISDN_MAX_CHANNELS) {
18085 -               printk(KERN_WARNING "ippp: illegal slot(%d).\n", slot);
18086 +               printk(KERN_WARNING "ippp: illegal slot.\n");
18087                 return 0;
18088         }
18089         is = ippp_table[slot];
18090 @@ -976,8 +921,7 @@
18091  
18092         slot = lp->ppp_slot;
18093         if (slot < 0 || slot > ISDN_MAX_CHANNELS) {
18094 -               printk(KERN_ERR "isdn_ppp_receive: lp->ppp_slot(%d)\n",
18095 -                       lp->ppp_slot);
18096 +               printk(KERN_ERR "isdn_ppp_receive: lp->ppp_slot %d\n", lp->ppp_slot);
18097                 kfree_skb(skb);
18098                 return;
18099         }
18100 @@ -1026,23 +970,19 @@
18101  {
18102         struct net_device *dev = &net_dev->dev;
18103         struct ippp_struct *is, *mis;
18104 -       isdn_net_local *mlp = NULL;
18105         int slot;
18106  
18107         slot = lp->ppp_slot;
18108         if (slot < 0 || slot > ISDN_MAX_CHANNELS) {
18109 -               printk(KERN_ERR "isdn_ppp_push_higher: lp->ppp_slot(%d)\n",
18110 -                       lp->ppp_slot);
18111 +               printk(KERN_ERR "isdn_ppp_push_higher: lp->ppp_slot %d\n", lp->ppp_slot);
18112                 goto drop_packet;
18113         }
18114         is = ippp_table[slot];
18115         
18116         if (lp->master) { // FIXME?
18117 -               mlp = (isdn_net_local *) lp->master->priv;
18118 -               slot = mlp->ppp_slot;
18119 +               slot = ((isdn_net_local *) (lp->master->priv))->ppp_slot;
18120                 if (slot < 0 || slot > ISDN_MAX_CHANNELS) {
18121 -                       printk(KERN_ERR "isdn_ppp_push_higher: master->ppp_slot(%d)\n",
18122 -                               lp->ppp_slot);
18123 +                       printk(KERN_ERR "isdn_ppp_push_higher: master->ppp_slot %d\n", lp->ppp_slot);
18124                         goto drop_packet;
18125                 }
18126         }
18127 @@ -1076,11 +1016,6 @@
18128                 case PPP_VJC_UNCOMP:
18129                         if (is->debug & 0x20)
18130                                 printk(KERN_DEBUG "isdn_ppp: VJC_UNCOMP\n");
18131 -                       if (net_dev->local->ppp_slot < 0) {
18132 -                               printk(KERN_ERR "%s: net_dev->local->ppp_slot(%d) out of range\n",
18133 -                                       __FUNCTION__, net_dev->local->ppp_slot);
18134 -                               goto drop_packet;
18135 -                       }
18136                         if (slhc_remember(ippp_table[net_dev->local->ppp_slot]->slcomp, skb->data, skb->len) <= 0) {
18137                                 printk(KERN_WARNING "isdn_ppp: received illegal VJC_UNCOMP frame!\n");
18138                                 goto drop_packet;
18139 @@ -1102,11 +1037,6 @@
18140                                 }
18141                                 skb_put(skb, skb_old->len + 128);
18142                                 memcpy(skb->data, skb_old->data, skb_old->len);
18143 -                               if (net_dev->local->ppp_slot < 0) {
18144 -                                       printk(KERN_ERR "%s: net_dev->local->ppp_slot(%d) out of range\n",
18145 -                                               __FUNCTION__, net_dev->local->ppp_slot);
18146 -                                       goto drop_packet;
18147 -                               }
18148                                 pkt_len = slhc_uncompress(ippp_table[net_dev->local->ppp_slot]->slcomp,
18149                                                 skb->data, skb_old->len);
18150                                 kfree_skb(skb_old);
18151 @@ -1133,36 +1063,12 @@
18152                         return;
18153         }
18154  
18155 -#ifdef CONFIG_IPPP_FILTER
18156 -       /* check if the packet passes the pass and active filters
18157 -        * the filter instructions are constructed assuming
18158 -        * a four-byte PPP header on each packet (which is still present) */
18159 -       skb_push(skb, 4);
18160 -       skb->data[0] = 0;       /* indicate inbound */
18161 -
18162 -       if (is->pass_filter.filter
18163 -           && sk_run_filter(skb, is->pass_filter.filter,
18164 -                           is->pass_filter.len) == 0) {
18165 -               if (is->debug & 0x2)
18166 -                       printk(KERN_DEBUG "IPPP: inbound frame filtered.\n");
18167 -               kfree_skb(skb);
18168 -               return;
18169 -       }
18170 -       if (!(is->active_filter.filter
18171 -             && sk_run_filter(skb, is->active_filter.filter,
18172 -                              is->active_filter.len) == 0)) {
18173 -               if (is->debug & 0x2)
18174 -                       printk(KERN_DEBUG "IPPP: link-active filter: reseting huptimer.\n");
18175 -               lp->huptimer = 0;
18176 -               if (mlp)
18177 -                       mlp->huptimer = 0;
18178 -       }
18179 -       skb_pull(skb, 4);
18180 -#else /* CONFIG_IPPP_FILTER */
18181 -       lp->huptimer = 0;
18182 -       if (mlp)
18183 -               mlp->huptimer = 0;
18184 -#endif /* CONFIG_IPPP_FILTER */
18185 +       /* Reset hangup-timer */
18186 +       lp->huptimer = 0;
18187 +#ifdef CONFIG_ISDN_WITH_ABC_CONN_ERROR
18188 +       lp->dw_abc_bchan_errcnt = 0;
18189 +#endif
18190 +
18191         skb->dev = dev;
18192         skb->mac.raw = skb->data;
18193         netif_rx(skb);
18194 @@ -1199,6 +1105,7 @@
18195         return skb_push(skb,len);
18196  }
18197  
18198 +
18199  /*
18200   * send ppp frame .. we expect a PIDCOMPressable proto --
18201   *  (here: currently always PPP_IP,PPP_VJC_COMP,PPP_VJC_UNCOMP)
18202 @@ -1214,25 +1121,23 @@
18203         isdn_net_dev *nd;
18204         unsigned int proto = PPP_IP;     /* 0x21 */
18205         struct ippp_struct *ipt,*ipts;
18206 -       int slot, retval = 0;
18207 +       int slot;
18208  
18209         mlp = (isdn_net_local *) (netdev->priv);
18210         nd = mlp->netdev;       /* get master lp */
18211  
18212         slot = mlp->ppp_slot;
18213         if (slot < 0 || slot > ISDN_MAX_CHANNELS) {
18214 -               printk(KERN_ERR "isdn_ppp_xmit: lp->ppp_slot(%d)\n",
18215 -                       mlp->ppp_slot);
18216 +               printk(KERN_ERR "isdn_ppp_xmit: lp->ppp_slot %d\n", mlp->ppp_slot);
18217                 kfree_skb(skb);
18218 -               goto out;
18219 +               return 0;
18220         }
18221         ipts = ippp_table[slot];
18222  
18223         if (!(ipts->pppcfg & SC_ENABLE_IP)) {   /* PPP connected ? */
18224                 if (ipts->debug & 0x1)
18225                         printk(KERN_INFO "%s: IP frame delayed.\n", netdev->name);
18226 -               retval = 1;
18227 -               goto out;
18228 +               return 1;
18229         }
18230  
18231         switch (ntohs(skb->protocol)) {
18232 @@ -1246,25 +1151,24 @@
18233                         printk(KERN_ERR "isdn_ppp: skipped unsupported protocol: %#x.\n", 
18234                                skb->protocol);
18235                         dev_kfree_skb(skb);
18236 -                       goto out;
18237 +                       return 0;
18238         }
18239  
18240         lp = isdn_net_get_locked_lp(nd);
18241         if (!lp) {
18242                 printk(KERN_WARNING "%s: all channels busy - requeuing!\n", netdev->name);
18243 -               retval = 1;
18244 -               goto out;
18245 +               return 1;
18246         }
18247         /* we have our lp locked from now on */
18248  
18249         slot = lp->ppp_slot;
18250         if (slot < 0 || slot > ISDN_MAX_CHANNELS) {
18251 -               printk(KERN_ERR "isdn_ppp_xmit: lp->ppp_slot(%d)\n",
18252 -                       lp->ppp_slot);
18253 +               printk(KERN_ERR "isdn_ppp_xmit: lp->ppp_slot %d\n", lp->ppp_slot);
18254                 kfree_skb(skb);
18255 -               goto unlock;
18256 +               return 0;
18257         }
18258         ipt = ippp_table[slot];
18259 +       lp->huptimer = 0;
18260  
18261         /*
18262          * after this line .. requeueing in the device queue is no longer allowed!!!
18263 @@ -1275,34 +1179,6 @@
18264          */
18265         skb_pull(skb,IPPP_MAX_HEADER);
18266  
18267 -#ifdef CONFIG_IPPP_FILTER
18268 -       /* check if we should pass this packet
18269 -        * the filter instructions are constructed assuming
18270 -        * a four-byte PPP header on each packet */
18271 -       skb_push(skb, 4);
18272 -       skb->data[0] = 1;       /* indicate outbound */
18273 -       *(u_int16_t *)(skb->data + 2) = htons(proto);
18274 -
18275 -       if (ipt->pass_filter.filter 
18276 -           && sk_run_filter(skb, ipt->pass_filter.filter,
18277 -                            ipt->pass_filter.len) == 0) {
18278 -               if (ipt->debug & 0x4)
18279 -                       printk(KERN_DEBUG "IPPP: outbound frame filtered.\n");
18280 -               kfree_skb(skb);
18281 -               goto unlock;
18282 -       }
18283 -       if (!(ipt->active_filter.filter
18284 -             && sk_run_filter(skb, ipt->active_filter.filter,
18285 -                              ipt->active_filter.len) == 0)) {
18286 -               if (ipt->debug & 0x4)
18287 -                       printk(KERN_DEBUG "IPPP: link-active filter: reseting huptimer.\n");
18288 -               lp->huptimer = 0;
18289 -       }
18290 -       skb_pull(skb, 4);
18291 -#else /* CONFIG_IPPP_FILTER */
18292 -       lp->huptimer = 0;
18293 -#endif /* CONFIG_IPPP_FILTER */
18294 -
18295         if (ipt->debug & 0x4)
18296                 printk(KERN_DEBUG "xmit skb, len %d\n", (int) skb->len);
18297          if (ipts->debug & 0x40)
18298 @@ -1440,54 +1316,9 @@
18299  
18300   unlock:
18301         spin_unlock_bh(&lp->xmit_lock);
18302 - out:
18303 -       return retval;
18304 +       return 0;
18305  }
18306  
18307 -#ifdef CONFIG_IPPP_FILTER
18308 -/*
18309 - * check if this packet may trigger auto-dial.
18310 - */
18311 -
18312 -int isdn_ppp_autodial_filter(struct sk_buff *skb, isdn_net_local *lp)
18313 -{
18314 -       struct ippp_struct *is = ippp_table[lp->ppp_slot];
18315 -       u_int16_t proto;
18316 -       int drop = 0;
18317 -
18318 -       switch (ntohs(skb->protocol)) {
18319 -       case ETH_P_IP:
18320 -               proto = PPP_IP;
18321 -               break;
18322 -       case ETH_P_IPX:
18323 -               proto = PPP_IPX;
18324 -               break;
18325 -       default:
18326 -               printk(KERN_ERR "isdn_ppp_autodial_filter: unsupported protocol 0x%x.\n",
18327 -                      skb->protocol);
18328 -               return 1;
18329 -       }
18330 -
18331 -       /* the filter instructions are constructed assuming
18332 -        * a four-byte PPP header on each packet. we have to
18333 -        * temporarily remove part of the fake header stuck on
18334 -        * earlier.
18335 -        */
18336 -       skb_pull(skb, IPPP_MAX_HEADER - 4);
18337 -       skb->data[0] = 1;       /* indicate outbound */
18338 -       *(u_int16_t *)(skb->data + 2) = htons(proto);
18339 -       
18340 -       drop |= is->pass_filter.filter
18341 -               && sk_run_filter(skb, is->pass_filter.filter,
18342 -                                is->pass_filter.len) == 0;
18343 -       drop |= is->active_filter.filter
18344 -               && sk_run_filter(skb, is->active_filter.filter,
18345 -                                is->active_filter.len) == 0;
18346 -       
18347 -       skb_push(skb, IPPP_MAX_HEADER - 4);
18348 -       return drop;
18349 -}
18350 -#endif
18351  #ifdef CONFIG_ISDN_MPP
18352  
18353  /* this is _not_ rfc1990 header, but something we convert both short and long
18354 @@ -1537,15 +1368,8 @@
18355  
18356  static int isdn_ppp_mp_init( isdn_net_local * lp, ippp_bundle * add_to )
18357  {
18358 -       struct ippp_struct * is;
18359 -
18360 -       if (lp->ppp_slot < 0) {
18361 -               printk(KERN_ERR "%s: lp->ppp_slot(%d) out of range\n",
18362 -                       __FUNCTION__, lp->ppp_slot);
18363 -               return(-EINVAL);
18364 -       }
18365 -
18366 -       is = ippp_table[lp->ppp_slot];
18367 +       struct ippp_struct * is = ippp_table[lp->ppp_slot];
18368 +   
18369         if (add_to) {
18370                 if( lp->netdev->pb )
18371                         lp->netdev->pb->ref_ct--;
18372 @@ -1591,8 +1415,7 @@
18373          stats = &mp->stats;
18374         slot = lp->ppp_slot;
18375         if (slot < 0 || slot > ISDN_MAX_CHANNELS) {
18376 -               printk(KERN_ERR "%s: lp->ppp_slot(%d)\n",
18377 -                       __FUNCTION__, lp->ppp_slot);
18378 +               printk(KERN_ERR "isdn_ppp_mp_receive: lp->ppp_slot %d\n", lp->ppp_slot);
18379                 stats->frame_drops++;
18380                 dev_kfree_skb(skb);
18381                 spin_unlock_irqrestore(&mp->lock, flags);
18382 @@ -1628,8 +1451,7 @@
18383         for (lpq = net_dev->queue;;) {
18384                 slot = lpq->ppp_slot;
18385                 if (slot < 0 || slot > ISDN_MAX_CHANNELS) {
18386 -                       printk(KERN_ERR "%s: lpq->ppp_slot(%d)\n",
18387 -                               __FUNCTION__, lpq->ppp_slot);
18388 +                       printk(KERN_ERR "isdn_ppp_mp_receive: lpq->ppp_slot %d\n", lpq->ppp_slot);
18389                 } else {
18390                         u32 lls = ippp_table[slot]->last_link_seqno;
18391                         if (MP_LT(lls, minseq))
18392 @@ -1861,14 +1683,9 @@
18393         struct sk_buff * skb;
18394         unsigned int tot_len;
18395  
18396 -       if (lp->ppp_slot < 0 || lp->ppp_slot > ISDN_MAX_CHANNELS) {
18397 -               printk(KERN_ERR "%s: lp->ppp_slot(%d) out of range\n",
18398 -                       __FUNCTION__, lp->ppp_slot);
18399 -               return;
18400 -       }
18401         if( MP_FLAGS(from) == (MP_BEGIN_FRAG | MP_END_FRAG) ) {
18402                 if( ippp_table[lp->ppp_slot]->debug & 0x40 )
18403 -                       printk(KERN_DEBUG "isdn_mppp: reassembly: frame %d, "
18404 +                       printk(KERN_DEBUG"isdn_mppp: reassembly: frame %d, "
18405                                         "len %d\n", MP_SEQ(from), from->len );
18406                 skb = from;
18407                 skb_pull(skb, MP_HEADER_LEN);
18408 @@ -1987,10 +1804,8 @@
18409         memset(&t, 0, sizeof(struct ppp_stats));
18410         if (dev->flags & IFF_UP) {
18411                 t.p.ppp_ipackets = lp->stats.rx_packets;
18412 -               t.p.ppp_ibytes = lp->stats.rx_bytes;
18413                 t.p.ppp_ierrors = lp->stats.rx_errors;
18414                 t.p.ppp_opackets = lp->stats.tx_packets;
18415 -               t.p.ppp_obytes = lp->stats.tx_bytes;
18416                 t.p.ppp_oerrors = lp->stats.tx_errors;
18417  #ifdef CONFIG_ISDN_PPP_VJ
18418                 if (slot >= 0 && ippp_table[slot]->slcomp) {
18419 @@ -2018,6 +1833,9 @@
18420         int len;
18421         isdn_net_local *lp = (isdn_net_local *) dev->priv;
18422  
18423 +#if 0
18424 +       printk(KERN_DEBUG "ippp, dev_ioctl: cmd %#08x , %d \n", cmd, lp->ppp_slot);
18425 +#endif
18426  
18427         if (lp->p_encap != ISDN_NET_ENCAP_SYNCPPP)
18428                 return -EINVAL;
18429 @@ -2432,7 +2250,7 @@
18430                                 return;
18431                         }
18432                         rs->state = CCPResetSentReq;
18433 -                       /* We always expect an Ack if the decompressor doesn't
18434 +                       /* We always expect an Ack if the decompressor doesnt
18435                            know better */
18436                         rs->expra = 1;
18437                         rs->dlen = 0;
18438 @@ -2583,7 +2401,13 @@
18439      }
18440  
18441         if(type) { /* type=1 => Link compression */
18442 +#if 0
18443 +               compressor = is->link_compressor;
18444 +               stat = is->link_comp_stat;
18445 +               new_proto = PPP_LINK_COMP;
18446 +#else
18447                 return skb_in;
18448 +#endif
18449         }
18450         else {
18451                 if(!master) {
18452 @@ -2631,31 +2455,18 @@
18453  static void isdn_ppp_receive_ccp(isdn_net_dev *net_dev, isdn_net_local *lp,
18454          struct sk_buff *skb,int proto)
18455  {
18456 -       struct ippp_struct *is;
18457 +       struct ippp_struct *is = ippp_table[lp->ppp_slot];
18458         struct ippp_struct *mis;
18459         int len;
18460         struct isdn_ppp_resetparams rsparm;
18461         unsigned char rsdata[IPPP_RESET_MAXDATABYTES];  
18462  
18463 -       printk(KERN_DEBUG "Received CCP frame from peer slot(%d)\n",
18464 -               lp->ppp_slot);
18465 -       if (lp->ppp_slot < 0 || lp->ppp_slot > ISDN_MAX_CHANNELS) {
18466 -               printk(KERN_ERR "%s: lp->ppp_slot(%d) out of range\n",
18467 -                       __FUNCTION__, lp->ppp_slot);
18468 -               return;
18469 -       }
18470 -       is = ippp_table[lp->ppp_slot];
18471 +       printk(KERN_DEBUG "Received CCP frame from peer\n");
18472         isdn_ppp_frame_log("ccp-rcv", skb->data, skb->len, 32, is->unit,lp->ppp_slot);
18473  
18474 -       if(lp->master) {
18475 -               int slot = ((isdn_net_local *) (lp->master->priv))->ppp_slot;
18476 -               if (slot < 0 || slot > ISDN_MAX_CHANNELS) {
18477 -                       printk(KERN_ERR "%s: slot(%d) out of range\n",
18478 -                               __FUNCTION__, slot);
18479 -                       return;
18480 -               }       
18481 -               mis = ippp_table[slot];
18482 -       } else
18483 +       if(lp->master)
18484 +               mis = ippp_table[((isdn_net_local *) (lp->master->priv))->ppp_slot];
18485 +       else
18486                 mis = is;
18487  
18488         switch(skb->data[0]) {
18489 @@ -2807,18 +2618,13 @@
18490  
18491  static void isdn_ppp_send_ccp(isdn_net_dev *net_dev, isdn_net_local *lp, struct sk_buff *skb)
18492  {
18493 -       struct ippp_struct *mis,*is;
18494 -       int proto, slot = lp->ppp_slot;
18495 +       struct ippp_struct *mis,*is = ippp_table[lp->ppp_slot];
18496 +       int proto;
18497         unsigned char *data;
18498  
18499         if(!skb || skb->len < 3)
18500                 return;
18501 -       if (slot < 0 || slot > ISDN_MAX_CHANNELS) {
18502 -               printk(KERN_ERR "%s: lp->ppp_slot(%d) out of range\n",
18503 -                       __FUNCTION__, slot);
18504 -               return;
18505 -       }       
18506 -       is = ippp_table[slot];
18507 +
18508         /* Daemon may send with or without address and control field comp */
18509         data = skb->data;
18510         if(!(is->pppcfg & SC_COMP_AC) && data[0] == 0xff && data[1] == 0x03) {
18511 @@ -2834,17 +2640,12 @@
18512         printk(KERN_DEBUG "Received CCP frame from daemon:\n");
18513         isdn_ppp_frame_log("ccp-xmit", skb->data, skb->len, 32, is->unit,lp->ppp_slot);
18514  
18515 -       if (lp->master) {
18516 -               slot = ((isdn_net_local *) (lp->master->priv))->ppp_slot;
18517 -               if (slot < 0 || slot > ISDN_MAX_CHANNELS) {
18518 -                       printk(KERN_ERR "%s: slot(%d) out of range\n",
18519 -                               __FUNCTION__, slot);
18520 -                       return;
18521 -               }       
18522 -               mis = ippp_table[slot];
18523 -       } else
18524 -               mis = is;
18525 -       if (mis != is)
18526 +        if(lp->master)
18527 +                mis = ippp_table[((isdn_net_local *) (lp->master->priv))->ppp_slot];
18528 +        else
18529 +                mis = is;
18530 +       
18531 +       if(mis != is)
18532                 printk(KERN_DEBUG "isdn_ppp: Ouch! Master CCP sends on slave slot!\n");
18533         
18534          switch(data[2]) {
18535 Index: linux-2.4.35.4/drivers/isdn/isdn_ppp.h
18536 ===================================================================
18537 --- linux-2.4.35.4.orig/drivers/isdn/isdn_ppp.h 2007-12-15 05:19:40.642737136 +0100
18538 +++ linux-2.4.35.4/drivers/isdn/isdn_ppp.h      2007-12-15 05:19:55.703595405 +0100
18539 @@ -1,4 +1,4 @@
18540 -/* $Id: isdn_ppp.h,v 1.1.4.1 2001/11/20 14:19:34 kai Exp $
18541 +/* $Id: isdn_ppp.h,v 1.18 2001/09/24 13:22:42 kai Exp $
18542   *
18543   * header for Linux ISDN subsystem, functions for synchronous PPP (linklevel).
18544   *
18545 @@ -19,7 +19,6 @@
18546  extern void isdn_ppp_cleanup(void);
18547  extern int isdn_ppp_free(isdn_net_local *);
18548  extern int isdn_ppp_bind(isdn_net_local *);
18549 -extern int isdn_ppp_autodial_filter(struct sk_buff *, isdn_net_local *);
18550  extern int isdn_ppp_xmit(struct sk_buff *, struct net_device *);
18551  extern void isdn_ppp_receive(isdn_net_dev *, isdn_net_local *, struct sk_buff *);
18552  extern int isdn_ppp_dev_ioctl(struct net_device *, struct ifreq *, int);
18553 Index: linux-2.4.35.4/drivers/isdn/isdn_tty.c
18554 ===================================================================
18555 --- linux-2.4.35.4.orig/drivers/isdn/isdn_tty.c 2007-12-15 05:19:40.646737365 +0100
18556 +++ linux-2.4.35.4/drivers/isdn/isdn_tty.c      2007-12-15 05:19:55.703595405 +0100
18557 @@ -1,4 +1,4 @@
18558 -/* $Id: isdn_tty.c,v 1.1.4.1 2001/11/20 14:19:34 kai Exp $
18559 +/* $Id: isdn_tty.c,v 1.104 2002/02/09 21:19:11 keil Exp $
18560   *
18561   * Linux ISDN subsystem, tty functions and AT-command emulator (linklevel).
18562   *
18563 @@ -53,7 +53,7 @@
18564  static int si2bit[8] =
18565  {4, 1, 4, 4, 4, 4, 4, 4};
18566  
18567 -char *isdn_tty_revision = "$Revision: 1.1.4.1 $";
18568 +char *isdn_tty_revision = "$Revision: 1.104 $";
18569  
18570  
18571  /* isdn_tty_try_read() is called from within isdn_tty_rcv_skb()
18572 @@ -321,7 +321,10 @@
18573                 info->send_outstanding++;
18574                 info->msr &= ~UART_MSR_CTS;
18575                 info->lsr &= ~UART_LSR_TEMT;
18576 -               tty_wakeup(tty);
18577 +               if ((tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) &&
18578 +                   tty->ldisc.write_wakeup)
18579 +                       (tty->ldisc.write_wakeup) (tty);
18580 +               wake_up_interruptible(&tty->write_wait);
18581                 return;
18582         }
18583         if (slen < 0) {
18584 @@ -1211,7 +1214,10 @@
18585                                                 /* If DLE decoding results in zero-transmit, but
18586                                                  * c originally was non-zero, do a wakeup.
18587                                                  */
18588 -                                               tty_wakeup(tty);
18589 +                                               if ((tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) &&
18590 +                                                tty->ldisc.write_wakeup)
18591 +                                                       (tty->ldisc.write_wakeup) (tty);
18592 +                                               wake_up_interruptible(&tty->write_wait);
18593                                                 info->msr |= UART_MSR_CTS;
18594                                                 info->lsr |= UART_LSR_TEMT;
18595                                         }
18596 @@ -1232,6 +1238,7 @@
18597                                         }
18598                                 }
18599                         } else
18600 +#ifdef ISDN_TTY_FCLASS1
18601                         if (TTY_IS_FCLASS1(info)) {
18602                                 int cc = isdn_tty_handleDLEdown(info, m, c);
18603                                 
18604 @@ -1252,6 +1259,7 @@
18605                                 info->xmit_count += cc;
18606                         } else
18607  #endif
18608 +#endif
18609                                 info->xmit_count += c;
18610                 } else {
18611                         info->msr |= UART_MSR_CTS;
18612 @@ -1329,7 +1337,10 @@
18613         isdn_tty_cleanup_xmit(info);
18614         info->xmit_count = 0;
18615         restore_flags(flags);
18616 -       tty_wakeup(tty);
18617 +       wake_up_interruptible(&tty->write_wait);
18618 +       if ((tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) &&
18619 +           tty->ldisc.write_wakeup)
18620 +               (tty->ldisc.write_wakeup) (tty);
18621  }
18622  
18623  static void
18624 @@ -1858,7 +1869,8 @@
18625         isdn_tty_shutdown(info);
18626         if (tty->driver.flush_buffer)
18627                 tty->driver.flush_buffer(tty);
18628 -       tty_ldisc_flush(tty);
18629 +       if (tty->ldisc.flush_buffer)
18630 +               tty->ldisc.flush_buffer(tty);
18631         info->tty = 0;
18632         info->ncarrier = 0;
18633         tty->closing = 0;
18634 @@ -2306,6 +2318,22 @@
18635                                   isdn_tty_at_cout("\r\n", info);
18636                                 }
18637                                 return 1;
18638 +                       case ISDN_STAT_ALERT:
18639 +#ifdef ISDN_TTY_STAT_DEBUG
18640 +                               printk(KERN_DEBUG "tty_STAT_ALERT ttyI%d\n", info->line);
18641 +#endif
18642 +                               /* Signal RINGING to tty-device if requested */
18643 +                               if (info->emu.mdmreg[REG_ALERT] & BIT_ALERT)
18644 +                                       isdn_tty_modem_result(RESULT_RINGING, info);
18645 +                               return 1;
18646 +                       case ISDN_STAT_PROCEED:
18647 +#ifdef ISDN_TTY_STAT_DEBUG
18648 +                               printk(KERN_DEBUG "tty_STAT_PROCEED ttyI%d\n", info->line);
18649 +#endif
18650 +                               /* Signal PROCEEDING to tty-device if requested */
18651 +                               if (info->emu.mdmreg[REG_PROCEED] & BIT_PROCEED)
18652 +                                       isdn_tty_modem_result(RESULT_PROCEEDING, info);
18653 +                               return 1;
18654                         case ISDN_STAT_DCONN:
18655  #ifdef ISDN_TTY_STAT_DEBUG
18656                                 printk(KERN_DEBUG "tty_STAT_DCONN ttyI%d\n", info->line);
18657 @@ -2618,7 +2646,7 @@
18658         static char *msg[] =
18659         {"OK", "CONNECT", "RING", "NO CARRIER", "ERROR",
18660          "CONNECT 64000", "NO DIALTONE", "BUSY", "NO ANSWER",
18661 -        "RINGING", "NO MSN/EAZ", "VCON", "RUNG"};
18662 +        "RINGING", "NO MSN/EAZ", "VCON", "RUNG", "PROCEEDING"};
18663         ulong flags;
18664         char s[ISDN_MSNLEN+10];
18665  
18666 @@ -2781,7 +2809,8 @@
18667                         restore_flags(flags);
18668                         return;
18669                 }
18670 -               tty_ldisc_flush(info->tty);
18671 +               if (info->tty->ldisc.flush_buffer)
18672 +                       info->tty->ldisc.flush_buffer(info->tty);
18673                 if ((info->flags & ISDN_ASYNC_CHECK_CD) &&
18674                     (!((info->flags & ISDN_ASYNC_CALLOUT_ACTIVE) &&
18675                        (info->flags & ISDN_ASYNC_CALLOUT_NOHUP)))) {
18676 @@ -3296,9 +3325,11 @@
18677  #ifdef CONFIG_ISDN_TTY_FAX
18678                                 if (TTY_IS_FCLASS2(info))
18679                                                 sprintf(rs, "\r\n2");
18680 +#ifdef ISDN_TTY_FCLASS1
18681                                 else if (TTY_IS_FCLASS1(info))
18682                                                 sprintf(rs, "\r\n1");
18683  #endif
18684 +#endif
18685                                 isdn_tty_at_cout(rs, info);
18686                                 break;
18687                         case '=':
18688 @@ -3313,6 +3344,7 @@
18689                                                     m->mdmreg[REG_PSIZE] * 16;
18690                                                 break;
18691  #ifdef CONFIG_ISDN_TTY_FAX
18692 +#ifdef ISDN_TTY_FCLASS1
18693                                         case '1':
18694                                                 p[0]++;
18695                                                 if (!(dev->global_features &
18696 @@ -3324,6 +3356,7 @@
18697                                                 info->xmit_size =
18698                                                     m->mdmreg[REG_PSIZE] * 16;
18699                                                 break;
18700 +#endif
18701                                         case '2':
18702                                                 p[0]++;
18703                                                 if (!(dev->global_features &
18704 @@ -3348,9 +3381,11 @@
18705                                                 p[0]++;
18706                                                 strcpy(rs, "\r\n0,");
18707  #ifdef CONFIG_ISDN_TTY_FAX
18708 +#ifdef ISDN_TTY_FCLASS1
18709                                                 if (dev->global_features &
18710                                                         ISDN_FEATURE_L3_FCLASS1)
18711                                                         strcat(rs, "1,");
18712 +#endif
18713                                                 if (dev->global_features &
18714                                                         ISDN_FEATURE_L3_FCLASS2)
18715                                                         strcat(rs, "2,");
18716 Index: linux-2.4.35.4/drivers/isdn/isdn_tty.h
18717 ===================================================================
18718 --- linux-2.4.35.4.orig/drivers/isdn/isdn_tty.h 2007-12-15 05:19:40.654737820 +0100
18719 +++ linux-2.4.35.4/drivers/isdn/isdn_tty.h      2007-12-15 05:19:55.707595631 +0100
18720 @@ -1,4 +1,4 @@
18721 -/* $Id: isdn_tty.h,v 1.1.4.1 2001/11/20 14:19:34 kai Exp $
18722 +/* $Id: isdn_tty.h,v 1.25 2002/02/09 21:19:11 keil Exp $
18723   *
18724   * header for Linux ISDN subsystem, tty related functions (linklevel).
18725   *
18726 @@ -78,6 +78,10 @@
18727  #define BIT_CPNFCON   2
18728  #define REG_CDN      23
18729  #define BIT_CDN       4
18730 +#define REG_ALERT    23
18731 +#define BIT_ALERT     8
18732 +#define REG_PROCEED  23
18733 +#define BIT_PROCEED  16
18734  
18735  /* defines for result codes */
18736  #define RESULT_OK              0
18737 @@ -93,10 +97,13 @@
18738  #define RESULT_NO_MSN_EAZ      10
18739  #define RESULT_VCON            11
18740  #define RESULT_RUNG            12
18741 +#define RESULT_PROCEEDING      13
18742  
18743 +#ifdef ISDN_TTY_FCLASS1
18744  #define TTY_IS_FCLASS1(info) \
18745         ((info->emu.mdmreg[REG_L2PROT] == ISDN_PROTO_L2_FAX) && \
18746          (info->emu.mdmreg[REG_L3PROT] == ISDN_PROTO_L3_FCLASS1))
18747 +#endif
18748  #define TTY_IS_FCLASS2(info) \
18749         ((info->emu.mdmreg[REG_L2PROT] == ISDN_PROTO_L2_FAX) && \
18750          (info->emu.mdmreg[REG_L3PROT] == ISDN_PROTO_L3_FCLASS2))
18751 Index: linux-2.4.35.4/drivers/isdn/isdn_ttyfax.c
18752 ===================================================================
18753 --- linux-2.4.35.4.orig/drivers/isdn/isdn_ttyfax.c      2007-12-15 05:19:40.662738275 +0100
18754 +++ linux-2.4.35.4/drivers/isdn/isdn_ttyfax.c   2007-12-15 05:19:55.711595860 +0100
18755 @@ -1,4 +1,4 @@
18756 -/* $Id: isdn_ttyfax.c,v 1.1.4.1 2001/11/20 14:19:34 kai Exp $
18757 +/* $Id: isdn_ttyfax.c,v 1.9 2001/09/24 13:22:43 kai Exp $
18758   *
18759   * Linux ISDN subsystem, tty_fax AT-command emulator (linklevel).
18760   *
18761 @@ -20,7 +20,7 @@
18762  #include "isdn_ttyfax.h"
18763  
18764  
18765 -static char *isdn_tty_fax_revision = "$Revision: 1.1.4.1 $";
18766 +static char *isdn_tty_fax_revision = "$Revision: 1.9 $";
18767  
18768  #define PARSE_ERROR1 { isdn_tty_fax_modem_result(1, info); return 1; }
18769  
18770 @@ -148,6 +148,7 @@
18771         }
18772  }
18773  
18774 +#ifdef ISDN_TTY_FCLASS1
18775  int
18776  isdn_tty_fax_command1(modem_info * info, isdn_ctrl * c)
18777  {
18778 @@ -186,6 +187,7 @@
18779         }
18780         return (0);
18781  }
18782 +#endif
18783  
18784  int
18785  isdn_tty_fax_command(modem_info * info, isdn_ctrl * c)
18786 @@ -193,8 +195,10 @@
18787         T30_s *f = info->fax;
18788         char rs[10];
18789  
18790 +#ifdef ISDN_TTY_FCLASS1
18791         if (TTY_IS_FCLASS1(info))
18792                 return (isdn_tty_fax_command1(info, c));
18793 +#endif
18794  
18795  #ifdef ISDN_TTY_FAX_CMD_DEBUG
18796         printk(KERN_DEBUG "isdn_tty: Fax cmd %d on ttyI%d\n",
18797 @@ -312,6 +316,7 @@
18798         }
18799  }
18800  
18801 +#ifdef ISDN_TTY_FCLASS1
18802  /*
18803   * Parse AT+F.. FAX class 1 commands
18804   */
18805 @@ -403,6 +408,7 @@
18806         }
18807         return 1;
18808  }
18809 +#endif
18810  
18811  /*
18812   * Parse AT+F.. FAX class 2 commands
18813 @@ -970,6 +976,70 @@
18814                 }
18815                 return 0;
18816         }
18817 +#if 0
18818 +       /* LO=n - Flow control opts */
18819 +       if (!strncmp(p[0], "LO", 2)) {  /* TODO */
18820 +               p[0] += 2;
18821 +               switch (*p[0]) {
18822 +                       case '?':
18823 +                               p[0]++;
18824 +                               sprintf(rs, "\r\n%d", f->lo);
18825 +                               isdn_tty_at_cout(rs, info);
18826 +                               break;
18827 +                       case '=':
18828 +                               p[0]++;
18829 +                               if (*p[0] == '?') {
18830 +                                       p[0]++;
18831 +                                       sprintf(rs, "\r\n0,1,2");
18832 +                                       isdn_tty_at_cout(rs, info);
18833 +                               } else {
18834 +                                       par = isdn_getnum(p);
18835 +                                       if ((par < 0) || (par > 2))
18836 +                                               PARSE_ERROR1;
18837 +                                       f->lo = par;
18838 +#ifdef ISDN_TTY_FAX_STAT_DEBUG
18839 +                                       printk(KERN_DEBUG "isdn_tty: Fax FLO=%d\n", par);
18840 +#endif
18841 +                               }
18842 +                               break;
18843 +                       default:
18844 +                               PARSE_ERROR1;
18845 +               }
18846 +               return 0;
18847 +       }
18848 +#endif
18849 +#if 0
18850 +       /* LPL=n - Doc for polling cmd  */
18851 +       if (!strncmp(p[0], "LPL", 3)) {         /* TODO */
18852 +               p[0] += 3;
18853 +               switch (*p[0]) {
18854 +                       case '?':
18855 +                               p[0]++;
18856 +                               sprintf(rs, "\r\n%d", f->lpl);
18857 +                               isdn_tty_at_cout(rs, info);
18858 +                               break;
18859 +                       case '=':
18860 +                               p[0]++;
18861 +                               if (*p[0] == '?') {
18862 +                                       p[0]++;
18863 +                                       sprintf(rs, "\r\n0,1");
18864 +                                       isdn_tty_at_cout(rs, info);
18865 +                               } else {
18866 +                                       par = isdn_getnum(p);
18867 +                                       if ((par < 0) || (par > 1))
18868 +                                               PARSE_ERROR1;
18869 +                                       f->lpl = par;
18870 +#ifdef ISDN_TTY_FAX_STAT_DEBUG
18871 +                                       printk(KERN_DEBUG "isdn_tty: Fax FLPL=%d\n", par);
18872 +#endif
18873 +                               }
18874 +                               break;
18875 +                       default:
18876 +                               PARSE_ERROR1;
18877 +               }
18878 +               return 0;
18879 +       }
18880 +#endif
18881  
18882         /* MDL? - DCE Model       */
18883         if (!strncmp(p[0], "MDL?", 4)) {
18884 @@ -1049,6 +1119,38 @@
18885                 }
18886                 return 0;
18887         }
18888 +#if 0
18889 +       /* PTS=n - Page transfer status       */
18890 +       if (!strncmp(p[0], "PTS", 3)) {         /* TODO */
18891 +               p[0] += 3;
18892 +               switch (*p[0]) {
18893 +                       case '?':
18894 +                               p[0]++;
18895 +                               sprintf(rs, "\r\n%d", f->pts);
18896 +                               isdn_tty_at_cout(rs, info);
18897 +                               break;
18898 +                       case '=':
18899 +                               p[0]++;
18900 +                               if (*p[0] == '?') {
18901 +                                       p[0]++;
18902 +                                       sprintf(rs, "\r\n0-5");
18903 +                                       isdn_tty_at_cout(rs, info);
18904 +                               } else {
18905 +                                       par = isdn_getnum(p);
18906 +                                       if ((par < 0) || (par > 5))
18907 +                                               PARSE_ERROR1;
18908 +                                       f->pts = par;
18909 +#ifdef ISDN_TTY_FAX_STAT_DEBUG
18910 +                                       printk(KERN_DEBUG "isdn_tty: Fax FPTS=%d\n", par);
18911 +#endif
18912 +                               }
18913 +                               break;
18914 +                       default:
18915 +                               PARSE_ERROR1;
18916 +               }
18917 +               return 0;
18918 +       }
18919 +#endif
18920  
18921         /* REL=n - Phase C received EOL alignment */
18922         if (!strncmp(p[0], "REL", 3)) {
18923 @@ -1091,6 +1193,38 @@
18924                 isdn_tty_at_cout(rs, info);
18925                 return 0;
18926         }
18927 +#if 0
18928 +       /* SPL=n - Enable polling */
18929 +       if (!strncmp(p[0], "SPL", 3)) {         /* TODO */
18930 +               p[0] += 3;
18931 +               switch (*p[0]) {
18932 +                       case '?':
18933 +                               p[0]++;
18934 +                               sprintf(rs, "\r\n%d", f->spl);
18935 +                               isdn_tty_at_cout(rs, info);
18936 +                               break;
18937 +                       case '=':
18938 +                               p[0]++;
18939 +                               if (*p[0] == '?') {
18940 +                                       p[0]++;
18941 +                                       sprintf(rs, "\r\n0,1");
18942 +                                       isdn_tty_at_cout(rs, info);
18943 +                               } else {
18944 +                                       par = isdn_getnum(p);
18945 +                                       if ((par < 0) || (par > 1))
18946 +                                               PARSE_ERROR1;
18947 +                                       f->spl = par;
18948 +#ifdef ISDN_TTY_FAX_STAT_DEBUG
18949 +                                       printk(KERN_DEBUG "isdn_tty: Fax FSPL=%d\n", par);
18950 +#endif
18951 +                               }
18952 +                               break;
18953 +                       default:
18954 +                               PARSE_ERROR1;
18955 +               }
18956 +               return 0;
18957 +       }
18958 +#endif
18959  
18960         /* Phase C Transmit Data Block Size */
18961         if (!strncmp(p[0], "TBC=", 4)) {        /* dummy, not used */
18962 @@ -1116,7 +1250,9 @@
18963  {
18964         if (TTY_IS_FCLASS2(info))
18965                 return (isdn_tty_cmd_FCLASS2(p, info));
18966 +#ifdef ISDN_TTY_FCLASS1
18967         else if (TTY_IS_FCLASS1(info))
18968                 return (isdn_tty_cmd_FCLASS1(p, info));
18969 +#endif
18970         PARSE_ERROR1;
18971  }
18972 Index: linux-2.4.35.4/drivers/isdn/isdn_ttyfax.h
18973 ===================================================================
18974 --- linux-2.4.35.4.orig/drivers/isdn/isdn_ttyfax.h      2007-12-15 05:19:40.670738731 +0100
18975 +++ linux-2.4.35.4/drivers/isdn/isdn_ttyfax.h   2007-12-15 05:19:55.711595860 +0100
18976 @@ -1,4 +1,4 @@
18977 -/* $Id: isdn_ttyfax.h,v 1.1.4.1 2001/11/20 14:19:34 kai Exp $
18978 +/* $Id: isdn_ttyfax.h,v 1.3 2001/09/24 13:22:43 kai Exp $
18979   *
18980   * header for Linux ISDN subsystem, tty_fax related functions (linklevel).
18981   *
18982 Index: linux-2.4.35.4/drivers/isdn/isdn_v110.c
18983 ===================================================================
18984 --- linux-2.4.35.4.orig/drivers/isdn/isdn_v110.c        2007-12-15 05:19:40.678739186 +0100
18985 +++ linux-2.4.35.4/drivers/isdn/isdn_v110.c     2007-12-15 05:19:55.711595860 +0100
18986 @@ -1,4 +1,4 @@
18987 -/* $Id: isdn_v110.c,v 1.1.4.1 2001/11/20 14:19:34 kai Exp $
18988 +/* $Id: isdn_v110.c,v 1.8 2001/09/24 13:22:43 kai Exp $
18989   *
18990   * Linux ISDN subsystem, V.110 related functions (linklevel).
18991   *
18992 @@ -19,7 +19,7 @@
18993  
18994  #undef ISDN_V110_DEBUG
18995  
18996 -char *isdn_v110_revision = "$Revision: 1.1.4.1 $";
18997 +char *isdn_v110_revision = "$Revision: 1.8 $";
18998  
18999  #define V110_38400 255
19000  #define V110_19200  15
19001 @@ -138,6 +138,14 @@
19002                 return;
19003  #ifdef ISDN_V110_DEBUG
19004         printk(KERN_DEBUG "v110 close\n");
19005 +#if 0
19006 +       printk(KERN_DEBUG "isdn_v110_close: nbytes=%d\n", v->nbytes);
19007 +       printk(KERN_DEBUG "isdn_v110_close: nbits=%d\n", v->nbits);
19008 +       printk(KERN_DEBUG "isdn_v110_close: key=%d\n", v->key);
19009 +       printk(KERN_DEBUG "isdn_v110_close: SyncInit=%d\n", v->SyncInit);
19010 +       printk(KERN_DEBUG "isdn_v110:close: decodelen=%d\n", v->decodelen);
19011 +       printk(KERN_DEBUG "isdn_v110_close: framelen=%d\n", v->framelen);
19012 +#endif
19013  #endif
19014         kfree(v->encodebuf);
19015         kfree(v);
19016 Index: linux-2.4.35.4/drivers/isdn/isdn_v110.h
19017 ===================================================================
19018 --- linux-2.4.35.4.orig/drivers/isdn/isdn_v110.h        2007-12-15 05:19:40.686739644 +0100
19019 +++ linux-2.4.35.4/drivers/isdn/isdn_v110.h     2007-12-15 05:19:55.715596089 +0100
19020 @@ -1,4 +1,4 @@
19021 -/* $Id: isdn_v110.h,v 1.1.4.1 2001/11/20 14:19:34 kai Exp $
19022 +/* $Id: isdn_v110.h,v 1.5 2001/09/24 13:22:43 kai Exp $
19023   *
19024   * Linux ISDN subsystem, V.110 related functions (linklevel).
19025   *
19026 Index: linux-2.4.35.4/drivers/isdn/isdn_x25iface.c
19027 ===================================================================
19028 --- linux-2.4.35.4.orig/drivers/isdn/isdn_x25iface.c    2007-12-15 05:19:40.694740100 +0100
19029 +++ linux-2.4.35.4/drivers/isdn/isdn_x25iface.c 2007-12-15 05:19:55.715596089 +0100
19030 @@ -1,4 +1,4 @@
19031 -/* $Id: isdn_x25iface.c,v 1.1.4.1 2001/11/20 14:19:34 kai Exp $
19032 +/* $Id: isdn_x25iface.c,v 1.10 2001/09/24 13:22:43 kai Exp $
19033   *
19034   * Linux ISDN subsystem, X.25 related functions
19035   *
19036 Index: linux-2.4.35.4/drivers/isdn/isdn_x25iface.h
19037 ===================================================================
19038 --- linux-2.4.35.4.orig/drivers/isdn/isdn_x25iface.h    2007-12-15 05:19:40.702740555 +0100
19039 +++ linux-2.4.35.4/drivers/isdn/isdn_x25iface.h 2007-12-15 05:19:55.715596089 +0100
19040 @@ -1,4 +1,4 @@
19041 -/* $Id: isdn_x25iface.h,v 1.1.4.1 2001/11/20 14:19:34 kai Exp $
19042 +/* $Id: isdn_x25iface.h,v 1.4 2001/09/24 13:22:43 kai Exp $
19043   *
19044   * header for Linux ISDN subsystem, x.25 related functions
19045   *
19046 Index: linux-2.4.35.4/drivers/isdn/isdnloop/isdnloop.c
19047 ===================================================================
19048 --- linux-2.4.35.4.orig/drivers/isdn/isdnloop/isdnloop.c        2007-12-15 05:19:40.706740784 +0100
19049 +++ linux-2.4.35.4/drivers/isdn/isdnloop/isdnloop.c     2007-12-15 05:19:55.715596089 +0100
19050 @@ -1,4 +1,4 @@
19051 -/* $Id: isdnloop.c,v 1.1.4.1 2001/11/20 14:19:37 kai Exp $
19052 +/* $Id: isdnloop.c,v 1.17 2001/08/30 10:45:42 kai Exp $
19053   *
19054   * ISDN low-level module implementing a dummy loop driver.
19055   *
19056 @@ -14,7 +14,7 @@
19057  #include <linux/init.h>
19058  #include "isdnloop.h"
19059  
19060 -static char *revision = "$Revision: 1.1.4.1 $";
19061 +static char *revision = "$Revision$";
19062  static char *isdnloop_id;
19063  
19064  MODULE_DESCRIPTION("ISDN4Linux: Pseudo Driver that simulates an ISDN card");
19065 @@ -22,8 +22,8 @@
19066  MODULE_LICENSE("GPL");
19067  MODULE_PARM(isdnloop_id, "s");
19068  MODULE_PARM_DESC(isdnloop_id, "ID-String of first card");
19069 -
19070 -static int isdnloop_addcard(char *);
19071 +  
19072 +  static int isdnloop_addcard(char *);
19073  
19074  /*
19075   * Free queue completely.
19076 @@ -1542,11 +1542,7 @@
19077         } else
19078                 strcpy(rev, " ??? ");
19079         printk(KERN_NOTICE "isdnloop-ISDN-driver Rev%s\n", rev);
19080 -
19081 -       if (isdnloop_id)
19082 -               return (isdnloop_addcard(isdnloop_id));
19083 -
19084 -       return 0;
19085 +       return (isdnloop_addcard(isdnloop_id));
19086  }
19087  
19088  static void __exit
19089 Index: linux-2.4.35.4/drivers/isdn/isdnloop/isdnloop.h
19090 ===================================================================
19091 --- linux-2.4.35.4.orig/drivers/isdn/isdnloop/isdnloop.h        2007-12-15 05:19:40.714741240 +0100
19092 +++ linux-2.4.35.4/drivers/isdn/isdnloop/isdnloop.h     2007-12-15 05:19:55.719596319 +0100
19093 @@ -1,4 +1,4 @@
19094 -/* $Id: isdnloop.h,v 1.1.4.1 2001/11/20 14:19:37 kai Exp $
19095 +/* $Id$
19096   *
19097   * Loopback lowlevel module for testing of linklevel.
19098   *
19099 Index: linux-2.4.35.4/drivers/isdn/pcbit/callbacks.c
19100 ===================================================================
19101 --- linux-2.4.35.4.orig/drivers/isdn/pcbit/callbacks.c  2007-12-15 05:19:40.722741695 +0100
19102 +++ linux-2.4.35.4/drivers/isdn/pcbit/callbacks.c       2007-12-15 05:19:55.719596319 +0100
19103 @@ -3,7 +3,7 @@
19104   *
19105   * Copyright (C) 1996 Universidade de Lisboa
19106   * 
19107 - * Written by Pedro Roque Marques (pedro_m@yahoo.com)
19108 + * Written by Pedro Roque Marques (roque@di.fc.ul.pt)
19109   *
19110   * This software may be used and distributed according to the terms of 
19111   * the GNU General Public License, incorporated herein by reference.
19112 Index: linux-2.4.35.4/drivers/isdn/pcbit/callbacks.h
19113 ===================================================================
19114 --- linux-2.4.35.4.orig/drivers/isdn/pcbit/callbacks.h  2007-12-15 05:19:40.730742150 +0100
19115 +++ linux-2.4.35.4/drivers/isdn/pcbit/callbacks.h       2007-12-15 05:19:55.719596319 +0100
19116 @@ -3,7 +3,7 @@
19117   *
19118   * Copyright (C) 1996 Universidade de Lisboa
19119   * 
19120 - * Written by Pedro Roque Marques (pedro_m@yahoo.com)
19121 + * Written by Pedro Roque Marques (roque@di.fc.ul.pt)
19122   *
19123   * This software may be used and distributed according to the terms of 
19124   * the GNU General Public License, incorporated herein by reference.
19125 Index: linux-2.4.35.4/drivers/isdn/pcbit/capi.c
19126 ===================================================================
19127 --- linux-2.4.35.4.orig/drivers/isdn/pcbit/capi.c       2007-12-15 05:19:40.738742606 +0100
19128 +++ linux-2.4.35.4/drivers/isdn/pcbit/capi.c    2007-12-15 05:19:55.719596319 +0100
19129 @@ -4,7 +4,7 @@
19130   *
19131   * Copyright (C) 1996 Universidade de Lisboa
19132   * 
19133 - * Written by Pedro Roque Marques (pedro_m@yahoo.com)
19134 + * Written by Pedro Roque Marques (roque@di.fc.ul.pt)
19135   *
19136   * This software may be used and distributed according to the terms of 
19137   * the GNU General Public License, incorporated herein by reference.
19138 Index: linux-2.4.35.4/drivers/isdn/pcbit/capi.h
19139 ===================================================================
19140 --- linux-2.4.35.4.orig/drivers/isdn/pcbit/capi.h       2007-12-15 05:19:40.746743064 +0100
19141 +++ linux-2.4.35.4/drivers/isdn/pcbit/capi.h    2007-12-15 05:19:55.719596319 +0100
19142 @@ -3,7 +3,7 @@
19143   *
19144   * Copyright (C) 1996 Universidade de Lisboa
19145   * 
19146 - * Written by Pedro Roque Marques (pedro_m@yahoo.com)
19147 + * Written by Pedro Roque Marques (roque@di.fc.ul.pt)
19148   *
19149   * This software may be used and distributed according to the terms of 
19150   * the GNU General Public License, incorporated herein by reference.
19151 @@ -63,7 +63,8 @@
19152  extern int capi_decode_debug_188(u_char *hdr, ushort hdrlen);
19153  #endif
19154  
19155 -static inline struct pcbit_chan * 
19156 +extern __inline__ 
19157 +struct pcbit_chan * 
19158  capi_channel(struct pcbit_dev *dev, struct sk_buff *skb)
19159  {
19160         ushort callref;
19161 Index: linux-2.4.35.4/drivers/isdn/pcbit/drv.c
19162 ===================================================================
19163 --- linux-2.4.35.4.orig/drivers/isdn/pcbit/drv.c        2007-12-15 05:19:40.754743519 +0100
19164 +++ linux-2.4.35.4/drivers/isdn/pcbit/drv.c     2007-12-15 05:19:55.723596545 +0100
19165 @@ -3,7 +3,7 @@
19166   *
19167   * Copyright (C) 1996 Universidade de Lisboa
19168   * 
19169 - * Written by Pedro Roque Marques (pedro_m@yahoo.com)
19170 + * Written by Pedro Roque Marques (roque@di.fc.ul.pt)
19171   *
19172   * This software may be used and distributed according to the terms of 
19173   * the GNU General Public License, incorporated herein by reference.
19174 @@ -35,7 +35,9 @@
19175  #include <linux/isdnif.h>
19176  #include <asm/string.h>
19177  #include <asm/io.h>
19178 +#ifdef COMPAT_HAS_ISA_IOREMAP
19179  #include <linux/ioport.h>
19180 +#endif
19181  
19182  #include "pcbit.h"
19183  #include "edss1.h"
19184 @@ -89,6 +91,7 @@
19185  
19186         if (mem_base >= 0xA0000 && mem_base <= 0xFFFFF ) {
19187                 dev->ph_mem = mem_base;
19188 +#ifdef COMPAT_HAS_ISA_IOREMAP
19189                 if (check_mem_region(dev->ph_mem, 4096)) {
19190                         printk(KERN_WARNING
19191                                 "PCBIT: memory region %lx-%lx already in use\n",
19192 @@ -100,6 +103,9 @@
19193                         request_mem_region(dev->ph_mem, 4096, "PCBIT mem");
19194                 }
19195                 dev->sh_mem = (unsigned char*)ioremap(dev->ph_mem, 4096);
19196 +#else
19197 +               dev->sh_mem = (unsigned char*) mem_base;
19198 +#endif
19199         }
19200         else 
19201         {
19202 @@ -112,8 +118,10 @@
19203         dev->b1 = kmalloc(sizeof(struct pcbit_chan), GFP_KERNEL);
19204         if (!dev->b1) {
19205                 printk("pcbit_init: couldn't malloc pcbit_chan struct\n");
19206 +#ifdef COMPAT_HAS_ISA_IOREMAP
19207                 iounmap((unsigned char*)dev->sh_mem);
19208                 release_mem_region(dev->ph_mem, 4096);
19209 +#endif
19210                 kfree(dev);
19211                 return -ENOMEM;
19212         }
19213 @@ -122,8 +130,10 @@
19214         if (!dev->b2) {
19215                 printk("pcbit_init: couldn't malloc pcbit_chan struct\n");
19216                 kfree(dev->b1);
19217 +#ifdef COMPAT_HAS_ISA_IOREMAP
19218                 iounmap((unsigned char*)dev->sh_mem);
19219                 release_mem_region(dev->ph_mem, 4096);
19220 +#endif
19221                 kfree(dev);
19222                 return -ENOMEM;
19223         }
19224 @@ -144,8 +154,10 @@
19225         {
19226                 kfree(dev->b1);
19227                 kfree(dev->b2);
19228 +#ifdef COMPAT_HAS_ISA_IOREMAP
19229                 iounmap((unsigned char*)dev->sh_mem);
19230                 release_mem_region(dev->ph_mem, 4096);
19231 +#endif
19232                 kfree(dev);
19233                 dev_pcbit[board] = NULL;
19234                 return -EIO;
19235 @@ -166,8 +178,10 @@
19236                 free_irq(irq, dev);
19237                 kfree(dev->b1);
19238                 kfree(dev->b2);
19239 +#ifdef COMPAT_HAS_ISA_IOREMAP
19240                 iounmap((unsigned char*)dev->sh_mem);
19241                 release_mem_region(dev->ph_mem, 4096);
19242 +#endif
19243                 kfree(dev);
19244                 dev_pcbit[board] = NULL;
19245                 return -EIO;
19246 @@ -197,8 +211,10 @@
19247                 free_irq(irq, dev);
19248                 kfree(dev->b1);
19249                 kfree(dev->b2);
19250 +#ifdef COMPAT_HAS_ISA_IOREMAP
19251                 iounmap((unsigned char*)dev->sh_mem);
19252                 release_mem_region(dev->ph_mem, 4096);
19253 +#endif
19254                 kfree(dev);
19255                 dev_pcbit[board] = NULL;
19256                 return -EIO;
19257 @@ -235,8 +251,10 @@
19258                         del_timer(&dev->b2->fsm_timer);
19259                 kfree(dev->b1);
19260                 kfree(dev->b2);
19261 +#ifdef COMPAT_HAS_ISA_IOREMAP
19262                 iounmap((unsigned char*)dev->sh_mem);
19263                 release_mem_region(dev->ph_mem, 4096);
19264 +#endif
19265                 kfree(dev);
19266         }
19267  }
19268 @@ -430,7 +448,7 @@
19269         switch(dev->l2_state) {
19270         case L2_LWMODE:
19271                 /* check (size <= rdp_size); write buf into board */
19272 -               if (len < 0 || len > BANK4 + 1)
19273 +               if (len > BANK4 + 1)
19274                 {
19275                         printk("pcbit_writecmd: invalid length %d\n", len);
19276                         return -EINVAL;
19277 @@ -609,6 +627,20 @@
19278                        dev->b1->s_refnum, 
19279                        dev->b2->s_refnum);
19280  #endif
19281 +#if 0  
19282 +               if (dev->b1->s_refnum == refnum)
19283 +                       chan = dev->b1;
19284 +               else { 
19285 +                  
19286 +                       if (dev->b2->s_refnum == refnum)
19287 +                               chan = dev->b2;
19288 +                       else {
19289 +                               chan = NULL;
19290 +                               printk(KERN_WARNING "Connection Confirm - refnum doesn't match chan\n");
19291 +                               break;
19292 +                       }
19293 +               }
19294 +#else
19295                 /* We just try to find a channel in the right state */
19296  
19297                 if (dev->b1->fsm_state == ST_CALL_INIT)
19298 @@ -622,6 +654,7 @@
19299                                 break;
19300                         }
19301                 }
19302 +#endif
19303                 if (capi_decode_conn_conf(chan, skb, &complete)) {
19304                         printk(KERN_DEBUG "conn_conf indicates error\n");
19305                         pcbit_fsm_event(dev, chan, EV_ERROR, NULL);
19306 Index: linux-2.4.35.4/drivers/isdn/pcbit/edss1.c
19307 ===================================================================
19308 --- linux-2.4.35.4.orig/drivers/isdn/pcbit/edss1.c      2007-12-15 05:19:40.762743974 +0100
19309 +++ linux-2.4.35.4/drivers/isdn/pcbit/edss1.c   2007-12-15 05:19:55.723596545 +0100
19310 @@ -4,7 +4,7 @@
19311   *
19312   * Copyright (C) 1996 Universidade de Lisboa
19313   * 
19314 - * Written by Pedro Roque Marques (pedro_m@yahoo.com)
19315 + * Written by Pedro Roque Marques (roque@di.fc.ul.pt)
19316   *
19317   * This software may be used and distributed according to the terms of 
19318   * the GNU General Public License, incorporated herein by reference.
19319 Index: linux-2.4.35.4/drivers/isdn/pcbit/edss1.h
19320 ===================================================================
19321 --- linux-2.4.35.4.orig/drivers/isdn/pcbit/edss1.h      2007-12-15 05:19:40.770744430 +0100
19322 +++ linux-2.4.35.4/drivers/isdn/pcbit/edss1.h   2007-12-15 05:19:55.723596545 +0100
19323 @@ -3,7 +3,7 @@
19324   *
19325   * Copyright (C) 1996 Universidade de Lisboa
19326   * 
19327 - * Written by Pedro Roque Marques (pedro_m@yahoo.com)
19328 + * Written by Pedro Roque Marques (roque@di.fc.ul.pt)
19329   *
19330   * This software may be used and distributed according to the terms of 
19331   * the GNU General Public License, incorporated herein by reference.
19332 Index: linux-2.4.35.4/drivers/isdn/pcbit/layer2.c
19333 ===================================================================
19334 --- linux-2.4.35.4.orig/drivers/isdn/pcbit/layer2.c     2007-12-15 05:19:40.774744659 +0100
19335 +++ linux-2.4.35.4/drivers/isdn/pcbit/layer2.c  2007-12-15 05:19:55.723596545 +0100
19336 @@ -3,7 +3,7 @@
19337   *
19338   * Copyright (C) 1996 Universidade de Lisboa
19339   *
19340 - * Written by Pedro Roque Marques (pedro_m@yahoo.com)
19341 + * Written by Pedro Roque Marques (roque@di.fc.ul.pt)
19342   *
19343   * This software may be used and distributed according to the terms of
19344   * the GNU General Public License, incorporated herein by reference.
19345 @@ -369,11 +369,16 @@
19346  
19347                 if (dev->read_frame) {
19348                         printk(KERN_DEBUG "pcbit_receive: Type 0 frame and read_frame != NULL\n");
19349 +#if 0
19350 +                       pcbit_l2_error(dev);
19351 +                       return;
19352 +#else
19353                         /* discard previous queued frame */
19354                         if (dev->read_frame->skb)
19355                                 kfree_skb(dev->read_frame->skb);
19356                         kfree(dev->read_frame);
19357                         dev->read_frame = NULL;
19358 +#endif
19359                 }
19360                 frame = kmalloc(sizeof(struct frame_buf), GFP_ATOMIC);
19361  
19362 @@ -449,10 +454,14 @@
19363  
19364                 if (!(frame = dev->read_frame)) {
19365                         printk("Type 1 frame and no frame queued\n");
19366 +#if 1
19367                         /* usually after an error: toss frame */
19368                         dev->readptr += tt;
19369                         if (dev->readptr > dev->sh_mem + BANK2 + BANKLEN)
19370                                 dev->readptr -= BANKLEN;
19371 +#else
19372 +                       pcbit_l2_error(dev);
19373 +#endif
19374                         return;
19375  
19376                 }
19377 Index: linux-2.4.35.4/drivers/isdn/pcbit/layer2.h
19378 ===================================================================
19379 --- linux-2.4.35.4.orig/drivers/isdn/pcbit/layer2.h     2007-12-15 05:19:40.782745114 +0100
19380 +++ linux-2.4.35.4/drivers/isdn/pcbit/layer2.h  2007-12-15 05:19:55.731597000 +0100
19381 @@ -3,7 +3,7 @@
19382   *
19383   * Copyright (C) 1996 Universidade de Lisboa
19384   * 
19385 - * Written by Pedro Roque Marques (pedro_m@yahoo.com)
19386 + * Written by Pedro Roque Marques (roque@di.fc.ul.pt)
19387   *
19388   * This software may be used and distributed according to the terms of 
19389   * the GNU General Public License, incorporated herein by reference.
19390 Index: linux-2.4.35.4/drivers/isdn/pcbit/module.c
19391 ===================================================================
19392 --- linux-2.4.35.4.orig/drivers/isdn/pcbit/module.c     2007-12-15 05:19:40.790745570 +0100
19393 +++ linux-2.4.35.4/drivers/isdn/pcbit/module.c  2007-12-15 05:19:55.731597000 +0100
19394 @@ -3,7 +3,7 @@
19395   *
19396   * Copyright (C) 1996 Universidade de Lisboa
19397   * 
19398 - * Written by Pedro Roque Marques (pedro_m@yahoo.com)
19399 + * Written by Pedro Roque Marques (roque@di.fc.ul.pt)
19400   *
19401   * This software may be used and distributed according to the terms of 
19402   * the GNU General Public License, incorporated herein by reference.
19403 @@ -92,6 +92,7 @@
19404  }
19405  
19406  #ifndef MODULE
19407 +#ifdef COMPAT_HAS_NEW_SETUP
19408  #define MAX_PARA       (MAX_PCBIT_CARDS * 2)
19409  static int __init pcbit_setup(char *line)
19410  {
19411 @@ -100,6 +101,11 @@
19412         int ints[MAX_PARA+1];
19413  
19414         str = get_options(line, MAX_PARA, ints);
19415 +#else
19416 +void pcbit_setup(char *str, int *ints)
19417 +{
19418 +       int i, j, argc;
19419 +#endif
19420         argc = ints[0];
19421         i = 0;
19422         j = 1;
19423 @@ -118,9 +124,13 @@
19424  
19425                 i++;
19426         }
19427 +#ifdef COMPAT_HAS_NEW_SETUP
19428         return(1);
19429  }
19430  __setup("pcbit=", pcbit_setup);
19431 +#else
19432 +}
19433 +#endif
19434  #endif
19435  
19436  module_init(pcbit_init);
19437 Index: linux-2.4.35.4/drivers/isdn/pcbit/pcbit.h
19438 ===================================================================
19439 --- linux-2.4.35.4.orig/drivers/isdn/pcbit/pcbit.h      2007-12-15 05:19:40.798746025 +0100
19440 +++ linux-2.4.35.4/drivers/isdn/pcbit/pcbit.h   2007-12-15 05:19:55.731597000 +0100
19441 @@ -3,7 +3,7 @@
19442   *
19443   * Copyright (C) 1996 Universidade de Lisboa
19444   * 
19445 - * Written by Pedro Roque Marques (pedro_m@yahoo.com)
19446 + * Written by Pedro Roque Marques (roque@di.fc.ul.pt)
19447   *
19448   * This software may be used and distributed according to the terms of 
19449   * the GNU General Public License, incorporated herein by reference.
19450 Index: linux-2.4.35.4/drivers/isdn/sc/card.h
19451 ===================================================================
19452 --- linux-2.4.35.4.orig/drivers/isdn/sc/card.h  2007-12-15 05:19:40.806746483 +0100
19453 +++ linux-2.4.35.4/drivers/isdn/sc/card.h       2007-12-15 05:19:55.731597000 +0100
19454 @@ -1,4 +1,4 @@
19455 -/* $Id: card.h,v 1.1.4.1 2001/11/20 14:19:37 kai Exp $
19456 +/* $Id$
19457   *
19458   * Driver parameters for SpellCaster ISA ISDN adapters
19459   *
19460 Index: linux-2.4.35.4/drivers/isdn/sc/command.c
19461 ===================================================================
19462 --- linux-2.4.35.4.orig/drivers/isdn/sc/command.c       2007-12-15 05:19:40.814746939 +0100
19463 +++ linux-2.4.35.4/drivers/isdn/sc/command.c    2007-12-15 05:19:55.735597229 +0100
19464 @@ -1,4 +1,4 @@
19465 -/* $Id: command.c,v 1.1.4.1 2001/11/20 14:19:37 kai Exp $
19466 +/* $Id$
19467   *
19468   * Copyright (C) 1996  SpellCaster Telecommunications Inc.
19469   *
19470 @@ -95,7 +95,7 @@
19471                 if(adapter[i]->driverId == driver)
19472                         return i;
19473         }
19474 -       return -ENODEV;
19475 +       return -NODEV;
19476  }
19477  
19478  /* 
19479 Index: linux-2.4.35.4/drivers/isdn/sc/debug.c
19480 ===================================================================
19481 --- linux-2.4.35.4.orig/drivers/isdn/sc/debug.c 2007-12-15 05:19:40.822747394 +0100
19482 +++ linux-2.4.35.4/drivers/isdn/sc/debug.c      2007-12-15 05:19:55.735597229 +0100
19483 @@ -1,4 +1,4 @@
19484 -/* $Id: debug.c,v 1.1.4.1 2001/11/20 14:19:37 kai Exp $
19485 +/* $Id$
19486   *
19487   * Copyright (C) 1996  SpellCaster Telecommunications Inc.
19488   *
19489 Index: linux-2.4.35.4/drivers/isdn/sc/debug.h
19490 ===================================================================
19491 --- linux-2.4.35.4.orig/drivers/isdn/sc/debug.h 2007-12-15 05:19:40.830747849 +0100
19492 +++ linux-2.4.35.4/drivers/isdn/sc/debug.h      2007-12-15 05:19:55.735597229 +0100
19493 @@ -1,4 +1,4 @@
19494 -/* $Id: debug.h,v 1.1.4.1 2001/11/20 14:19:37 kai Exp $
19495 +/* $Id$
19496   *
19497   * Copyright (C) 1996  SpellCaster Telecommunications Inc.
19498   *
19499 Index: linux-2.4.35.4/drivers/isdn/sc/event.c
19500 ===================================================================
19501 --- linux-2.4.35.4.orig/drivers/isdn/sc/event.c 2007-12-15 05:19:40.838748305 +0100
19502 +++ linux-2.4.35.4/drivers/isdn/sc/event.c      2007-12-15 05:19:55.735597229 +0100
19503 @@ -1,4 +1,4 @@
19504 -/* $Id: event.c,v 1.1.4.1 2001/11/20 14:19:37 kai Exp $
19505 +/* $Id$
19506   *
19507   * Copyright (C) 1996  SpellCaster Telecommunications Inc.
19508   *
19509 Index: linux-2.4.35.4/drivers/isdn/sc/init.c
19510 ===================================================================
19511 --- linux-2.4.35.4.orig/drivers/isdn/sc/init.c  2007-12-15 05:19:40.846748763 +0100
19512 +++ linux-2.4.35.4/drivers/isdn/sc/init.c       2007-12-15 05:19:55.735597229 +0100
19513 @@ -514,6 +514,15 @@
19514         schedule_timeout(HZ);
19515         sig = readl(rambase + SIG_OFFSET);
19516         pr_debug("Looking for a signature, got 0x%x\n", sig);
19517 +#if 0
19518 +/*
19519 + * For Gary: 
19520 + * If it's a timing problem, it should be gone with the above schedule()
19521 + * Another possible reason may be the missing volatile in the original
19522 + * code. readl() does this for us.
19523 + */
19524 +       printk("");     /* Hack! Doesn't work without this !!!??? */
19525 +#endif
19526         if(sig == SIGNATURE)
19527                 return PRI_BOARD;
19528  
19529 @@ -525,6 +534,9 @@
19530         schedule_timeout(HZ);
19531         sig = readl(rambase + SIG_OFFSET);
19532         pr_debug("Looking for a signature, got 0x%x\n", sig);
19533 +#if 0
19534 +       printk("");     /* Hack! Doesn't work without this !!!??? */
19535 +#endif
19536         if(sig == SIGNATURE)
19537                 return BRI_BOARD;
19538  
19539 Index: linux-2.4.35.4/drivers/isdn/sc/interrupt.c
19540 ===================================================================
19541 --- linux-2.4.35.4.orig/drivers/isdn/sc/interrupt.c     2007-12-15 05:19:40.850748989 +0100
19542 +++ linux-2.4.35.4/drivers/isdn/sc/interrupt.c  2007-12-15 05:19:55.739597458 +0100
19543 @@ -1,4 +1,4 @@
19544 -/* $Id: interrupt.c,v 1.1.4.1 2001/11/20 14:19:37 kai Exp $
19545 +/* $Id$
19546   *
19547   * Copyright (C) 1996  SpellCaster Telecommunications Inc.
19548   *
19549 Index: linux-2.4.35.4/drivers/isdn/sc/ioctl.c
19550 ===================================================================
19551 --- linux-2.4.35.4.orig/drivers/isdn/sc/ioctl.c 2007-12-15 05:19:40.858749445 +0100
19552 +++ linux-2.4.35.4/drivers/isdn/sc/ioctl.c      2007-12-15 05:19:55.739597458 +0100
19553 @@ -23,6 +23,9 @@
19554  
19555  extern board *adapter[];
19556  
19557 +#if 0
19558 +static char *ChannelStates[] = { "Idle", "Ready", "Connecting", "Connected", "Disconnecting" };
19559 +#endif
19560  
19561  int GetStatus(int card, boardInfo *);
19562  
19563 Index: linux-2.4.35.4/drivers/isdn/sc/message.c
19564 ===================================================================
19565 --- linux-2.4.35.4.orig/drivers/isdn/sc/message.c       2007-12-15 05:19:40.866749903 +0100
19566 +++ linux-2.4.35.4/drivers/isdn/sc/message.c    2007-12-15 05:19:55.739597458 +0100
19567 @@ -1,4 +1,4 @@
19568 -/* $Id: message.c,v 1.1.4.1 2001/11/20 14:19:37 kai Exp $
19569 +/* $Id$
19570   *
19571   * functions for sending and receiving control messages
19572   *
19573 Index: linux-2.4.35.4/drivers/isdn/sc/message.h
19574 ===================================================================
19575 --- linux-2.4.35.4.orig/drivers/isdn/sc/message.h       2007-12-15 05:19:40.874750358 +0100
19576 +++ linux-2.4.35.4/drivers/isdn/sc/message.h    2007-12-15 05:19:55.739597458 +0100
19577 @@ -1,4 +1,4 @@
19578 -/* $Id: message.h,v 1.1.4.1 2001/11/20 14:19:37 kai Exp $
19579 +/* $Id$
19580   *
19581   * Copyright (C) 1996  SpellCaster Telecommunications Inc.
19582   *
19583 Index: linux-2.4.35.4/drivers/isdn/sc/packet.c
19584 ===================================================================
19585 --- linux-2.4.35.4.orig/drivers/isdn/sc/packet.c        2007-12-15 05:19:40.882750813 +0100
19586 +++ linux-2.4.35.4/drivers/isdn/sc/packet.c     2007-12-15 05:19:55.739597458 +0100
19587 @@ -1,4 +1,4 @@
19588 -/* $Id: packet.c,v 1.1.4.1 2001/11/20 14:19:37 kai Exp $
19589 +/* $Id$
19590   *
19591   * Copyright (C) 1996  SpellCaster Telecommunications Inc.
19592   *
19593 Index: linux-2.4.35.4/drivers/isdn/sc/shmem.c
19594 ===================================================================
19595 --- linux-2.4.35.4.orig/drivers/isdn/sc/shmem.c 2007-12-15 05:19:40.890751269 +0100
19596 +++ linux-2.4.35.4/drivers/isdn/sc/shmem.c      2007-12-15 05:19:55.743597685 +0100
19597 @@ -1,4 +1,4 @@
19598 -/* $Id: shmem.c,v 1.1.4.1 2001/11/20 14:19:37 kai Exp $
19599 +/* $Id$
19600   *
19601   * Copyright (C) 1996  SpellCaster Telecommunications Inc.
19602   *
19603 Index: linux-2.4.35.4/drivers/isdn/sc/timer.c
19604 ===================================================================
19605 --- linux-2.4.35.4.orig/drivers/isdn/sc/timer.c 2007-12-15 05:19:40.898751724 +0100
19606 +++ linux-2.4.35.4/drivers/isdn/sc/timer.c      2007-12-15 05:19:55.743597685 +0100
19607 @@ -1,4 +1,4 @@
19608 -/* $Id: timer.c,v 1.1.4.1 2001/11/20 14:19:37 kai Exp $
19609 +/* $Id$
19610   *
19611   * Copyright (C) 1996  SpellCaster Telecommunications Inc.
19612   *
19613 Index: linux-2.4.35.4/drivers/isdn/tpam/tpam.h
19614 ===================================================================
19615 --- linux-2.4.35.4.orig/drivers/isdn/tpam/tpam.h        2007-12-15 05:19:40.906752182 +0100
19616 +++ linux-2.4.35.4/drivers/isdn/tpam/tpam.h     2007-12-15 05:19:55.743597685 +0100
19617 @@ -1,4 +1,4 @@
19618 -/* $Id: tpam.h,v 1.1.2.1 2001/11/20 14:19:37 kai Exp $
19619 +/* $Id: tpam.h,v 1.3 2001/09/24 13:23:12 kai Exp $
19620   *
19621   * Turbo PAM ISDN driver for Linux. (Kernel Driver)
19622   *
19623 Index: linux-2.4.35.4/drivers/isdn/tpam/tpam_commands.c
19624 ===================================================================
19625 --- linux-2.4.35.4.orig/drivers/isdn/tpam/tpam_commands.c       2007-12-15 05:19:40.914752638 +0100
19626 +++ linux-2.4.35.4/drivers/isdn/tpam/tpam_commands.c    2007-12-15 05:19:55.743597685 +0100
19627 @@ -1,4 +1,4 @@
19628 -/* $Id: tpam_commands.c,v 1.1.2.1 2001/11/20 14:19:37 kai Exp $
19629 +/* $Id: tpam_commands.c,v 1.3 2001/09/24 13:23:12 kai Exp $
19630   *
19631   * Turbo PAM ISDN driver for Linux. (Kernel Driver - ISDN commands)
19632   *
19633 Index: linux-2.4.35.4/drivers/isdn/tpam/tpam_crcpc.c
19634 ===================================================================
19635 --- linux-2.4.35.4.orig/drivers/isdn/tpam/tpam_crcpc.c  2007-12-15 05:19:40.922753093 +0100
19636 +++ linux-2.4.35.4/drivers/isdn/tpam/tpam_crcpc.c       2007-12-15 05:19:55.747597911 +0100
19637 @@ -1,4 +1,4 @@
19638 -/* $Id: tpam_crcpc.c,v 1.1.2.1 2001/11/20 14:19:37 kai Exp $
19639 +/* $Id$
19640   *
19641   * Turbo PAM ISDN driver for Linux. (Kernel Driver - CRC encoding)
19642   *
19643 Index: linux-2.4.35.4/drivers/isdn/tpam/tpam_hdlc.c
19644 ===================================================================
19645 --- linux-2.4.35.4.orig/drivers/isdn/tpam/tpam_hdlc.c   2007-12-15 05:19:40.926753322 +0100
19646 +++ linux-2.4.35.4/drivers/isdn/tpam/tpam_hdlc.c        2007-12-15 05:19:55.747597911 +0100
19647 @@ -1,4 +1,4 @@
19648 -/* $Id: tpam_hdlc.c,v 1.1.2.1 2001/11/20 14:19:37 kai Exp $
19649 +/* $Id: tpam_hdlc.c,v 1.3 2001/09/24 13:23:12 kai Exp $
19650   *
19651   * Turbo PAM ISDN driver for Linux. (Kernel Driver - HDLC encoding)
19652   *
19653 Index: linux-2.4.35.4/drivers/isdn/tpam/tpam_main.c
19654 ===================================================================
19655 --- linux-2.4.35.4.orig/drivers/isdn/tpam/tpam_main.c   2007-12-15 05:19:40.934753777 +0100
19656 +++ linux-2.4.35.4/drivers/isdn/tpam/tpam_main.c        2007-12-15 05:19:55.747597911 +0100
19657 @@ -1,4 +1,4 @@
19658 -/* $Id: tpam_main.c,v 1.1.2.2 2001/12/09 18:45:14 kai Exp $
19659 +/* $Id$
19660   *
19661   * Turbo PAM ISDN driver for Linux. (Kernel Driver - main routines)
19662   *
19663 @@ -254,7 +254,7 @@
19664         name:           "tpam",
19665         id_table:       tpam_pci_tbl,
19666         probe:          tpam_probe,
19667 -       remove:         __devexit_p(tpam_remove),
19668 +       remove:         tpam_remove,
19669  };
19670  
19671  static int __init tpam_init(void) {
19672 Index: linux-2.4.35.4/drivers/isdn/tpam/tpam_memory.c
19673 ===================================================================
19674 --- linux-2.4.35.4.orig/drivers/isdn/tpam/tpam_memory.c 2007-12-15 05:19:40.942754233 +0100
19675 +++ linux-2.4.35.4/drivers/isdn/tpam/tpam_memory.c      2007-12-15 05:19:55.747597911 +0100
19676 @@ -1,4 +1,4 @@
19677 -/* $Id: tpam_memory.c,v 1.1.2.1 2001/11/20 14:19:37 kai Exp $
19678 +/* $Id$
19679   *
19680   * Turbo PAM ISDN driver for Linux. (Kernel Driver - Board Memory Access)
19681   *
19682 Index: linux-2.4.35.4/drivers/isdn/tpam/tpam_nco.c
19683 ===================================================================
19684 --- linux-2.4.35.4.orig/drivers/isdn/tpam/tpam_nco.c    2007-12-15 05:19:40.950754688 +0100
19685 +++ linux-2.4.35.4/drivers/isdn/tpam/tpam_nco.c 2007-12-15 05:19:55.751598140 +0100
19686 @@ -1,4 +1,4 @@
19687 -/* $Id: tpam_nco.c,v 1.1.2.1 2001/11/20 14:19:37 kai Exp $
19688 +/* $Id$
19689   *
19690   * Turbo PAM ISDN driver for Linux. 
19691   * (Kernel Driver - Low Level NCO Manipulation)
19692 Index: linux-2.4.35.4/drivers/isdn/tpam/tpam_queues.c
19693 ===================================================================
19694 --- linux-2.4.35.4.orig/drivers/isdn/tpam/tpam_queues.c 2007-12-15 05:19:40.962755372 +0100
19695 +++ linux-2.4.35.4/drivers/isdn/tpam/tpam_queues.c      2007-12-15 05:19:55.751598140 +0100
19696 @@ -1,4 +1,4 @@
19697 -/* $Id: tpam_queues.c,v 1.1.2.1 2001/11/20 14:19:37 kai Exp $
19698 +/* $Id$
19699   *
19700   * Turbo PAM ISDN driver for Linux. (Kernel Driver)
19701   *
19702 @@ -146,7 +146,6 @@
19703                 do {
19704                         hpic = readl(card->bar0 + TPAM_HPIC_REGISTER);
19705                         if (waiting_too_long++ > 0xfffffff) {
19706 -                               kfree_skb(skb); 
19707                                 spin_unlock(&card->lock);
19708                                 printk(KERN_ERR "TurboPAM(tpam_irq): "
19709                                                 "waiting too long...\n");
19710 Index: linux-2.4.35.4/include/linux/b1lli.h
19711 ===================================================================
19712 --- linux-2.4.35.4.orig/include/linux/b1lli.h   2007-12-15 05:19:40.966755602 +0100
19713 +++ linux-2.4.35.4/include/linux/b1lli.h        2007-12-15 05:19:55.751598140 +0100
19714 @@ -1,4 +1,4 @@
19715 -/* $Id: b1lli.h,v 1.8.8.3 2001/09/23 22:25:05 kai Exp $
19716 +/* $Id$
19717   *
19718   * ISDN lowlevel-module for AVM B1-card.
19719   *
19720 Index: linux-2.4.35.4/include/linux/b1pcmcia.h
19721 ===================================================================
19722 --- linux-2.4.35.4.orig/include/linux/b1pcmcia.h        2007-12-15 05:19:40.974756057 +0100
19723 +++ linux-2.4.35.4/include/linux/b1pcmcia.h     2007-12-15 05:19:55.751598140 +0100
19724 @@ -1,4 +1,4 @@
19725 -/* $Id: b1pcmcia.h,v 1.1.8.2 2001/09/23 22:25:05 kai Exp $
19726 +/* $Id$
19727   *
19728   * Exported functions of module b1pcmcia to be called by
19729   * avm_cs card services module.
19730 Index: linux-2.4.35.4/include/linux/capi.h
19731 ===================================================================
19732 --- linux-2.4.35.4.orig/include/linux/capi.h    2007-12-15 05:19:40.982756512 +0100
19733 +++ linux-2.4.35.4/include/linux/capi.h 2007-12-15 05:19:55.751598140 +0100
19734 @@ -1,4 +1,4 @@
19735 -/* $Id: capi.h,v 1.1.4.1 2001/11/20 14:19:38 kai Exp $
19736 +/* $Id$
19737   * 
19738   * CAPI 2.0 Interface for Linux
19739   * 
19740 Index: linux-2.4.35.4/include/linux/concap.h
19741 ===================================================================
19742 --- linux-2.4.35.4.orig/include/linux/concap.h  2007-12-15 05:19:40.990756968 +0100
19743 +++ linux-2.4.35.4/include/linux/concap.h       2007-12-15 05:19:55.755598369 +0100
19744 @@ -1,4 +1,4 @@
19745 -/* $Id: concap.h,v 1.2.8.1 2001/09/23 22:25:05 kai Exp $
19746 +/* $Id: concap.h,v 1.3 2001/09/24 13:23:13 kai Exp $
19747   *
19748   * Copyright 1997 by Henner Eisen <eis@baty.hanse.de>
19749   *
19750 @@ -11,6 +11,7 @@
19751  #ifdef __KERNEL__
19752  #include <linux/skbuff.h>
19753  #include <linux/netdevice.h>
19754 +#include <linux/isdn_compat.h>
19755  
19756  /* Stuff to support encapsulation protocols genericly. The encapsulation
19757     protocol is processed at the uppermost layer of the network interface.
19758 Index: linux-2.4.35.4/include/linux/hysdn_if.h
19759 ===================================================================
19760 --- linux-2.4.35.4.orig/include/linux/hysdn_if.h        2007-12-15 05:19:40.998757423 +0100
19761 +++ linux-2.4.35.4/include/linux/hysdn_if.h     2007-12-15 05:19:55.755598369 +0100
19762 @@ -1,4 +1,4 @@
19763 -/* $Id: hysdn_if.h,v 1.1.8.3 2001/09/23 22:25:05 kai Exp $
19764 +/* $Id$
19765   *
19766   * Linux driver for HYSDN cards
19767   * ioctl definitions shared by hynetmgr and driver.
19768 Index: linux-2.4.35.4/include/linux/isdn/tpam.h
19769 ===================================================================
19770 --- linux-2.4.35.4.orig/include/linux/isdn/tpam.h       2007-12-15 05:19:41.006757881 +0100
19771 +++ linux-2.4.35.4/include/linux/isdn/tpam.h    2007-12-15 05:19:55.755598369 +0100
19772 @@ -1,4 +1,4 @@
19773 -/* $Id: tpam.h,v 1.1.2.1 2001/11/20 14:19:38 kai Exp $
19774 +/* $Id$
19775   *
19776   * Turbo PAM ISDN driver for Linux. (Kernel Driver)
19777   *
19778 Index: linux-2.4.35.4/include/linux/isdn.h
19779 ===================================================================
19780 --- linux-2.4.35.4.orig/include/linux/isdn.h    2007-12-15 05:19:41.014758337 +0100
19781 +++ linux-2.4.35.4/include/linux/isdn.h 2007-12-15 05:19:55.755598369 +0100
19782 @@ -1,4 +1,4 @@
19783 -/* $Id: isdn.h,v 1.1.4.1 2001/11/20 14:19:38 kai Exp $
19784 +/* $Id: isdn.h,v 1.125 2001/12/01 23:18:21 detabc Exp $
19785   *
19786   * Main header for the Linux ISDN subsystem (linklevel).
19787   *
19788 @@ -14,6 +14,7 @@
19789  #ifndef __ISDN_H__
19790  #define __ISDN_H__
19791  
19792 +#include <linux/isdn_compat.h>
19793  #include <linux/ioctl.h>
19794  
19795  #ifdef CONFIG_COBALT_MICRO_SERVER
19796 @@ -93,9 +94,15 @@
19797  #define ISDN_LMSNLEN         255 /* Length of tty's Listen-MSN string */
19798  #define ISDN_CMSGLEN        50  /* Length of CONNECT-Message to add for Modem */
19799  
19800 +#ifdef BIG_PHONE_NUMBERS
19801  #define ISDN_MSNLEN          32
19802  #define NET_DV 0x06  /* Data version for isdn_net_ioctl_cfg   */
19803  #define TTY_DV 0x06  /* Data version for iprofd etc.          */
19804 +#else
19805 +#define ISDN_MSNLEN          20
19806 +#define NET_DV 0x05  /* Data version for isdn_net_ioctl_cfg   */
19807 +#define TTY_DV 0x05  /* Data version for iprofd etc.          */
19808 +#endif
19809  
19810  #define INF_DV 0x01  /* Data version for /dev/isdninfo        */
19811  
19812 @@ -187,6 +194,61 @@
19813  #define ISDN_MINOR_PPPMAX   (128 + (ISDN_MAX_CHANNELS-1))
19814  #define ISDN_MINOR_STATUS   255
19815  
19816 +#ifndef CONFIG_ISDN_WITH_ABC
19817 +#undef CONFIG_ISDN_WITH_ABC_CALLB
19818 +#undef CONFIG_ISDN_WITH_ABC_UDP_CHECK
19819 +#undef CONFIG_ISDN_WITH_ABC_UDP_CHECK_HANGUP
19820 +#undef CONFIG_ISDN_WITH_ABC_UDP_CHECK_DIAL
19821 +#undef CONFIG_ISDN_WITH_ABC_OUTGOING_EAZ
19822 +#undef CONFIG_ISDN_WITH_ABC_LCR_SUPPORT
19823 +#undef CONFIG_ISDN_WITH_ABC_RCV_NO_HUPTIMER
19824 +#undef CONFIG_ISDN_WITH_ABC_CH_EXTINUSE
19825 +#undef CONFIG_ISDN_WITH_ABC_CONN_ERROR
19826 +#undef CONFIG_ISDN_WITH_ABC_RAWIPCOMPRESS
19827 +#else /* CONFIG_ISDN_WITH_ABC */
19828 +#include <linux/isdn_dwabc.h>
19829 +
19830 +
19831 +typedef struct DWABCJIFFIES {
19832 +
19833 +       u_long  msec_1000;
19834 +       u_long  msec_500;
19835 +       u_long  msec_400;
19836 +       u_long  msec_200;
19837 +       u_long  msec_100;
19838 +
19839 +} DWABCJIFFIES;
19840 +
19841 +
19842 +#ifdef CONFIG_ISDN_WITH_ABC_NEED_DWSJIFFIES
19843 +DWABCJIFFIES isdn_dwabc_jiffies;
19844 +#else
19845 +extern DWABCJIFFIES isdn_dwabc_jiffies;
19846 +#endif
19847 +#define dwsjiffies (isdn_dwabc_jiffies.msec_1000)
19848 +
19849 +#define ISDN_DW_ABC_FLAG_UNUSED00001           0x00000001L
19850 +#define ISDN_DW_ABC_FLAG_NO_UDP_CHECK          0x00000002L
19851 +#define ISDN_DW_ABC_FLAG_NO_UDP_HANGUP         0x00000004L
19852 +#define ISDN_DW_ABC_FLAG_NO_UDP_DIAL           0x00000008L
19853 +#define ISDN_DW_ABC_FLAG_UNUSED00010           0x00000010L
19854 +#define ISDN_DW_ABC_FLAG_RCV_NO_HUPTIMER       0x00000020L
19855 +#define ISDN_DW_ABC_FLAG_NO_CH_EXTINUSE                0x00000040L
19856 +#define ISDN_DW_ABC_FLAG_NO_CONN_ERROR         0x00000080L
19857 +#define ISDN_DW_ABC_FLAG_BSD_COMPRESS          0x00000100L
19858 +#define ISDN_DW_ABC_FLAG_NO_LCR                                0x00000200L
19859 +#define ISDN_DW_ABC_FLAG_LEASED_LINE           0x00001000L
19860 +
19861 +#define ISDN_DW_ABC_IFFLAG_NODCHAN                     0x00000001L
19862 +#define ISDN_DW_ABC_IFFLAG_BSDAKTIV                    0x00000002L
19863 +
19864 +#define ISDN_DW_ABC_BITLOCK_SEND                       0
19865 +#define ISDN_DW_ABC_BITLOCK_RECEIVE                    1
19866 +
19867 +#endif /* CONFIG_ISDN_WITH_ABC */
19868 +
19869 +
19870 +
19871  #ifdef CONFIG_ISDN_PPP
19872  
19873  #ifdef CONFIG_ISDN_PPP_VJ
19874 @@ -204,9 +266,11 @@
19875  #  include <linux/concap.h>
19876  #endif
19877  
19878 +#ifdef HAVE_DEVFS_FS
19879  #ifdef CONFIG_DEVFS_FS
19880  #  include <linux/devfs_fs_kernel.h>
19881  #endif
19882 +#endif /* HAVE_DEVFS_FS */
19883  
19884  #include <linux/isdnif.h>
19885  
19886 @@ -272,6 +336,12 @@
19887  #define ISDN_NET_CALLBACK   0x04       /* activate callback                 */
19888  #define ISDN_NET_CBHUP      0x08       /* hangup before callback            */
19889  #define ISDN_NET_CBOUT      0x10       /* remote machine does callback      */
19890 +#if 0
19891 +/* Unused??? */
19892 +#define ISDN_NET_CLONE      0x08       /* clone a tmp interface when called */
19893 +#define ISDN_NET_TMP        0x10       /* tmp interface until getting an IP */
19894 +#define ISDN_NET_DYNAMIC    0x20       /* this link is dynamically allocated */
19895 +#endif
19896  
19897  #define ISDN_NET_MAGIC      0x49344C02 /* for paranoia-checking             */
19898  
19899 @@ -386,6 +456,38 @@
19900    char cisco_debserint;                        /* debugging flag of cisco hdlc with slarp */
19901    struct timer_list cisco_timer;
19902    struct tq_struct tqueue;
19903 +#ifdef CONFIG_ISDN_WITH_ABC
19904 +  ulong        dw_abc_flags;
19905 +  ulong        dw_abc_if_flags;
19906 +  int          dw_abc_inuse_secure;
19907 +  ulong        dw_abc_dialstart;
19908 +  int          dw_abc_old_onhtime;
19909 +  int          dw_abc_remote_version;
19910 +  int          dw_abc_bitlocks;
19911 +#ifdef CONFIG_ISDN_WITH_ABC_OUTGOING_EAZ
19912 +  char dw_out_msn[ISDN_MSNLEN]; /* eaz for outgoing call if *out_msn != 0 */
19913 +#endif
19914 +#ifdef CONFIG_ISDN_WITH_ABC_LCR_SUPPORT
19915 +  ulong                                dw_abc_lcr_callid;
19916 +  ulong                                dw_abc_lcr_start_request;
19917 +  ulong                                dw_abc_lcr_end_request;
19918 +  isdn_ctrl                    *dw_abc_lcr_cmd;
19919 +  struct ISDN_DWABC_LCR_IOCTL  *dw_abc_lcr_io;
19920 +#endif
19921 +  ulong dw_abc_bchan_last_connect;
19922 +#ifdef CONFIG_ISDN_WITH_ABC_CONN_ERROR
19923 +  short dw_abc_bchan_errcnt;
19924 +#endif
19925 +#ifdef CONFIG_ISDN_WITH_ABC_RAWIPCOMPRESS
19926 +  void *dw_abc_bsd_compressor;
19927 +  void *dw_abc_bsd_stat_rx;
19928 +  void *dw_abc_bsd_stat_tx;
19929 +#endif
19930 +  ulong        dw_abc_bsd_snd;
19931 +  ulong        dw_abc_bsd_bsd_snd;
19932 +  ulong        dw_abc_bsd_rcv;
19933 +  ulong        dw_abc_bsd_bsd_rcv;
19934 +#endif
19935  } isdn_net_local;
19936  
19937  /* the interface itself */
19938 @@ -608,12 +710,13 @@
19939         int               tflags;                    /* Timer-Flags:               */
19940         /*  see ISDN_TIMER_..defines  */
19941         int               global_flags;
19942 -       infostruct        *infochain;                /* List of open info-devs.    */
19943 -       wait_queue_head_t info_waitq;               /* Wait-Queue for isdninfo    */
19944         struct timer_list timer;                       /* Misc.-function Timer       */
19945         int               chanmap[ISDN_MAX_CHANNELS];/* Map minor->device-channel  */
19946         int               drvmap[ISDN_MAX_CHANNELS]; /* Map minor->driver-index    */
19947         int               usage[ISDN_MAX_CHANNELS];  /* Used by tty/ip/voice       */
19948 +#ifdef CONFIG_ISDN_WITH_ABC_CH_EXTINUSE
19949 +       ulong                     dwabc_chan_external_inuse[ISDN_MAX_CHANNELS];
19950 +#endif
19951         char              num[ISDN_MAX_CHANNELS][ISDN_MSNLEN];
19952         /* Remote number of active ch.*/
19953         int               m_idx[ISDN_MAX_CHANNELS];  /* Index for mdm....          */
19954 @@ -631,6 +734,7 @@
19955         isdn_v110_stream  *v110[ISDN_MAX_CHANNELS];  /* V.110 private data         */
19956         struct semaphore  sem;                       /* serialize list access*/
19957         unsigned long     global_features;
19958 +#ifdef HAVE_DEVFS_FS
19959  #ifdef CONFIG_DEVFS_FS
19960         devfs_handle_t devfs_handle_isdninfo;
19961         devfs_handle_t devfs_handle_isdnctrl;
19962 @@ -640,10 +744,41 @@
19963         devfs_handle_t devfs_handle_ipppX[ISDN_MAX_CHANNELS];
19964  #endif
19965  #endif /* CONFIG_DEVFS_FS */
19966 +#endif /* HAVE_DEVFS_FS */
19967  } isdn_dev;
19968  
19969  extern isdn_dev *dev;
19970  
19971 +#ifdef CONFIG_ISDN_WITH_ABC
19972 +extern int isdn_auto_dial_helper(isdn_net_local *,struct sk_buff *,int);
19973 +extern void dwisdn_nfw_send(isdn_net_local *lp,int drop_only);
19974 +extern void isdn_net_unreachable(struct net_device *,struct sk_buff *,char *);
19975 +extern void isdn_net_log_skb_dwabc(struct sk_buff *,isdn_net_local *,char *);
19976 +extern void isdn_net_hangup(struct net_device *d);
19977 +extern void isdn_dw_clear_if(ulong pm,isdn_net_local *);
19978 +extern void isdn_dwabc_test_phone(isdn_net_local *);
19979 +extern void isdn_dw_abc_init_func(void);
19980 +extern void isdn_dw_abc_release_func(void);
19981 +extern int isdn_dw_abc_reset_interface(isdn_net_local *,int);
19982 +extern int dwabc_bsd_init(isdn_net_local *lp);
19983 +extern void dwabc_bsd_free(isdn_net_local *lp);
19984 +extern struct sk_buff *dwabc_bsd_compress(isdn_net_local *,struct sk_buff *,struct net_device *);
19985 +extern void dwabc_bsd_first_gen(isdn_net_local *);
19986 +extern struct sk_buff *dwabc_bsd_rx_pkt(isdn_net_local *,struct sk_buff *,struct net_device *);
19987 +#ifdef CONFIG_ISDN_WITH_ABC_LCR_SUPPORT
19988 +extern size_t isdn_dw_abc_lcr_readstat(char *,size_t);
19989 +extern ulong isdn_dw_abc_lcr_call_number(isdn_net_local *,isdn_ctrl *);
19990 +extern void isdn_dw_abc_lcr_open(void);
19991 +extern void isdn_dw_abc_lcr_close(void);
19992 +extern int isdn_dw_abc_lcr_ioctl(ulong);
19993 +extern void isdn_dw_abc_lcr_clear(isdn_net_local *);
19994 +extern int isdn_dw_abc_lcr_lock(void);
19995 +extern void isdn_dw_abc_lcr_ulock(void);
19996 +#endif
19997 +#ifdef CONFIG_ISDN_WITH_ABC_UDP_CHECK
19998 +extern int dw_abc_udp_test(struct sk_buff *skb,struct net_device *ndev); 
19999 +#endif
20000 +#endif
20001  
20002  #endif /* __KERNEL__ */
20003  
20004 Index: linux-2.4.35.4/include/linux/isdn_compat.h
20005 ===================================================================
20006 --- /dev/null   1970-01-01 00:00:00.000000000 +0000
20007 +++ linux-2.4.35.4/include/linux/isdn_compat.h  2007-12-15 05:19:55.755598369 +0100
20008 @@ -0,0 +1,261 @@
20009 +/* $Id: isdn_compat.h,v 1.53 2001/09/24 13:23:13 kai Exp $
20010 + *
20011 + * Linux ISDN subsystem
20012 + * Compatibility for various Linux kernel versions
20013 + *
20014 + * This software may be used and distributed according to the terms
20015 + * of the GNU General Public License, incorporated herein by reference.
20016 + *
20017 + */
20018 +
20019 +#ifndef _LINUX_ISDN_COMPAT_H
20020 +#define _LINUX_ISDN_COMPAT_H
20021 +
20022 +#ifdef __KERNEL__
20023 +
20024 +#ifndef ISDN_COMPAT_NOT_GENERIC
20025 +/* when using std2kern -u, this part is left out and instead provided
20026 +   by the .ctrl files */
20027 +
20028 +#include <linux/version.h>
20029 +
20030 +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,2,18)
20031 +
20032 +#define set_current_state(sta) (current->state = sta)
20033 +#define module_init(x) int init_module(void) { return x(); }
20034 +#define module_exit(x) void cleanup_module(void) { x(); }
20035 +#define BUG() do { printk("kernel BUG at %s:%d!\n", __FILE__, __LINE__); *(int *)0 = 0; } while (0)
20036 +#define init_MUTEX(x)                          *(x)=MUTEX
20037 +#define init_MUTEX_LOCKED(x)                   *(x)=MUTEX_LOCKED
20038 +#define __devinit
20039 +#define __devinitdata
20040 +
20041 +#else /* 2.2.18 and later */
20042 +
20043 +#define COMPAT_HAS_NEW_SETUP
20044 +#define COMPAT_HAS_NEW_WAITQ
20045 +
20046 +#endif
20047 +
20048 +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0)
20049 +
20050 +#define dev_kfree_skb_irq(a) dev_kfree_skb(a)
20051 +#define dev_kfree_skb_any(a) dev_kfree_skb(a)
20052 +#define COMPAT_HAS_2_2_PCI
20053 +#define get_pcibase(ps, nr) ps->base_address[nr]
20054 +#define pci_resource_start_io(pdev, nr) ((pdev)->base_address[nr] & PCI_BASE_ADDRESS_IO_MASK)
20055 +#define pci_resource_start_mem(pdev, nr) ((pdev)->base_address[nr] & PCI_BASE_ADDRESS_MEM_MASK)
20056 +#define pci_get_sub_vendor(pdev, id)   pci_read_config_word(pdev, PCI_SUBSYSTEM_VENDOR_ID, &id)
20057 +#define pci_get_sub_system(pdev, id)   pci_read_config_word(pdev, PCI_SUBSYSTEM_ID, &id)
20058 +
20059 +#define __exit
20060 +#define __devinit
20061 +#define __devinitdata
20062 +
20063 +#define net_device device
20064 +#define COMPAT_NO_SOFTNET
20065 +#define netif_running(d) test_bit(LINK_STATE_START, &d->state)
20066 +#define COMPAT_NEED_MPPP_DEFS
20067 +#define spin_lock_bh(lock)
20068 +#define spin_unlock_bh(lock)
20069 +#define COMPAT_NEED_SPIN_LOCK_BH
20070 +#define i_count_read(ic) ic
20071 +#define i_count_inc(ic)  ic++
20072 +#define COMPAT_USE_MODCOUNT_LOCK
20073 +#define devfs_register_chrdev(m,n,f) register_chrdev(m,n,f)
20074 +#define devfs_unregister_chrdev(m,n) unregister_chrdev(m,n)
20075 +#define COMPAT_NEED_PCI_IDS
20076 +#define in_irq() (local_irq_count[smp_processor_id()] != 0)
20077 +
20078 +#else /* 2.4.0 and later */
20079 +
20080 +#define pci_resource_start_io(pdev, nr) pci_resource_start(pdev, nr)
20081 +#define pci_resource_start_mem(pdev, nr) pci_resource_start(pdev, nr)
20082 +#define get_pcibase(ps, nr) ps->resource[nr].start
20083 +#define pci_get_sub_system(pdev, id)   id = pdev->subsystem_device
20084 +#define pci_get_sub_vendor(pdev, id)   id = pdev->subsystem_vendor
20085 +
20086 +#define BIG_PHONE_NUMBERS
20087 +#define COMPAT_HAS_ISA_IOREMAP
20088 +#define i_count_read(ic) atomic_read(&ic)
20089 +#define i_count_inc(ic)  atomic_inc(&ic)
20090 +#define COMPAT_HAS_FILEOP_OWNER
20091 +#define COMPAT_HAVE_NEW_FILLDIR
20092 +#define COMPAT_has_fileops_in_inode
20093 +#define COMPAT_HAS_init_special_inode
20094 +#define COMPAT_d_alloc_root_one_parameter
20095 +#define HAVE_DEVFS_FS
20096 +#define COMPAT_HAS_SCHEDULE_TASK
20097 +#define COMPAT_HAS_USB_IDTAB
20098 +
20099 +#endif
20100 +
20101 +#endif /* ISDN_COMPAT_GENERIC */
20102 +
20103 +#ifdef COMPAT_HAS_2_2_PCI 
20104 +#include <linux/pci.h>
20105 +#ifdef __powerpc__
20106 +static inline int pci_enable_device(struct pci_dev *dev)
20107 +{
20108 +       u16 cmd;
20109 +       pci_read_config_word(dev, PCI_COMMAND, &cmd);
20110 +       cmd |= PCI_COMMAND_MEMORY | PCI_COMMAND_IO | PCI_COMMAND_SERR;
20111 +       cmd &= ~PCI_COMMAND_FAST_BACK;
20112 +       pci_write_config_word(dev, PCI_COMMAND, cmd);
20113 +       return(0);
20114 +}
20115 +#else
20116 +static inline int pci_enable_device(struct pci_dev *dev)
20117 +{
20118 +       return 0;
20119 +}
20120 +#endif /* __powerpc__ */
20121 +
20122 +#define PCI_ANY_ID (~0)
20123 +
20124 +/* as this is included multiple times, we make it inline */
20125 +
20126 +static inline struct pci_dev * pci_find_subsys(unsigned int vendor, unsigned int device,
20127 +                                       unsigned int ss_vendor, unsigned int ss_device,
20128 +                                       struct pci_dev *from)
20129 +{
20130 +       unsigned short subsystem_vendor, subsystem_device;
20131 +
20132 +       while ((from = pci_find_device(vendor, device, from))) {
20133 +               pci_read_config_word(from, PCI_SUBSYSTEM_VENDOR_ID, &subsystem_vendor);
20134 +               pci_read_config_word(from, PCI_SUBSYSTEM_ID, &subsystem_device);
20135 +               if ((ss_vendor == PCI_ANY_ID || subsystem_vendor == ss_vendor) &&
20136 +                   (ss_device == PCI_ANY_ID || subsystem_device == ss_device))
20137 +                       return from;
20138 +       }
20139 +       return NULL;
20140 +}
20141 +#endif
20142 +
20143 +#ifdef COMPAT_NO_SOFTNET
20144 +#include <linux/netdevice.h>
20145 +
20146 +/*
20147 + * Tell upper layers that the network device is ready to xmit more frames.
20148 + */
20149 +static void __inline__ netif_wake_queue(struct net_device * dev)
20150 +{
20151 +       dev->tbusy = 0;
20152 +       mark_bh(NET_BH);
20153 +}
20154 +
20155 +/*
20156 + * called during net_device open()
20157 + */
20158 +static void __inline__ netif_start_queue(struct net_device * dev)
20159 +{
20160 +       dev->tbusy = 0;
20161 +       /* actually, we never use the interrupt flag at all */
20162 +       dev->interrupt = 0;
20163 +       dev->start = 1;
20164 +}
20165 +
20166 +/*
20167 + * Ask upper layers to temporarily cease passing us more xmit frames.
20168 + */
20169 +static void __inline__ netif_stop_queue(struct net_device * dev)
20170 +{
20171 +       dev->tbusy = 1;
20172 +}
20173 +
20174 +#endif /* COMPAT_NO_SOFTNET */
20175 +
20176 +#ifndef COMPAT_HAS_NEW_WAITQ
20177 +typedef struct wait_queue wait_queue_t;
20178 +typedef struct wait_queue *wait_queue_head_t;
20179 +
20180 +#define DECLARE_WAITQUEUE(wait, current)       struct wait_queue wait = { current, NULL }
20181 +#define DECLARE_WAIT_QUEUE_HEAD(wait)          wait_queue_head_t wait
20182 +#define init_waitqueue_head(x)                 *(x)=NULL
20183 +#define init_waitqueue_entry(q,p)              ((q)->task)=(p)
20184 +#endif /* COMPAT_HAS_NEW_WAITQ */
20185 +
20186 +#ifdef COMPAT_NEED_PCI_IDS
20187 +
20188 +#define PCI_ANY_ID (~0)
20189 +
20190 +#define PCI_VENDOR_ID_DYNALINK          0x0675
20191 +#define PCI_DEVICE_ID_DYNALINK_IS64PH   0x1702
20192 +
20193 +#define PCI_DEVICE_ID_WINBOND2_6692    0x6692
20194 +
20195 +#define PCI_DEVICE_ID_PLX_R685         0x1030
20196 +#define PCI_DEVICE_ID_PLX_DJINN_ITOO    0x1151
20197 +#define PCI_DEVICE_ID_PLX_R753          0x1152
20198 +
20199 +#define PCI_VENDOR_ID_ELSA             0x1048
20200 +#define PCI_DEVICE_ID_ELSA_MICROLINK   0x1000
20201 +#define PCI_DEVICE_ID_ELSA_QS3000      0x3000
20202 +
20203 +#define PCI_VENDOR_ID_EICON            0x1133
20204 +#define PCI_DEVICE_ID_EICON_DIVA20PRO  0xe001
20205 +#define PCI_DEVICE_ID_EICON_DIVA20     0xe002
20206 +#define PCI_DEVICE_ID_EICON_DIVA20PRO_U        0xe003
20207 +#define PCI_DEVICE_ID_EICON_DIVA20_U   0xe004
20208 +#define PCI_DEVICE_ID_EICON_DIVA201    0xe005
20209 +#define PCI_DEVICE_ID_EICON_MAESTRA    0xe010
20210 +#define PCI_DEVICE_ID_EICON_MAESTRAQ   0xe012
20211 +#define PCI_DEVICE_ID_EICON_MAESTRAQ_U 0xe013
20212 +#define PCI_DEVICE_ID_EICON_MAESTRAP   0xe014
20213
20214 +#define PCI_VENDOR_ID_CCD              0x1397
20215 +#define PCI_DEVICE_ID_CCD_2BD0         0x2BD0
20216 +#define PCI_DEVICE_ID_CCD_B000         0xB000
20217 +#define PCI_DEVICE_ID_CCD_B006         0xB006
20218 +#define PCI_DEVICE_ID_CCD_B007         0xB007
20219 +#define PCI_DEVICE_ID_CCD_B008         0xB008
20220 +#define PCI_DEVICE_ID_CCD_B009         0xB009
20221 +#define PCI_DEVICE_ID_CCD_B00A         0xB00A
20222 +#define PCI_DEVICE_ID_CCD_B00B         0xB00B
20223 +#define PCI_DEVICE_ID_CCD_B00C         0xB00C
20224 +#define PCI_DEVICE_ID_CCD_B100         0xB100
20225 +
20226 +#define PCI_VENDOR_ID_ASUSTEK           0x1043   
20227 +#define PCI_DEVICE_ID_ASUSTEK_0675      0x0675
20228 +
20229 +#define PCI_VENDOR_ID_BERKOM                   0x0871
20230 +#define PCI_DEVICE_ID_BERKOM_A1T               0xFFA1
20231 +#define PCI_DEVICE_ID_BERKOM_T_CONCEPT          0xFFA2
20232 +#define PCI_DEVICE_ID_BERKOM_A4T               0xFFA4
20233 +#define PCI_DEVICE_ID_BERKOM_SCITEL_QUADRO      0xFFA8
20234 +
20235 +#define PCI_DEVICE_ID_SATSAGEM_NICCY   0x1016
20236 +
20237 +#define PCI_DEVICE_ID_TIGERJET_100     0x0002
20238 +
20239 +#define PCI_VENDOR_ID_ANIGMA           0x1051
20240 +#define PCI_DEVICE_ID_ANIGMA_MC145575  0x0100
20241 +
20242 +#define PCI_VENDOR_ID_ZOLTRIX          0x15b0
20243 +#define PCI_DEVICE_ID_ZOLTRIX_2BD0     0x2BD0
20244 +
20245 +#define PCI_DEVICE_ID_DIGI_DF_M_IOM2_E 0x0070
20246 +#define PCI_DEVICE_ID_DIGI_DF_M_E      0x0071
20247 +#define PCI_DEVICE_ID_DIGI_DF_M_IOM2_A 0x0072
20248 +#define PCI_DEVICE_ID_DIGI_DF_M_A      0x0073
20249 +
20250 +#define PCI_DEVICE_ID_AVM_B1           0x0700
20251 +#define PCI_DEVICE_ID_AVM_C4           0x0800
20252 +#define PCI_DEVICE_ID_AVM_C2           0x1100
20253 +#define PCI_DEVICE_ID_AVM_T1           0x1200
20254 +
20255 +#define PCI_VENDOR_ID_HYPERCOPE                0x1365
20256 +#define PCI_DEVICE_ID_HYPERCOPE_PLX    0x9050
20257 +#define PCI_SUBDEVICE_ID_HYPERCOPE_OLD_ERGO     0x0104
20258 +#define PCI_SUBDEVICE_ID_HYPERCOPE_ERGO         0x0106
20259 +#define PCI_SUBDEVICE_ID_HYPERCOPE_METRO        0x0107
20260 +#define PCI_SUBDEVICE_ID_HYPERCOPE_CHAMP2       0x0108
20261 +#define PCI_SUBDEVICE_ID_HYPERCOPE_PLEXUS       0x0109
20262 +
20263 +#define PCI_VENDOR_ID_ABOCOM            0x13D1
20264 +#define PCI_DEVICE_ID_ABOCOM_2BD1       0x2BD1
20265 +
20266 +#endif /* COMPAT_NEED_PCI_IDS */
20267 +
20268 +#endif /* __KERNEL__ */
20269 +#endif /* _LINUX_ISDN_COMPAT_H */
20270 Index: linux-2.4.35.4/include/linux/isdn_divertif.h
20271 ===================================================================
20272 --- linux-2.4.35.4.orig/include/linux/isdn_divertif.h   2007-12-15 05:19:41.026759021 +0100
20273 +++ linux-2.4.35.4/include/linux/isdn_divertif.h        2007-12-15 05:19:55.759598598 +0100
20274 @@ -1,4 +1,4 @@
20275 -/* $Id: isdn_divertif.h,v 1.1.4.1 2001/11/20 14:19:38 kai Exp $
20276 +/* $Id$
20277   *
20278   * Header for the diversion supplementary interface for i4l.
20279   *
20280 @@ -14,7 +14,7 @@
20281  /***********************************************************/
20282  /* magic value is also used to control version information */
20283  /***********************************************************/
20284 -#define DIVERT_IF_MAGIC 0x25873401
20285 +#define DIVERT_IF_MAGIC 0x25873402
20286  #define DIVERT_CMD_REG  0x00  /* register command */
20287  #define DIVERT_CMD_REL  0x01  /* release command */
20288  #define DIVERT_NO_ERR   0x00  /* return value no error */
20289 @@ -34,6 +34,7 @@
20290      int (*ll_cmd)(isdn_ctrl *); /* supplied by hl on return */
20291      char * (*drv_to_name)(int); /* map a driver id to name, supplied by hl */
20292      int (*name_to_drv)(char *); /* map a driver id to name, supplied by hl */
20293 +    int (*dial_net_name)(char *); /* force dial of a ll net interface  */
20294    } isdn_divert_if;
20295  
20296  /*********************/
20297 Index: linux-2.4.35.4/include/linux/isdn_dwabc.h
20298 ===================================================================
20299 --- /dev/null   1970-01-01 00:00:00.000000000 +0000
20300 +++ linux-2.4.35.4/include/linux/isdn_dwabc.h   2007-12-15 05:19:55.759598598 +0100
20301 @@ -0,0 +1,84 @@
20302 +/* $Id: isdn_dwabc.h,v 1.9 2001/09/26 20:32:08 detabc Exp $
20303 + *
20304 + * Header for the Linux ISDN abc-extension.
20305 + *
20306 + * Copyright           by abc GmbH
20307 + *                     written by Detlef Wengorz <detlefw@isdn4linux.de>
20308 + * 
20309 + * This software may be used and distributed according to the terms
20310 + * of the GNU General Public License, incorporated herein by reference.
20311 + *
20312 + */
20313 +
20314 +#ifndef ISDN_DWABC_H
20315 +#define ISDN_DWABC_H
20316 +
20317 +#ifdef __KERNEL__
20318 +#include <linux/types.h>
20319 +#include <linux/kernel.h>
20320 +#include <linux/sched.h>
20321 +#include <linux/smp.h>
20322 +#include <linux/spinlock.h>
20323 +#include <linux/errno.h>
20324 +
20325 +
20326 +typedef struct ISDN_DWSPINLOCK {
20327 +
20328 +       spinlock_t      spin;
20329 +       short           owner;
20330 +       short           my_flags;
20331 +       ulong           irq_flags;
20332 +
20333 +} ISDN_DWSPINLOCK;
20334 +
20335 +#define ISDN_DWSPIN_UNLOCKED                           \
20336 +       (ISDN_DWSPINLOCK) {                                             \
20337 +               spin:           SPIN_LOCK_UNLOCKED,             \
20338 +               owner:          -1,                                             \
20339 +               my_flags:       0,                                              \
20340 +               irq_flags:      0,                                              \
20341 +       }
20342 +
20343 +#define ISDN_DWSPIN_INIT(x)                    \
20344 +                       do { *(x) = ISDN_DWSPIN_UNLOCKED; } while(0);
20345 +
20346 +static __inline__ int isdn_dwspin_trylock(ISDN_DWSPINLOCK *spin)
20347 +{
20348 +       if(!spin_trylock(&spin->spin)) {
20349 +
20350 +               if(spin->owner == smp_processor_id())
20351 +                       return(-EAGAIN);
20352 +
20353 +               spin_lock(&spin->spin);
20354 +       }
20355 +
20356 +       spin->owner = smp_processor_id();
20357 +       return(0);
20358 +}
20359 +
20360 +static __inline__ void isdn_dwspin_unlock(ISDN_DWSPINLOCK *spin)
20361 +{
20362 +       spin->owner = -1;
20363 +       spin_unlock(&spin->spin);
20364 +}
20365 +
20366 +
20367 +#else
20368 +#include <sys/types.h>
20369 +#endif
20370 +
20371 +#define DWABC_LCR_FLG_NEWNUMBER                0x00000001L
20372 +#define DWABC_LCR_FLG_DISABLE          0x00000002L
20373 +#define DWABC_LCR_FLG_NEWHUPTIME       0x00000004L
20374 +
20375 +
20376 +struct ISDN_DWABC_LCR_IOCTL {
20377 +
20378 +       int     lcr_ioctl_sizeof;       /* mustbe sizeof(ISDN_DWABC_LCR_IOCTL)  */
20379 +       u_short lcr_ioctl_onhtime;      /* new hanguptime                                               */
20380 +       u_long  lcr_ioctl_callid;       /* callid from lcr-subsystem                    */
20381 +       u_long  lcr_ioctl_flags;        /* see above                                                    */
20382 +       char    lcr_ioctl_nr[32];       /* new destination phonenumber                  */
20383 +};
20384 +
20385 +#endif
20386 Index: linux-2.4.35.4/include/linux/isdn_lzscomp.h
20387 ===================================================================
20388 --- linux-2.4.35.4.orig/include/linux/isdn_lzscomp.h    2007-12-15 05:19:41.042759932 +0100
20389 +++ linux-2.4.35.4/include/linux/isdn_lzscomp.h 2007-12-15 05:19:55.759598598 +0100
20390 @@ -1,4 +1,4 @@
20391 -/* $Id: isdn_lzscomp.h,v 1.1.4.1 2001/11/20 14:19:38 kai Exp $
20392 +/* $Id$
20393   *
20394   * Header for isdn_lzscomp.c
20395   * Concentrated here to not mess up half a dozen kernel headers with code
20396 Index: linux-2.4.35.4/include/linux/isdn_ppp.h
20397 ===================================================================
20398 --- linux-2.4.35.4.orig/include/linux/isdn_ppp.h        2007-12-15 05:19:41.046760161 +0100
20399 +++ linux-2.4.35.4/include/linux/isdn_ppp.h     2007-12-15 05:19:55.759598598 +0100
20400 @@ -8,6 +8,7 @@
20401  #ifndef _LINUX_ISDN_PPP_H
20402  #define _LINUX_ISDN_PPP_H
20403  
20404 +#include <linux/isdn_compat.h>
20405  
20406  #define CALLTYPE_INCOMING 0x1
20407  #define CALLTYPE_OUTGOING 0x2
20408 @@ -33,6 +34,11 @@
20409  #define PPPIOCSCOMPRESSOR _IOW('t',135,int)
20410  #define PPPIOCGIFNAME      _IOR('t',136, char [IFNAMSIZ] )
20411  
20412 +#ifdef COMPAT_NEED_MPPP_DEFS
20413 +#define PPP_MP          0x003d
20414 +#define PPP_COMPFRAG    0x00fb
20415 +#define PPP_CCPFRAG     0x80fb
20416 +#endif
20417  
20418  #define SC_MP_PROT       0x00000200
20419  #define SC_REJ_MP_PROT   0x00000400
20420 @@ -65,9 +71,6 @@
20421  
20422  #include <linux/config.h>
20423  
20424 -#ifdef CONFIG_IPPP_FILTER
20425 -#include <linux/filter.h>
20426 -#endif
20427  
20428  #define DECOMP_ERR_NOMEM       (-10)
20429  
20430 @@ -226,10 +229,6 @@
20431    unsigned char *cbuf;
20432    struct slcompress *slcomp;
20433  #endif
20434 -#ifdef CONFIG_IPPP_FILTER
20435 -  struct sock_fprog pass_filter;       /* filter for packets to pass */
20436 -  struct sock_fprog active_filter;     /* filter for pkts to reset idle */
20437 -#endif
20438    unsigned long debug;
20439    struct isdn_ppp_compressor *compressor,*decompressor;
20440    struct isdn_ppp_compressor *link_compressor,*link_decompressor;
20441 Index: linux-2.4.35.4/include/linux/isdnif.h
20442 ===================================================================
20443 --- linux-2.4.35.4.orig/include/linux/isdnif.h  2007-12-15 05:19:41.054760616 +0100
20444 +++ linux-2.4.35.4/include/linux/isdnif.h       2007-12-15 05:19:55.759598598 +0100
20445 @@ -1,4 +1,4 @@
20446 -/* $Id: isdnif.h,v 1.1.4.1 2001/11/20 14:19:38 kai Exp $
20447 +/* $Id: isdnif.h,v 1.43 2002/02/09 21:19:11 keil Exp $
20448   *
20449   * Linux ISDN subsystem
20450   * Definition of the interface between the subsystem and its low-level drivers.
20451 @@ -14,6 +14,7 @@
20452  #ifndef __ISDNIF_H__
20453  #define __ISDNIF_H__
20454  
20455 +#include <linux/isdn_compat.h>
20456  
20457  /*
20458   * Values for general protocol-selection
20459 @@ -213,6 +214,8 @@
20460  #define ISDN_STAT_FAXIND  276    /* FAX indications from HL-driver        */
20461  #define ISDN_STAT_AUDIO   277    /* DTMF, DSP indications                 */
20462  #define ISDN_STAT_DISCH   278    /* Disable/Enable channel usage          */
20463 +#define ISDN_STAT_ALERT   279    /* Signal alerting                       */
20464 +#define ISDN_STAT_PROCEED 280    /* Signal proceeding                     */
20465  
20466  /*
20467   * Audio commands
20468 Index: linux-2.4.35.4/include/linux/kernelcapi.h
20469 ===================================================================
20470 --- linux-2.4.35.4.orig/include/linux/kernelcapi.h      2007-12-15 05:19:41.066761301 +0100
20471 +++ linux-2.4.35.4/include/linux/kernelcapi.h   2007-12-15 05:19:55.759598598 +0100
20472 @@ -1,12 +1,10 @@
20473 -/* $Id: kernelcapi.h,v 1.1.4.2 2002/01/28 18:25:10 kai Exp $
20474 +/*
20475 + * $Id: kernelcapi.h,v 1.9 2000/11/28 09:34:02 kai Exp $
20476   * 
20477   * Kernel CAPI 2.0 Interface for Linux
20478   * 
20479   * (c) Copyright 1997 by Carsten Paeth (calle@calle.in-berlin.de)
20480   * 
20481 - * This software may be used and distributed according to the terms
20482 - * of the GNU General Public License, incorporated herein by reference.
20483 - *
20484   */
20485  
20486  #ifndef __KERNELCAPI_H__