1 /* $Id: arcofi.c,v 1.11 2000/06/26 08:59:12 keil Exp $
3 * arcofi.c Ansteuerung ARCOFI 2165
5 * Author Karsten Keil (keil@isdn4linux.de)
7 * This file is (c) under GNU PUBLIC LICENSE
11 #define __NO_VERSION__
17 #define ARCOFI_TIMER_VALUE 20
20 add_arcofi_timer(struct IsdnCardState
*cs
) {
21 if (test_and_set_bit(FLG_ARCOFI_TIMER
, &cs
->HW_Flags
)) {
22 del_timer(&cs
->dc
.isac
.arcofitimer
);
24 init_timer(&cs
->dc
.isac
.arcofitimer
);
25 cs
->dc
.isac
.arcofitimer
.expires
= jiffies
+ ((ARCOFI_TIMER_VALUE
* HZ
)/1000);
26 add_timer(&cs
->dc
.isac
.arcofitimer
);
30 send_arcofi(struct IsdnCardState
*cs
) {
34 cs
->dc
.isac
.mon_txp
= 0;
35 cs
->dc
.isac
.mon_txc
= cs
->dc
.isac
.arcofi_list
->len
;
36 memcpy(cs
->dc
.isac
.mon_tx
, cs
->dc
.isac
.arcofi_list
->msg
, cs
->dc
.isac
.mon_txc
);
37 switch(cs
->dc
.isac
.arcofi_bc
) {
39 case 1: cs
->dc
.isac
.mon_tx
[1] |= 0x40;
43 cs
->dc
.isac
.mocr
&= 0x0f;
44 cs
->dc
.isac
.mocr
|= 0xa0;
45 cs
->writeisac(cs
, ISAC_MOCR
, cs
->dc
.isac
.mocr
);
46 val
= cs
->readisac(cs
, ISAC_MOSR
);
47 cs
->writeisac(cs
, ISAC_MOX1
, cs
->dc
.isac
.mon_tx
[cs
->dc
.isac
.mon_txp
++]);
48 cs
->dc
.isac
.mocr
|= 0x10;
49 cs
->writeisac(cs
, ISAC_MOCR
, cs
->dc
.isac
.mocr
);
53 arcofi_fsm(struct IsdnCardState
*cs
, int event
, void *data
) {
54 if (cs
->debug
& L1_DEB_MONITOR
) {
55 debugl1(cs
, "arcofi state %d event %d", cs
->dc
.isac
.arcofi_state
, event
);
57 if (event
== ARCOFI_TIMEOUT
) {
58 cs
->dc
.isac
.arcofi_state
= ARCOFI_NOP
;
59 test_and_set_bit(FLG_ARCOFI_ERROR
, &cs
->HW_Flags
);
60 wake_up(&cs
->dc
.isac
.arcofi_wait
);
63 switch (cs
->dc
.isac
.arcofi_state
) {
65 if (event
== ARCOFI_START
) {
66 cs
->dc
.isac
.arcofi_list
= data
;
67 cs
->dc
.isac
.arcofi_state
= ARCOFI_TRANSMIT
;
72 if (event
== ARCOFI_TX_END
) {
73 if (cs
->dc
.isac
.arcofi_list
->receive
) {
75 cs
->dc
.isac
.arcofi_state
= ARCOFI_RECEIVE
;
77 if (cs
->dc
.isac
.arcofi_list
->next
) {
78 cs
->dc
.isac
.arcofi_list
=
79 cs
->dc
.isac
.arcofi_list
->next
;
82 if (test_and_clear_bit(FLG_ARCOFI_TIMER
, &cs
->HW_Flags
)) {
83 del_timer(&cs
->dc
.isac
.arcofitimer
);
85 cs
->dc
.isac
.arcofi_state
= ARCOFI_NOP
;
86 wake_up(&cs
->dc
.isac
.arcofi_wait
);
92 if (event
== ARCOFI_RX_END
) {
93 if (cs
->dc
.isac
.arcofi_list
->next
) {
94 cs
->dc
.isac
.arcofi_list
=
95 cs
->dc
.isac
.arcofi_list
->next
;
96 cs
->dc
.isac
.arcofi_state
= ARCOFI_TRANSMIT
;
99 if (test_and_clear_bit(FLG_ARCOFI_TIMER
, &cs
->HW_Flags
)) {
100 del_timer(&cs
->dc
.isac
.arcofitimer
);
102 cs
->dc
.isac
.arcofi_state
= ARCOFI_NOP
;
103 wake_up(&cs
->dc
.isac
.arcofi_wait
);
108 debugl1(cs
, "Arcofi unknown state %x", cs
->dc
.isac
.arcofi_state
);
115 arcofi_timer(struct IsdnCardState
*cs
) {
116 arcofi_fsm(cs
, ARCOFI_TIMEOUT
, NULL
);
120 clear_arcofi(struct IsdnCardState
*cs
) {
121 if (test_and_clear_bit(FLG_ARCOFI_TIMER
, &cs
->HW_Flags
)) {
122 del_timer(&cs
->dc
.isac
.arcofitimer
);
127 init_arcofi(struct IsdnCardState
*cs
) {
128 cs
->dc
.isac
.arcofitimer
.function
= (void *) arcofi_timer
;
129 cs
->dc
.isac
.arcofitimer
.data
= (long) cs
;
130 init_timer(&cs
->dc
.isac
.arcofitimer
);
131 init_waitqueue_head(&cs
->dc
.isac
.arcofi_wait
);
132 test_and_set_bit(HW_ARCOFI
, &cs
->HW_Flags
);