• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Stuff used by all variants of the driver
3  *
4  * Copyright (c) 2001 by Stefan Eilers,
5  *                       Hansjoerg Lipp <hjlipp@web.de>,
6  *                       Tilman Schmidt <tilman@imap.cc>.
7  *
8  * =====================================================================
9  *	This program is free software; you can redistribute it and/or
10  *	modify it under the terms of the GNU General Public License as
11  *	published by the Free Software Foundation; either version 2 of
12  *	the License, or (at your option) any later version.
13  * =====================================================================
14  */
15 
16 #include "gigaset.h"
17 
18 /* ========================================================== */
19 /* bit masks for pending commands */
20 #define PC_DIAL		0x001
21 #define PC_HUP		0x002
22 #define PC_INIT		0x004
23 #define PC_DLE0		0x008
24 #define PC_DLE1		0x010
25 #define PC_SHUTDOWN	0x020
26 #define PC_ACCEPT	0x040
27 #define PC_CID		0x080
28 #define PC_NOCID	0x100
29 #define PC_CIDMODE	0x200
30 #define PC_UMMODE	0x400
31 
32 /* types of modem responses */
33 #define RT_NOTHING	0
34 #define RT_ZSAU		1
35 #define RT_RING		2
36 #define RT_NUMBER	3
37 #define RT_STRING	4
38 #define RT_HEX		5
39 #define RT_ZCAU		6
40 
41 /* Possible ASCII responses */
42 #define RSP_OK		0
43 //#define RSP_BUSY	1
44 //#define RSP_CONNECT	2
45 #define RSP_ZGCI	3
46 #define RSP_RING	4
47 #define RSP_ZAOC	5
48 #define RSP_ZCSTR	6
49 #define RSP_ZCFGT	7
50 #define RSP_ZCFG	8
51 #define RSP_ZCCR	9
52 #define RSP_EMPTY	10
53 #define RSP_ZLOG	11
54 #define RSP_ZCAU	12
55 #define RSP_ZMWI	13
56 #define RSP_ZABINFO	14
57 #define RSP_ZSMLSTCHG	15
58 #define RSP_VAR		100
59 #define RSP_ZSAU	(RSP_VAR + VAR_ZSAU)
60 #define RSP_ZDLE	(RSP_VAR + VAR_ZDLE)
61 #define RSP_ZVLS	(RSP_VAR + VAR_ZVLS)
62 #define RSP_ZCTP	(RSP_VAR + VAR_ZCTP)
63 #define RSP_STR		(RSP_VAR + VAR_NUM)
64 #define RSP_NMBR	(RSP_STR + STR_NMBR)
65 #define RSP_ZCPN	(RSP_STR + STR_ZCPN)
66 #define RSP_ZCON	(RSP_STR + STR_ZCON)
67 #define RSP_ZBC		(RSP_STR + STR_ZBC)
68 #define RSP_ZHLC	(RSP_STR + STR_ZHLC)
69 #define RSP_ERROR	-1	/* ERROR              */
70 #define RSP_WRONG_CID	-2	/* unknown cid in cmd */
71 //#define RSP_EMPTY	-3
72 #define RSP_UNKNOWN	-4	/* unknown response   */
73 #define RSP_FAIL	-5	/* internal error     */
74 #define RSP_INVAL	-6	/* invalid response   */
75 
76 #define RSP_NONE	-19
77 #define RSP_STRING	-20
78 #define RSP_NULL	-21
79 //#define RSP_RETRYFAIL	-22
80 //#define RSP_RETRY	-23
81 //#define RSP_SKIP	-24
82 #define RSP_INIT	-27
83 #define RSP_ANY		-26
84 #define RSP_LAST	-28
85 #define RSP_NODEV	-9
86 
87 /* actions for process_response */
88 #define ACT_NOTHING		0
89 #define ACT_SETDLE1		1
90 #define ACT_SETDLE0		2
91 #define ACT_FAILINIT		3
92 #define ACT_HUPMODEM		4
93 #define ACT_CONFIGMODE		5
94 #define ACT_INIT		6
95 #define ACT_DLE0		7
96 #define ACT_DLE1		8
97 #define ACT_FAILDLE0		9
98 #define ACT_FAILDLE1		10
99 #define ACT_RING		11
100 #define ACT_CID			12
101 #define ACT_FAILCID		13
102 #define ACT_SDOWN		14
103 #define ACT_FAILSDOWN		15
104 #define ACT_DEBUG		16
105 #define ACT_WARN		17
106 #define ACT_DIALING		18
107 #define ACT_ABORTDIAL		19
108 #define ACT_DISCONNECT		20
109 #define ACT_CONNECT		21
110 #define ACT_REMOTEREJECT	22
111 #define ACT_CONNTIMEOUT		23
112 #define ACT_REMOTEHUP		24
113 #define ACT_ABORTHUP		25
114 #define ACT_ICALL		26
115 #define ACT_ACCEPTED		27
116 #define ACT_ABORTACCEPT		28
117 #define ACT_TIMEOUT		29
118 #define ACT_GETSTRING		30
119 #define ACT_SETVER		31
120 #define ACT_FAILVER		32
121 #define ACT_GOTVER		33
122 #define ACT_TEST		34
123 #define ACT_ERROR		35
124 #define ACT_ABORTCID		36
125 #define ACT_ZCAU		37
126 #define ACT_NOTIFY_BC_DOWN	38
127 #define ACT_NOTIFY_BC_UP	39
128 #define ACT_DIAL		40
129 #define ACT_ACCEPT		41
130 #define ACT_PROTO_L2		42
131 #define ACT_HUP			43
132 #define ACT_IF_LOCK		44
133 #define ACT_START		45
134 #define ACT_STOP		46
135 #define ACT_FAKEDLE0		47
136 #define ACT_FAKEHUP		48
137 #define ACT_FAKESDOWN		49
138 #define ACT_SHUTDOWN		50
139 #define ACT_PROC_CIDMODE	51
140 #define ACT_UMODESET		52
141 #define ACT_FAILUMODE		53
142 #define ACT_CMODESET		54
143 #define ACT_FAILCMODE		55
144 #define ACT_IF_VER		56
145 #define ACT_CMD			100
146 
147 /* at command sequences */
148 #define SEQ_NONE	0
149 #define SEQ_INIT	100
150 #define SEQ_DLE0	200
151 #define SEQ_DLE1	250
152 #define SEQ_CID		300
153 #define SEQ_NOCID	350
154 #define SEQ_HUP		400
155 #define SEQ_DIAL	600
156 #define SEQ_ACCEPT	720
157 #define SEQ_SHUTDOWN	500
158 #define SEQ_CIDMODE	10
159 #define SEQ_UMMODE	11
160 
161 
162 // 100: init, 200: dle0, 250:dle1, 300: get cid (dial), 350: "hup" (no cid), 400: hup, 500: reset, 600: dial, 700: ring
163 struct reply_t gigaset_tab_nocid_m10x[]= /* with dle mode */
164 {
165 	/* resp_code, min_ConState, max_ConState, parameter, new_ConState, timeout, action, command */
166 
167 	/* initialize device, set cid mode if possible */
168 	//{RSP_INIT,     -1, -1,100,                900, 0, {ACT_TEST}},
169 	//{RSP_ERROR,   900,900, -1,                  0, 0, {ACT_FAILINIT}},
170 	//{RSP_OK,      900,900, -1,                100, INIT_TIMEOUT,
171 	//                                                  {ACT_TIMEOUT}},
172 
173 	{RSP_INIT,     -1, -1,SEQ_INIT,           100, INIT_TIMEOUT,
174 							  {ACT_TIMEOUT}},                /* wait until device is ready */
175 
176 	{EV_TIMEOUT,  100,100, -1,                101, 3, {0},             "Z\r"},       /* device in transparent mode? try to initialize it. */
177 	{RSP_OK,      101,103, -1,                120, 5, {ACT_GETSTRING}, "+GMR\r"},    /* get version */
178 
179 	{EV_TIMEOUT,  101,101, -1,                102, 5, {0},             "Z\r"},       /* timeout => try once again. */
180 	{RSP_ERROR,   101,101, -1,                102, 5, {0},             "Z\r"},       /* error => try once again. */
181 
182 	{EV_TIMEOUT,  102,102, -1,                108, 5, {ACT_SETDLE1},   "^SDLE=0\r"}, /* timeout => try again in DLE mode. */
183 	{RSP_OK,      108,108, -1,                104,-1},
184 	{RSP_ZDLE,    104,104,  0,                103, 5, {0},             "Z\r"},
185 	{EV_TIMEOUT,  104,104, -1,                  0, 0, {ACT_FAILINIT}},
186 	{RSP_ERROR,   108,108, -1,                  0, 0, {ACT_FAILINIT}},
187 
188 	{EV_TIMEOUT,  108,108, -1,                105, 2, {ACT_SETDLE0,
189 							   ACT_HUPMODEM,
190 							   ACT_TIMEOUT}},                /* still timeout => connection in unimodem mode? */
191 	{EV_TIMEOUT,  105,105, -1,                103, 5, {0},             "Z\r"},
192 
193 	{RSP_ERROR,   102,102, -1,                107, 5, {0},             "^GETPRE\r"}, /* ERROR on ATZ => maybe in config mode? */
194 	{RSP_OK,      107,107, -1,                  0, 0, {ACT_CONFIGMODE}},
195 	{RSP_ERROR,   107,107, -1,                  0, 0, {ACT_FAILINIT}},
196 	{EV_TIMEOUT,  107,107, -1,                  0, 0, {ACT_FAILINIT}},
197 
198 	{RSP_ERROR,   103,103, -1,                  0, 0, {ACT_FAILINIT}},
199 	{EV_TIMEOUT,  103,103, -1,                  0, 0, {ACT_FAILINIT}},
200 
201 	{RSP_STRING,  120,120, -1,                121,-1, {ACT_SETVER}},
202 
203 	{EV_TIMEOUT,  120,121, -1,                  0, 0, {ACT_FAILVER, ACT_INIT}},
204 	{RSP_ERROR,   120,121, -1,                  0, 0, {ACT_FAILVER, ACT_INIT}},
205 	{RSP_OK,      121,121, -1,                  0, 0, {ACT_GOTVER,  ACT_INIT}},
206 
207 	/* leave dle mode */
208 	{RSP_INIT,      0,  0,SEQ_DLE0,           201, 5, {0},             "^SDLE=0\r"},
209 	{RSP_OK,      201,201, -1,                202,-1},
210 	//{RSP_ZDLE,    202,202,  0,                202, 0, {ACT_ERROR}},//DELETE
211 	{RSP_ZDLE,    202,202,  0,                  0, 0, {ACT_DLE0}},
212 	{RSP_NODEV,   200,249, -1,                  0, 0, {ACT_FAKEDLE0}},
213 	{RSP_ERROR,   200,249, -1,                  0, 0, {ACT_FAILDLE0}},
214 	{EV_TIMEOUT,  200,249, -1,                  0, 0, {ACT_FAILDLE0}},
215 
216 	/* enter dle mode */
217 	{RSP_INIT,      0,  0,SEQ_DLE1,           251, 5, {0},             "^SDLE=1\r"},
218 	{RSP_OK,      251,251, -1,                252,-1},
219 	{RSP_ZDLE,    252,252,  1,                  0, 0, {ACT_DLE1}},
220 	{RSP_ERROR,   250,299, -1,                  0, 0, {ACT_FAILDLE1}},
221 	{EV_TIMEOUT,  250,299, -1,                  0, 0, {ACT_FAILDLE1}},
222 
223 	/* incoming call */
224 	{RSP_RING,     -1, -1, -1,                 -1,-1, {ACT_RING}},
225 
226 	/* get cid */
227 	//{RSP_INIT,      0,  0,300,                901, 0, {ACT_TEST}},
228 	//{RSP_ERROR,   901,901, -1,                  0, 0, {ACT_FAILCID}},
229 	//{RSP_OK,      901,901, -1,                301, 5, {0},             "^SGCI?\r"},
230 
231 	{RSP_INIT,      0,  0,SEQ_CID,            301, 5, {0},             "^SGCI?\r"},
232 	{RSP_OK,      301,301, -1,                302,-1},
233 	{RSP_ZGCI,    302,302, -1,                  0, 0, {ACT_CID}},
234 	{RSP_ERROR,   301,349, -1,                  0, 0, {ACT_FAILCID}},
235 	{EV_TIMEOUT,  301,349, -1,                  0, 0, {ACT_FAILCID}},
236 
237 	/* enter cid mode */
238 	{RSP_INIT,      0,  0,SEQ_CIDMODE,        150, 5, {0},             "^SGCI=1\r"},
239 	{RSP_OK,      150,150, -1,                  0, 0, {ACT_CMODESET}},
240 	{RSP_ERROR,   150,150, -1,                  0, 0, {ACT_FAILCMODE}},
241 	{EV_TIMEOUT,  150,150, -1,                  0, 0, {ACT_FAILCMODE}},
242 
243 	/* leave cid mode */
244 	//{RSP_INIT,      0,  0,SEQ_UMMODE,         160, 5, {0},             "^SGCI=0\r"},
245 	{RSP_INIT,      0,  0,SEQ_UMMODE,         160, 5, {0},             "Z\r"},
246 	{RSP_OK,      160,160, -1,                  0, 0, {ACT_UMODESET}},
247 	{RSP_ERROR,   160,160, -1,                  0, 0, {ACT_FAILUMODE}},
248 	{EV_TIMEOUT,  160,160, -1,                  0, 0, {ACT_FAILUMODE}},
249 
250 	/* abort getting cid */
251 	{RSP_INIT,      0,  0,SEQ_NOCID,            0, 0, {ACT_ABORTCID}},
252 
253 	/* reset */
254 	{RSP_INIT,      0,  0,SEQ_SHUTDOWN,       504, 5, {0},             "Z\r"},
255 	{RSP_OK,      504,504, -1,                  0, 0, {ACT_SDOWN}},
256 	{RSP_ERROR,   501,599, -1,                  0, 0, {ACT_FAILSDOWN}},
257 	{EV_TIMEOUT,  501,599, -1,                  0, 0, {ACT_FAILSDOWN}},
258 	{RSP_NODEV,   501,599, -1,                  0, 0, {ACT_FAKESDOWN}},
259 
260 	{EV_PROC_CIDMODE,-1, -1, -1,               -1,-1, {ACT_PROC_CIDMODE}}, //FIXME
261 	{EV_IF_LOCK,   -1, -1, -1,                 -1,-1, {ACT_IF_LOCK}}, //FIXME
262 	{EV_IF_VER,    -1, -1, -1,                 -1,-1, {ACT_IF_VER}}, //FIXME
263 	{EV_START,     -1, -1, -1,                 -1,-1, {ACT_START}}, //FIXME
264 	{EV_STOP,      -1, -1, -1,                 -1,-1, {ACT_STOP}}, //FIXME
265 	{EV_SHUTDOWN,  -1, -1, -1,                 -1,-1, {ACT_SHUTDOWN}}, //FIXME
266 
267 	/* misc. */
268 	{RSP_EMPTY,    -1, -1, -1,                 -1,-1, {ACT_DEBUG}}, //FIXME
269 	{RSP_ZCFGT,    -1, -1, -1,                 -1,-1, {ACT_DEBUG}}, //FIXME
270 	{RSP_ZCFG,     -1, -1, -1,                 -1,-1, {ACT_DEBUG}}, //FIXME
271 	{RSP_ZLOG,     -1, -1, -1,                 -1,-1, {ACT_DEBUG}}, //FIXME
272 	{RSP_ZMWI,     -1, -1, -1,                 -1,-1, {ACT_DEBUG}}, //FIXME
273 	{RSP_ZABINFO,  -1, -1, -1,                 -1,-1, {ACT_DEBUG}}, //FIXME
274 	{RSP_ZSMLSTCHG,-1, -1, -1,                 -1,-1, {ACT_DEBUG}}, //FIXME
275 
276 	{RSP_ZCAU,     -1, -1, -1,                 -1,-1, {ACT_ZCAU}},
277 	{RSP_NONE,     -1, -1, -1,                 -1,-1, {ACT_DEBUG}},
278 	{RSP_ANY,      -1, -1, -1,                 -1,-1, {ACT_WARN}},
279 	{RSP_LAST}
280 };
281 
282 // 600: start dialing, 650: dial in progress, 800: connection is up, 700: ring, 400: hup, 750: accepted icall
283 struct reply_t gigaset_tab_cid_m10x[] = /* for M10x */
284 {
285 	/* resp_code, min_ConState, max_ConState, parameter, new_ConState, timeout, action, command */
286 
287 	/* dial */
288 	{EV_DIAL,      -1, -1, -1,                 -1,-1, {ACT_DIAL}}, //FIXME
289 	{RSP_INIT,      0,  0,SEQ_DIAL,           601, 5, {ACT_CMD+AT_BC}},
290 	{RSP_OK,      601,601, -1,                602, 5, {ACT_CMD+AT_HLC}},
291 	{RSP_NULL,    602,602, -1,                603, 5, {ACT_CMD+AT_PROTO}},
292 	{RSP_OK,      602,602, -1,                603, 5, {ACT_CMD+AT_PROTO}},
293 	{RSP_OK,      603,603, -1,                604, 5, {ACT_CMD+AT_TYPE}},
294 	{RSP_OK,      604,604, -1,                605, 5, {ACT_CMD+AT_MSN}},
295 	{RSP_OK,      605,605, -1,                606, 5, {ACT_CMD+AT_ISO}},
296 	{RSP_NULL,    605,605, -1,                606, 5, {ACT_CMD+AT_ISO}},
297 	{RSP_OK,      606,606, -1,                607, 5, {0},             "+VLS=17\r"}, /* set "Endgeraetemodus" */
298 	{RSP_OK,      607,607, -1,                608,-1},
299 	//{RSP_ZSAU,    608,608,ZSAU_PROCEEDING,    608, 0, {ACT_ERROR}},//DELETE
300 	{RSP_ZSAU,    608,608,ZSAU_PROCEEDING,    609, 5, {ACT_CMD+AT_DIAL}},
301 	{RSP_OK,      609,609, -1,                650, 0, {ACT_DIALING}},
302 
303 	{RSP_ZVLS,    608,608, 17,                 -1,-1, {ACT_DEBUG}},
304 	{RSP_ZCTP,    609,609, -1,                 -1,-1, {ACT_DEBUG}},
305 	{RSP_ZCPN,    609,609, -1,                 -1,-1, {ACT_DEBUG}},
306 	{RSP_ERROR,   601,609, -1,                  0, 0, {ACT_ABORTDIAL}},
307 	{EV_TIMEOUT,  601,609, -1,                  0, 0, {ACT_ABORTDIAL}},
308 
309 	/* dialing */
310 	{RSP_ZCTP,    650,650, -1,                 -1,-1, {ACT_DEBUG}},
311 	{RSP_ZCPN,    650,650, -1,                 -1,-1, {ACT_DEBUG}},
312 	{RSP_ZSAU,    650,650,ZSAU_CALL_DELIVERED, -1,-1, {ACT_DEBUG}}, /* some devices don't send this */
313 
314 	/* connection established  */
315 	{RSP_ZSAU,    650,650,ZSAU_ACTIVE,        800,-1, {ACT_CONNECT}}, //FIXME -> DLE1
316 	{RSP_ZSAU,    750,750,ZSAU_ACTIVE,        800,-1, {ACT_CONNECT}}, //FIXME -> DLE1
317 
318 	{EV_BC_OPEN,  800,800, -1,                800,-1, {ACT_NOTIFY_BC_UP}}, //FIXME new constate + timeout
319 
320 	/* remote hangup */
321 	{RSP_ZSAU,    650,650,ZSAU_DISCONNECT_IND,  0, 0, {ACT_REMOTEREJECT}},
322 	{RSP_ZSAU,    750,750,ZSAU_DISCONNECT_IND,  0, 0, {ACT_REMOTEHUP}},
323 	{RSP_ZSAU,    800,800,ZSAU_DISCONNECT_IND,  0, 0, {ACT_REMOTEHUP}},
324 
325 	/* hangup */
326 	{EV_HUP,       -1, -1, -1,                 -1,-1, {ACT_HUP}}, //FIXME
327 	{RSP_INIT,     -1, -1,SEQ_HUP,            401, 5, {0},             "+VLS=0\r"}, /* hang up */ //-1,-1?
328 	{RSP_OK,      401,401, -1,                402, 5},
329 	{RSP_ZVLS,    402,402,  0,                403, 5},
330 	{RSP_ZSAU,    403,403,ZSAU_DISCONNECT_REQ, -1,-1, {ACT_DEBUG}}, /* if not remote hup */
331 	//{RSP_ZSAU,    403,403,ZSAU_NULL,          401, 0, {ACT_ERROR}}, //DELETE//FIXME -> DLE0 // should we do this _before_ hanging up for base driver?
332 	{RSP_ZSAU,    403,403,ZSAU_NULL,            0, 0, {ACT_DISCONNECT}}, //FIXME -> DLE0 // should we do this _before_ hanging up for base driver?
333 	{RSP_NODEV,   401,403, -1,                  0, 0, {ACT_FAKEHUP}}, //FIXME -> DLE0 // should we do this _before_ hanging up for base driver?
334 	{RSP_ERROR,   401,401, -1,                  0, 0, {ACT_ABORTHUP}},
335 	{EV_TIMEOUT,  401,403, -1,                  0, 0, {ACT_ABORTHUP}},
336 
337 	{EV_BC_CLOSED,  0,  0, -1,                  0,-1, {ACT_NOTIFY_BC_DOWN}}, //FIXME new constate + timeout
338 
339 	/* ring */
340 	{RSP_ZBC,     700,700, -1,                 -1,-1, {0}},
341 	{RSP_ZHLC,    700,700, -1,                 -1,-1, {0}},
342 	{RSP_NMBR,    700,700, -1,                 -1,-1, {0}},
343 	{RSP_ZCPN,    700,700, -1,                 -1,-1, {0}},
344 	{RSP_ZCTP,    700,700, -1,                 -1,-1, {0}},
345 	{EV_TIMEOUT,  700,700, -1,               720,720, {ACT_ICALL}},
346 	{EV_BC_CLOSED,720,720, -1,                  0,-1, {ACT_NOTIFY_BC_DOWN}},
347 
348 	/*accept icall*/
349 	{EV_ACCEPT,    -1, -1, -1,                 -1,-1, {ACT_ACCEPT}}, //FIXME
350 	{RSP_INIT,    720,720,SEQ_ACCEPT,         721, 5, {ACT_CMD+AT_PROTO}},
351 	{RSP_OK,      721,721, -1,                722, 5, {ACT_CMD+AT_ISO}},
352 	{RSP_OK,      722,722, -1,                723, 5, {0},             "+VLS=17\r"}, /* set "Endgeraetemodus" */
353 	{RSP_OK,      723,723, -1,                724, 5, {0}},
354 	{RSP_ZVLS,    724,724, 17,                750,50, {ACT_ACCEPTED}},
355 	{RSP_ERROR,   721,729, -1,                  0, 0, {ACT_ABORTACCEPT}},
356 	{EV_TIMEOUT,  721,729, -1,                  0, 0, {ACT_ABORTACCEPT}},
357 	{RSP_ZSAU,    700,729,ZSAU_NULL,            0, 0, {ACT_ABORTACCEPT}},
358 	{RSP_ZSAU,    700,729,ZSAU_ACTIVE,          0, 0, {ACT_ABORTACCEPT}},
359 	{RSP_ZSAU,    700,729,ZSAU_DISCONNECT_IND,  0, 0, {ACT_ABORTACCEPT}},
360 
361 	{EV_TIMEOUT,  750,750, -1,                  0, 0, {ACT_CONNTIMEOUT}},
362 
363 	/* B channel closed (general case) */
364 	{EV_BC_CLOSED, -1, -1, -1,                 -1,-1, {ACT_NOTIFY_BC_DOWN}}, //FIXME
365 
366 	/* misc. */
367 	{EV_PROTO_L2,  -1, -1, -1,                 -1,-1, {ACT_PROTO_L2}}, //FIXME
368 
369 	{RSP_ZCON,     -1, -1, -1,                 -1,-1, {ACT_DEBUG}}, //FIXME
370 	{RSP_ZCCR,     -1, -1, -1,                 -1,-1, {ACT_DEBUG}}, //FIXME
371 	{RSP_ZAOC,     -1, -1, -1,                 -1,-1, {ACT_DEBUG}}, //FIXME
372 	{RSP_ZCSTR,    -1, -1, -1,                 -1,-1, {ACT_DEBUG}}, //FIXME
373 
374 	{RSP_ZCAU,     -1, -1, -1,                 -1,-1, {ACT_ZCAU}},
375 	{RSP_NONE,     -1, -1, -1,                 -1,-1, {ACT_DEBUG}},
376 	{RSP_ANY,      -1, -1, -1,                 -1,-1, {ACT_WARN}},
377 	{RSP_LAST}
378 };
379 
380 
381 static const struct resp_type_t resp_type[] =
382 {
383 	/*{"",		RSP_EMPTY,	RT_NOTHING},*/
384 	{"OK",		RSP_OK,		RT_NOTHING},
385 	{"ERROR",	RSP_ERROR,	RT_NOTHING},
386 	{"ZSAU",	RSP_ZSAU,	RT_ZSAU},
387 	{"ZCAU",	RSP_ZCAU,	RT_ZCAU},
388 	{"RING",	RSP_RING,	RT_RING},
389 	{"ZGCI",	RSP_ZGCI,	RT_NUMBER},
390 	{"ZVLS",	RSP_ZVLS,	RT_NUMBER},
391 	{"ZCTP",	RSP_ZCTP,	RT_NUMBER},
392 	{"ZDLE",	RSP_ZDLE,	RT_NUMBER},
393 	{"ZCFGT",	RSP_ZCFGT,	RT_NUMBER},
394 	{"ZCCR",	RSP_ZCCR,	RT_NUMBER},
395 	{"ZMWI",	RSP_ZMWI,	RT_NUMBER},
396 	{"ZHLC",	RSP_ZHLC,	RT_STRING},
397 	{"ZBC",		RSP_ZBC,	RT_STRING},
398 	{"NMBR",	RSP_NMBR,	RT_STRING},
399 	{"ZCPN",	RSP_ZCPN,	RT_STRING},
400 	{"ZCON",	RSP_ZCON,	RT_STRING},
401 	{"ZAOC",	RSP_ZAOC,	RT_STRING},
402 	{"ZCSTR",	RSP_ZCSTR,	RT_STRING},
403 	{"ZCFG",	RSP_ZCFG,	RT_HEX},
404 	{"ZLOG",	RSP_ZLOG,	RT_NOTHING},
405 	{"ZABINFO",	RSP_ZABINFO,	RT_NOTHING},
406 	{"ZSMLSTCHG",	RSP_ZSMLSTCHG,	RT_NOTHING},
407 	{NULL,0,0}
408 };
409 
410 /*
411  * Get integer from char-pointer
412  */
isdn_getnum(char * p)413 static int isdn_getnum(char *p)
414 {
415 	int v = -1;
416 
417 	gig_dbg(DEBUG_TRANSCMD, "string: %s", p);
418 
419 	while (*p >= '0' && *p <= '9')
420 		v = ((v < 0) ? 0 : (v * 10)) + (int) ((*p++) - '0');
421 	if (*p)
422 		v = -1; /* invalid Character */
423 	return v;
424 }
425 
426 /*
427  * Get integer from char-pointer
428  */
isdn_gethex(char * p)429 static int isdn_gethex(char *p)
430 {
431 	int v = 0;
432 	int c;
433 
434 	gig_dbg(DEBUG_TRANSCMD, "string: %s", p);
435 
436 	if (!*p)
437 		return -1;
438 
439 	do {
440 		if (v > (INT_MAX - 15) / 16)
441 			return -1;
442 		c = *p;
443 		if (c >= '0' && c <= '9')
444 			c -= '0';
445 		else if (c >= 'a' && c <= 'f')
446 			c -= 'a' - 10;
447 		else if (c >= 'A' && c <= 'F')
448 			c -= 'A' - 10;
449 		else
450 			return -1;
451 		v = v * 16 + c;
452 	} while (*++p);
453 
454 	return v;
455 }
456 
457 /* retrieve CID from parsed response
458  * returns 0 if no CID, -1 if invalid CID, or CID value 1..65535
459  */
cid_of_response(char * s)460 static int cid_of_response(char *s)
461 {
462 	int cid;
463 
464 	if (s[-1] != ';')
465 		return 0;	/* no CID separator */
466 	cid = isdn_getnum(s);
467 	if (cid < 0)
468 		return 0;	/* CID not numeric */
469 	if (cid < 1 || cid > 65535)
470 		return -1;	/* CID out of range */
471 	return cid;
472 	//FIXME is ;<digit>+ at end of non-CID response really impossible?
473 }
474 
475 /* This function will be called via task queue from the callback handler.
476  * We received a modem response and have to handle it..
477  */
gigaset_handle_modem_response(struct cardstate * cs)478 void gigaset_handle_modem_response(struct cardstate *cs)
479 {
480 	unsigned char *argv[MAX_REC_PARAMS + 1];
481 	int params;
482 	int i, j;
483 	const struct resp_type_t *rt;
484 	int curarg;
485 	unsigned long flags;
486 	unsigned next, tail, head;
487 	struct event_t *event;
488 	int resp_code;
489 	int param_type;
490 	int abort;
491 	size_t len;
492 	int cid;
493 	int rawstring;
494 
495 	len = cs->cbytes;
496 	if (!len) {
497 		/* ignore additional LFs/CRs (M10x config mode or cx100) */
498 		gig_dbg(DEBUG_MCMD, "skipped EOL [%02X]", cs->respdata[len]);
499 		return;
500 	}
501 	cs->respdata[len] = 0;
502 	gig_dbg(DEBUG_TRANSCMD, "raw string: '%s'", cs->respdata);
503 	argv[0] = cs->respdata;
504 	params = 1;
505 	if (cs->at_state.getstring) {
506 		/* getstring only allowed without cid at the moment */
507 		cs->at_state.getstring = 0;
508 		rawstring = 1;
509 		cid = 0;
510 	} else {
511 		/* parse line */
512 		for (i = 0; i < len; i++)
513 			switch (cs->respdata[i]) {
514 			case ';':
515 			case ',':
516 			case '=':
517 				if (params > MAX_REC_PARAMS) {
518 					dev_warn(cs->dev,
519 					   "too many parameters in response\n");
520 					/* need last parameter (might be CID) */
521 					params--;
522 				}
523 				argv[params++] = cs->respdata + i + 1;
524 			}
525 
526 		rawstring = 0;
527 		cid = params > 1 ? cid_of_response(argv[params-1]) : 0;
528 		if (cid < 0) {
529 			gigaset_add_event(cs, &cs->at_state, RSP_INVAL,
530 					  NULL, 0, NULL);
531 			return;
532 		}
533 
534 		for (j = 1; j < params; ++j)
535 			argv[j][-1] = 0;
536 
537 		gig_dbg(DEBUG_TRANSCMD, "CMD received: %s", argv[0]);
538 		if (cid) {
539 			--params;
540 			gig_dbg(DEBUG_TRANSCMD, "CID: %s", argv[params]);
541 		}
542 		gig_dbg(DEBUG_TRANSCMD, "available params: %d", params - 1);
543 		for (j = 1; j < params; j++)
544 			gig_dbg(DEBUG_TRANSCMD, "param %d: %s", j, argv[j]);
545 	}
546 
547 	spin_lock_irqsave(&cs->ev_lock, flags);
548 	head = cs->ev_head;
549 	tail = cs->ev_tail;
550 
551 	abort = 1;
552 	curarg = 0;
553 	while (curarg < params) {
554 		next = (tail + 1) % MAX_EVENTS;
555 		if (unlikely(next == head)) {
556 			dev_err(cs->dev, "event queue full\n");
557 			break;
558 		}
559 
560 		event = cs->events + tail;
561 		event->at_state = NULL;
562 		event->cid = cid;
563 		event->ptr = NULL;
564 		event->arg = NULL;
565 		tail = next;
566 
567 		if (rawstring) {
568 			resp_code = RSP_STRING;
569 			param_type = RT_STRING;
570 		} else {
571 			for (rt = resp_type; rt->response; ++rt)
572 				if (!strcmp(argv[curarg], rt->response))
573 					break;
574 
575 			if (!rt->response) {
576 				event->type = RSP_UNKNOWN;
577 				dev_warn(cs->dev,
578 					 "unknown modem response: %s\n",
579 					 argv[curarg]);
580 				break;
581 			}
582 
583 			resp_code = rt->resp_code;
584 			param_type = rt->type;
585 			++curarg;
586 		}
587 
588 		event->type = resp_code;
589 
590 		switch (param_type) {
591 		case RT_NOTHING:
592 			break;
593 		case RT_RING:
594 			if (!cid) {
595 				dev_err(cs->dev,
596 					"received RING without CID!\n");
597 				event->type = RSP_INVAL;
598 				abort = 1;
599 			} else {
600 				event->cid = 0;
601 				event->parameter = cid;
602 				abort = 0;
603 			}
604 			break;
605 		case RT_ZSAU:
606 			if (curarg >= params) {
607 				event->parameter = ZSAU_NONE;
608 				break;
609 			}
610 			if (!strcmp(argv[curarg], "OUTGOING_CALL_PROCEEDING"))
611 				event->parameter = ZSAU_OUTGOING_CALL_PROCEEDING;
612 			else if (!strcmp(argv[curarg], "CALL_DELIVERED"))
613 				event->parameter = ZSAU_CALL_DELIVERED;
614 			else if (!strcmp(argv[curarg], "ACTIVE"))
615 				event->parameter = ZSAU_ACTIVE;
616 			else if (!strcmp(argv[curarg], "DISCONNECT_IND"))
617 				event->parameter = ZSAU_DISCONNECT_IND;
618 			else if (!strcmp(argv[curarg], "NULL"))
619 				event->parameter = ZSAU_NULL;
620 			else if (!strcmp(argv[curarg], "DISCONNECT_REQ"))
621 				event->parameter = ZSAU_DISCONNECT_REQ;
622 			else {
623 				event->parameter = ZSAU_UNKNOWN;
624 				dev_warn(cs->dev,
625 					"%s: unknown parameter %s after ZSAU\n",
626 					 __func__, argv[curarg]);
627 			}
628 			++curarg;
629 			break;
630 		case RT_STRING:
631 			if (curarg < params) {
632 				event->ptr = kstrdup(argv[curarg], GFP_ATOMIC);
633 				if (!event->ptr)
634 					dev_err(cs->dev, "out of memory\n");
635 				++curarg;
636 			}
637 			gig_dbg(DEBUG_CMD, "string==%s",
638 				event->ptr ? (char *) event->ptr : "NULL");
639 			break;
640 		case RT_ZCAU:
641 			event->parameter = -1;
642 			if (curarg + 1 < params) {
643 				i = isdn_gethex(argv[curarg]);
644 				j = isdn_gethex(argv[curarg + 1]);
645 				if (i >= 0 && i < 256 && j >= 0 && j < 256)
646 					event->parameter = (unsigned) i << 8
647 							   | j;
648 				curarg += 2;
649 			} else
650 				curarg = params - 1;
651 			break;
652 		case RT_NUMBER:
653 		case RT_HEX:
654 			if (curarg < params) {
655 				if (param_type == RT_HEX)
656 					event->parameter =
657 						isdn_gethex(argv[curarg]);
658 				else
659 					event->parameter =
660 						isdn_getnum(argv[curarg]);
661 				++curarg;
662 			} else
663 				event->parameter = -1;
664 			gig_dbg(DEBUG_CMD, "parameter==%d", event->parameter);
665 			break;
666 		}
667 
668 		if (resp_code == RSP_ZDLE)
669 			cs->dle = event->parameter;
670 
671 		if (abort)
672 			break;
673 	}
674 
675 	cs->ev_tail = tail;
676 	spin_unlock_irqrestore(&cs->ev_lock, flags);
677 
678 	if (curarg != params)
679 		gig_dbg(DEBUG_ANY,
680 			"invalid number of processed parameters: %d/%d",
681 			curarg, params);
682 }
683 EXPORT_SYMBOL_GPL(gigaset_handle_modem_response);
684 
685 /* disconnect
686  * process closing of connection associated with given AT state structure
687  */
disconnect(struct at_state_t ** at_state_p)688 static void disconnect(struct at_state_t **at_state_p)
689 {
690 	unsigned long flags;
691 	struct bc_state *bcs = (*at_state_p)->bcs;
692 	struct cardstate *cs = (*at_state_p)->cs;
693 
694 	spin_lock_irqsave(&cs->lock, flags);
695 	++(*at_state_p)->seq_index;
696 
697 	/* revert to selected idle mode */
698 	if (!cs->cidmode) {
699 		cs->at_state.pending_commands |= PC_UMMODE;
700 		cs->commands_pending = 1;
701 		gig_dbg(DEBUG_CMD, "Scheduling PC_UMMODE");
702 	}
703 	spin_unlock_irqrestore(&cs->lock, flags);
704 
705 	if (bcs) {
706 		/* B channel assigned: invoke hardware specific handler */
707 		cs->ops->close_bchannel(bcs);
708 	} else {
709 		/* no B channel assigned: just deallocate */
710 		spin_lock_irqsave(&cs->lock, flags);
711 		list_del(&(*at_state_p)->list);
712 		kfree(*at_state_p);
713 		*at_state_p = NULL;
714 		spin_unlock_irqrestore(&cs->lock, flags);
715 	}
716 }
717 
718 /* get_free_channel
719  * get a free AT state structure: either one of those associated with the
720  * B channels of the Gigaset device, or if none of those is available,
721  * a newly allocated one with bcs=NULL
722  * The structure should be freed by calling disconnect() after use.
723  */
get_free_channel(struct cardstate * cs,int cid)724 static inline struct at_state_t *get_free_channel(struct cardstate *cs,
725 						  int cid)
726 /* cids: >0: siemens-cid
727 	  0: without cid
728 	 -1: no cid assigned yet
729 */
730 {
731 	unsigned long flags;
732 	int i;
733 	struct at_state_t *ret;
734 
735 	for (i = 0; i < cs->channels; ++i)
736 		if (gigaset_get_channel(cs->bcs + i)) {
737 			ret = &cs->bcs[i].at_state;
738 			ret->cid = cid;
739 			return ret;
740 		}
741 
742 	spin_lock_irqsave(&cs->lock, flags);
743 	ret = kmalloc(sizeof(struct at_state_t), GFP_ATOMIC);
744 	if (ret) {
745 		gigaset_at_init(ret, NULL, cs, cid);
746 		list_add(&ret->list, &cs->temp_at_states);
747 	}
748 	spin_unlock_irqrestore(&cs->lock, flags);
749 	return ret;
750 }
751 
init_failed(struct cardstate * cs,int mode)752 static void init_failed(struct cardstate *cs, int mode)
753 {
754 	int i;
755 	struct at_state_t *at_state;
756 
757 	cs->at_state.pending_commands &= ~PC_INIT;
758 	cs->mode = mode;
759 	cs->mstate = MS_UNINITIALIZED;
760 	gigaset_free_channels(cs);
761 	for (i = 0; i < cs->channels; ++i) {
762 		at_state = &cs->bcs[i].at_state;
763 		if (at_state->pending_commands & PC_CID) {
764 			at_state->pending_commands &= ~PC_CID;
765 			at_state->pending_commands |= PC_NOCID;
766 			cs->commands_pending = 1;
767 		}
768 	}
769 }
770 
schedule_init(struct cardstate * cs,int state)771 static void schedule_init(struct cardstate *cs, int state)
772 {
773 	if (cs->at_state.pending_commands & PC_INIT) {
774 		gig_dbg(DEBUG_CMD, "not scheduling PC_INIT again");
775 		return;
776 	}
777 	cs->mstate = state;
778 	cs->mode = M_UNKNOWN;
779 	gigaset_block_channels(cs);
780 	cs->at_state.pending_commands |= PC_INIT;
781 	cs->commands_pending = 1;
782 	gig_dbg(DEBUG_CMD, "Scheduling PC_INIT");
783 }
784 
785 /* Add "AT" to a command, add the cid, dle encode it, send the result to the
786    hardware. */
send_command(struct cardstate * cs,const char * cmd,int cid,int dle,gfp_t kmallocflags)787 static void send_command(struct cardstate *cs, const char *cmd, int cid,
788 			 int dle, gfp_t kmallocflags)
789 {
790 	size_t cmdlen, buflen;
791 	char *cmdpos, *cmdbuf, *cmdtail;
792 
793 	cmdlen = strlen(cmd);
794 	buflen = 11 + cmdlen;
795 	if (unlikely(buflen <= cmdlen)) {
796 		dev_err(cs->dev, "integer overflow in buflen\n");
797 		return;
798 	}
799 
800 	cmdbuf = kmalloc(buflen, kmallocflags);
801 	if (unlikely(!cmdbuf)) {
802 		dev_err(cs->dev, "out of memory\n");
803 		return;
804 	}
805 
806 	cmdpos = cmdbuf + 9;
807 	cmdtail = cmdpos + cmdlen;
808 	memcpy(cmdpos, cmd, cmdlen);
809 
810 	if (cid > 0 && cid <= 65535) {
811 		do {
812 			*--cmdpos = '0' + cid % 10;
813 			cid /= 10;
814 			++cmdlen;
815 		} while (cid);
816 	}
817 
818 	cmdlen += 2;
819 	*--cmdpos = 'T';
820 	*--cmdpos = 'A';
821 
822 	if (dle) {
823 		cmdlen += 4;
824 		*--cmdpos = '(';
825 		*--cmdpos = 0x10;
826 		*cmdtail++ = 0x10;
827 		*cmdtail++ = ')';
828 	}
829 
830 	cs->ops->write_cmd(cs, cmdpos, cmdlen, NULL);
831 	kfree(cmdbuf);
832 }
833 
at_state_from_cid(struct cardstate * cs,int cid)834 static struct at_state_t *at_state_from_cid(struct cardstate *cs, int cid)
835 {
836 	struct at_state_t *at_state;
837 	int i;
838 	unsigned long flags;
839 
840 	if (cid == 0)
841 		return &cs->at_state;
842 
843 	for (i = 0; i < cs->channels; ++i)
844 		if (cid == cs->bcs[i].at_state.cid)
845 			return &cs->bcs[i].at_state;
846 
847 	spin_lock_irqsave(&cs->lock, flags);
848 
849 	list_for_each_entry(at_state, &cs->temp_at_states, list)
850 		if (cid == at_state->cid) {
851 			spin_unlock_irqrestore(&cs->lock, flags);
852 			return at_state;
853 		}
854 
855 	spin_unlock_irqrestore(&cs->lock, flags);
856 
857 	return NULL;
858 }
859 
bchannel_down(struct bc_state * bcs)860 static void bchannel_down(struct bc_state *bcs)
861 {
862 	if (bcs->chstate & CHS_B_UP) {
863 		bcs->chstate &= ~CHS_B_UP;
864 		gigaset_i4l_channel_cmd(bcs, ISDN_STAT_BHUP);
865 	}
866 
867 	if (bcs->chstate & (CHS_D_UP | CHS_NOTIFY_LL)) {
868 		bcs->chstate &= ~(CHS_D_UP | CHS_NOTIFY_LL);
869 		gigaset_i4l_channel_cmd(bcs, ISDN_STAT_DHUP);
870 	}
871 
872 	gigaset_free_channel(bcs);
873 
874 	gigaset_bcs_reinit(bcs);
875 }
876 
bchannel_up(struct bc_state * bcs)877 static void bchannel_up(struct bc_state *bcs)
878 {
879 	if (!(bcs->chstate & CHS_D_UP)) {
880 		dev_notice(bcs->cs->dev, "%s: D channel not up\n", __func__);
881 		bcs->chstate |= CHS_D_UP;
882 		gigaset_i4l_channel_cmd(bcs, ISDN_STAT_DCONN);
883 	}
884 
885 	if (bcs->chstate & CHS_B_UP) {
886 		dev_notice(bcs->cs->dev, "%s: B channel already up\n",
887 			   __func__);
888 		return;
889 	}
890 
891 	bcs->chstate |= CHS_B_UP;
892 	gigaset_i4l_channel_cmd(bcs, ISDN_STAT_BCONN);
893 }
894 
start_dial(struct at_state_t * at_state,void * data,unsigned seq_index)895 static void start_dial(struct at_state_t *at_state, void *data, unsigned seq_index)
896 {
897 	struct bc_state *bcs = at_state->bcs;
898 	struct cardstate *cs = at_state->cs;
899 	int retval;
900 	unsigned long flags;
901 
902 	bcs->chstate |= CHS_NOTIFY_LL;
903 
904 	spin_lock_irqsave(&cs->lock, flags);
905 	if (at_state->seq_index != seq_index) {
906 		spin_unlock_irqrestore(&cs->lock, flags);
907 		goto error;
908 	}
909 	spin_unlock_irqrestore(&cs->lock, flags);
910 
911 	retval = gigaset_isdn_setup_dial(at_state, data);
912 	if (retval != 0)
913 		goto error;
914 
915 
916 	at_state->pending_commands |= PC_CID;
917 	gig_dbg(DEBUG_CMD, "Scheduling PC_CID");
918 	cs->commands_pending = 1;
919 	return;
920 
921 error:
922 	at_state->pending_commands |= PC_NOCID;
923 	gig_dbg(DEBUG_CMD, "Scheduling PC_NOCID");
924 	cs->commands_pending = 1;
925 	return;
926 }
927 
start_accept(struct at_state_t * at_state)928 static void start_accept(struct at_state_t *at_state)
929 {
930 	struct cardstate *cs = at_state->cs;
931 	int retval;
932 
933 	retval = gigaset_isdn_setup_accept(at_state);
934 
935 	if (retval == 0) {
936 		at_state->pending_commands |= PC_ACCEPT;
937 		gig_dbg(DEBUG_CMD, "Scheduling PC_ACCEPT");
938 		cs->commands_pending = 1;
939 	} else {
940 		/* error reset */
941 		at_state->pending_commands |= PC_HUP;
942 		gig_dbg(DEBUG_CMD, "Scheduling PC_HUP");
943 		cs->commands_pending = 1;
944 	}
945 }
946 
do_start(struct cardstate * cs)947 static void do_start(struct cardstate *cs)
948 {
949 	gigaset_free_channels(cs);
950 
951 	if (cs->mstate != MS_LOCKED)
952 		schedule_init(cs, MS_INIT);
953 
954 	cs->isdn_up = 1;
955 	gigaset_i4l_cmd(cs, ISDN_STAT_RUN);
956 					// FIXME: not in locked mode
957 					// FIXME 2: only after init sequence
958 
959 	cs->waiting = 0;
960 	wake_up(&cs->waitqueue);
961 }
962 
finish_shutdown(struct cardstate * cs)963 static void finish_shutdown(struct cardstate *cs)
964 {
965 	if (cs->mstate != MS_LOCKED) {
966 		cs->mstate = MS_UNINITIALIZED;
967 		cs->mode = M_UNKNOWN;
968 	}
969 
970 	/* Tell the LL that the device is not available .. */
971 	if (cs->isdn_up) {
972 		cs->isdn_up = 0;
973 		gigaset_i4l_cmd(cs, ISDN_STAT_STOP);
974 	}
975 
976 	/* The rest is done by cleanup_cs () in user mode. */
977 
978 	cs->cmd_result = -ENODEV;
979 	cs->waiting = 0;
980 	wake_up(&cs->waitqueue);
981 }
982 
do_shutdown(struct cardstate * cs)983 static void do_shutdown(struct cardstate *cs)
984 {
985 	gigaset_block_channels(cs);
986 
987 	if (cs->mstate == MS_READY) {
988 		cs->mstate = MS_SHUTDOWN;
989 		cs->at_state.pending_commands |= PC_SHUTDOWN;
990 		cs->commands_pending = 1;
991 		gig_dbg(DEBUG_CMD, "Scheduling PC_SHUTDOWN");
992 	} else
993 		finish_shutdown(cs);
994 }
995 
do_stop(struct cardstate * cs)996 static void do_stop(struct cardstate *cs)
997 {
998 	unsigned long flags;
999 
1000 	spin_lock_irqsave(&cs->lock, flags);
1001 	cs->connected = 0;
1002 	spin_unlock_irqrestore(&cs->lock, flags);
1003 
1004 	do_shutdown(cs);
1005 }
1006 
1007 /* Entering cid mode or getting a cid failed:
1008  * try to initialize the device and try again.
1009  *
1010  * channel >= 0: getting cid for the channel failed
1011  * channel < 0:  entering cid mode failed
1012  *
1013  * returns 0 on failure
1014  */
reinit_and_retry(struct cardstate * cs,int channel)1015 static int reinit_and_retry(struct cardstate *cs, int channel)
1016 {
1017 	int i;
1018 
1019 	if (--cs->retry_count <= 0)
1020 		return 0;
1021 
1022 	for (i = 0; i < cs->channels; ++i)
1023 		if (cs->bcs[i].at_state.cid > 0)
1024 			return 0;
1025 
1026 	if (channel < 0)
1027 		dev_warn(cs->dev,
1028 		    "Could not enter cid mode. Reinit device and try again.\n");
1029 	else {
1030 		dev_warn(cs->dev,
1031 		    "Could not get a call id. Reinit device and try again.\n");
1032 		cs->bcs[channel].at_state.pending_commands |= PC_CID;
1033 	}
1034 	schedule_init(cs, MS_INIT);
1035 	return 1;
1036 }
1037 
at_state_invalid(struct cardstate * cs,struct at_state_t * test_ptr)1038 static int at_state_invalid(struct cardstate *cs,
1039 			    struct at_state_t *test_ptr)
1040 {
1041 	unsigned long flags;
1042 	unsigned channel;
1043 	struct at_state_t *at_state;
1044 	int retval = 0;
1045 
1046 	spin_lock_irqsave(&cs->lock, flags);
1047 
1048 	if (test_ptr == &cs->at_state)
1049 		goto exit;
1050 
1051 	list_for_each_entry(at_state, &cs->temp_at_states, list)
1052 		if (at_state == test_ptr)
1053 			goto exit;
1054 
1055 	for (channel = 0; channel < cs->channels; ++channel)
1056 		if (&cs->bcs[channel].at_state == test_ptr)
1057 			goto exit;
1058 
1059 	retval = 1;
1060 exit:
1061 	spin_unlock_irqrestore(&cs->lock, flags);
1062 	return retval;
1063 }
1064 
handle_icall(struct cardstate * cs,struct bc_state * bcs,struct at_state_t ** p_at_state)1065 static void handle_icall(struct cardstate *cs, struct bc_state *bcs,
1066 			 struct at_state_t **p_at_state)
1067 {
1068 	int retval;
1069 	struct at_state_t *at_state = *p_at_state;
1070 
1071 	retval = gigaset_isdn_icall(at_state);
1072 	switch (retval) {
1073 	case ICALL_ACCEPT:
1074 		break;
1075 	default:
1076 		dev_err(cs->dev, "internal error: disposition=%d\n", retval);
1077 		/* --v-- fall through --v-- */
1078 	case ICALL_IGNORE:
1079 	case ICALL_REJECT:
1080 		/* hang up actively
1081 		 * Device doc says that would reject the call.
1082 		 * In fact it doesn't.
1083 		 */
1084 		at_state->pending_commands |= PC_HUP;
1085 		cs->commands_pending = 1;
1086 		break;
1087 	}
1088 }
1089 
do_lock(struct cardstate * cs)1090 static int do_lock(struct cardstate *cs)
1091 {
1092 	int mode;
1093 	int i;
1094 
1095 	switch (cs->mstate) {
1096 	case MS_UNINITIALIZED:
1097 	case MS_READY:
1098 		if (cs->cur_at_seq || !list_empty(&cs->temp_at_states) ||
1099 		    cs->at_state.pending_commands)
1100 			return -EBUSY;
1101 
1102 		for (i = 0; i < cs->channels; ++i)
1103 			if (cs->bcs[i].at_state.pending_commands)
1104 				return -EBUSY;
1105 
1106 		if (!gigaset_get_channels(cs))
1107 			return -EBUSY;
1108 
1109 		break;
1110 	case MS_LOCKED:
1111 		//retval = -EACCES;
1112 		break;
1113 	default:
1114 		return -EBUSY;
1115 	}
1116 
1117 	mode = cs->mode;
1118 	cs->mstate = MS_LOCKED;
1119 	cs->mode = M_UNKNOWN;
1120 
1121 	return mode;
1122 }
1123 
do_unlock(struct cardstate * cs)1124 static int do_unlock(struct cardstate *cs)
1125 {
1126 	if (cs->mstate != MS_LOCKED)
1127 		return -EINVAL;
1128 
1129 	cs->mstate = MS_UNINITIALIZED;
1130 	cs->mode = M_UNKNOWN;
1131 	gigaset_free_channels(cs);
1132 	if (cs->connected)
1133 		schedule_init(cs, MS_INIT);
1134 
1135 	return 0;
1136 }
1137 
do_action(int action,struct cardstate * cs,struct bc_state * bcs,struct at_state_t ** p_at_state,char ** pp_command,int * p_genresp,int * p_resp_code,struct event_t * ev)1138 static void do_action(int action, struct cardstate *cs,
1139 		      struct bc_state *bcs,
1140 		      struct at_state_t **p_at_state, char **pp_command,
1141 		      int *p_genresp, int *p_resp_code,
1142 		      struct event_t *ev)
1143 {
1144 	struct at_state_t *at_state = *p_at_state;
1145 	struct at_state_t *at_state2;
1146 	unsigned long flags;
1147 
1148 	int channel;
1149 
1150 	unsigned char *s, *e;
1151 	int i;
1152 	unsigned long val;
1153 
1154 	switch (action) {
1155 	case ACT_NOTHING:
1156 		break;
1157 	case ACT_TIMEOUT:
1158 		at_state->waiting = 1;
1159 		break;
1160 	case ACT_INIT:
1161 		cs->at_state.pending_commands &= ~PC_INIT;
1162 		cs->cur_at_seq = SEQ_NONE;
1163 		cs->mode = M_UNIMODEM;
1164 		spin_lock_irqsave(&cs->lock, flags);
1165 		if (!cs->cidmode) {
1166 			spin_unlock_irqrestore(&cs->lock, flags);
1167 			gigaset_free_channels(cs);
1168 			cs->mstate = MS_READY;
1169 			break;
1170 		}
1171 		spin_unlock_irqrestore(&cs->lock, flags);
1172 		cs->at_state.pending_commands |= PC_CIDMODE;
1173 		cs->commands_pending = 1;
1174 		gig_dbg(DEBUG_CMD, "Scheduling PC_CIDMODE");
1175 		break;
1176 	case ACT_FAILINIT:
1177 		dev_warn(cs->dev, "Could not initialize the device.\n");
1178 		cs->dle = 0;
1179 		init_failed(cs, M_UNKNOWN);
1180 		cs->cur_at_seq = SEQ_NONE;
1181 		break;
1182 	case ACT_CONFIGMODE:
1183 		init_failed(cs, M_CONFIG);
1184 		cs->cur_at_seq = SEQ_NONE;
1185 		break;
1186 	case ACT_SETDLE1:
1187 		cs->dle = 1;
1188 		/* cs->inbuf[0].inputstate |= INS_command | INS_DLE_command; */
1189 		cs->inbuf[0].inputstate &=
1190 			~(INS_command | INS_DLE_command);
1191 		break;
1192 	case ACT_SETDLE0:
1193 		cs->dle = 0;
1194 		cs->inbuf[0].inputstate =
1195 			(cs->inbuf[0].inputstate & ~INS_DLE_command)
1196 			| INS_command;
1197 		break;
1198 	case ACT_CMODESET:
1199 		if (cs->mstate == MS_INIT || cs->mstate == MS_RECOVER) {
1200 			gigaset_free_channels(cs);
1201 			cs->mstate = MS_READY;
1202 		}
1203 		cs->mode = M_CID;
1204 		cs->cur_at_seq = SEQ_NONE;
1205 		break;
1206 	case ACT_UMODESET:
1207 		cs->mode = M_UNIMODEM;
1208 		cs->cur_at_seq = SEQ_NONE;
1209 		break;
1210 	case ACT_FAILCMODE:
1211 		cs->cur_at_seq = SEQ_NONE;
1212 		if (cs->mstate == MS_INIT || cs->mstate == MS_RECOVER) {
1213 			init_failed(cs, M_UNKNOWN);
1214 			break;
1215 		}
1216 		if (!reinit_and_retry(cs, -1))
1217 			schedule_init(cs, MS_RECOVER);
1218 		break;
1219 	case ACT_FAILUMODE:
1220 		cs->cur_at_seq = SEQ_NONE;
1221 		schedule_init(cs, MS_RECOVER);
1222 		break;
1223 	case ACT_HUPMODEM:
1224 		/* send "+++" (hangup in unimodem mode) */
1225 		if (cs->connected)
1226 			cs->ops->write_cmd(cs, "+++", 3, NULL);
1227 		break;
1228 	case ACT_RING:
1229 		/* get fresh AT state structure for new CID */
1230 		at_state2 = get_free_channel(cs, ev->parameter);
1231 		if (!at_state2) {
1232 			dev_warn(cs->dev,
1233 			"RING ignored: could not allocate channel structure\n");
1234 			break;
1235 		}
1236 
1237 		/* initialize AT state structure
1238 		 * note that bcs may be NULL if no B channel is free
1239 		 */
1240 		at_state2->ConState = 700;
1241 		kfree(at_state2->str_var[STR_NMBR]);
1242 		at_state2->str_var[STR_NMBR] = NULL;
1243 		kfree(at_state2->str_var[STR_ZCPN]);
1244 		at_state2->str_var[STR_ZCPN] = NULL;
1245 		kfree(at_state2->str_var[STR_ZBC]);
1246 		at_state2->str_var[STR_ZBC] = NULL;
1247 		kfree(at_state2->str_var[STR_ZHLC]);
1248 		at_state2->str_var[STR_ZHLC] = NULL;
1249 		at_state2->int_var[VAR_ZCTP] = -1;
1250 
1251 		spin_lock_irqsave(&cs->lock, flags);
1252 		at_state2->timer_expires = RING_TIMEOUT;
1253 		at_state2->timer_active = 1;
1254 		spin_unlock_irqrestore(&cs->lock, flags);
1255 		break;
1256 	case ACT_ICALL:
1257 		handle_icall(cs, bcs, p_at_state);
1258 		break;
1259 	case ACT_FAILSDOWN:
1260 		dev_warn(cs->dev, "Could not shut down the device.\n");
1261 		/* fall through */
1262 	case ACT_FAKESDOWN:
1263 	case ACT_SDOWN:
1264 		cs->cur_at_seq = SEQ_NONE;
1265 		finish_shutdown(cs);
1266 		break;
1267 	case ACT_CONNECT:
1268 		if (cs->onechannel) {
1269 			at_state->pending_commands |= PC_DLE1;
1270 			cs->commands_pending = 1;
1271 			break;
1272 		}
1273 		bcs->chstate |= CHS_D_UP;
1274 		gigaset_i4l_channel_cmd(bcs, ISDN_STAT_DCONN);
1275 		cs->ops->init_bchannel(bcs);
1276 		break;
1277 	case ACT_DLE1:
1278 		cs->cur_at_seq = SEQ_NONE;
1279 		bcs = cs->bcs + cs->curchannel;
1280 
1281 		bcs->chstate |= CHS_D_UP;
1282 		gigaset_i4l_channel_cmd(bcs, ISDN_STAT_DCONN);
1283 		cs->ops->init_bchannel(bcs);
1284 		break;
1285 	case ACT_FAKEHUP:
1286 		at_state->int_var[VAR_ZSAU] = ZSAU_NULL;
1287 		/* fall through */
1288 	case ACT_DISCONNECT:
1289 		cs->cur_at_seq = SEQ_NONE;
1290 		at_state->cid = -1;
1291 		if (bcs && cs->onechannel && cs->dle) {
1292 			/* Check for other open channels not needed:
1293 			 * DLE only used for M10x with one B channel.
1294 			 */
1295 			at_state->pending_commands |= PC_DLE0;
1296 			cs->commands_pending = 1;
1297 		} else
1298 			disconnect(p_at_state);
1299 		break;
1300 	case ACT_FAKEDLE0:
1301 		at_state->int_var[VAR_ZDLE] = 0;
1302 		cs->dle = 0;
1303 		/* fall through */
1304 	case ACT_DLE0:
1305 		cs->cur_at_seq = SEQ_NONE;
1306 		at_state2 = &cs->bcs[cs->curchannel].at_state;
1307 		disconnect(&at_state2);
1308 		break;
1309 	case ACT_ABORTHUP:
1310 		cs->cur_at_seq = SEQ_NONE;
1311 		dev_warn(cs->dev, "Could not hang up.\n");
1312 		at_state->cid = -1;
1313 		if (bcs && cs->onechannel)
1314 			at_state->pending_commands |= PC_DLE0;
1315 		else
1316 			disconnect(p_at_state);
1317 		schedule_init(cs, MS_RECOVER);
1318 		break;
1319 	case ACT_FAILDLE0:
1320 		cs->cur_at_seq = SEQ_NONE;
1321 		dev_warn(cs->dev, "Could not leave DLE mode.\n");
1322 		at_state2 = &cs->bcs[cs->curchannel].at_state;
1323 		disconnect(&at_state2);
1324 		schedule_init(cs, MS_RECOVER);
1325 		break;
1326 	case ACT_FAILDLE1:
1327 		cs->cur_at_seq = SEQ_NONE;
1328 		dev_warn(cs->dev,
1329 			 "Could not enter DLE mode. Trying to hang up.\n");
1330 		channel = cs->curchannel;
1331 		cs->bcs[channel].at_state.pending_commands |= PC_HUP;
1332 		cs->commands_pending = 1;
1333 		break;
1334 
1335 	case ACT_CID: /* got cid; start dialing */
1336 		cs->cur_at_seq = SEQ_NONE;
1337 		channel = cs->curchannel;
1338 		if (ev->parameter > 0 && ev->parameter <= 65535) {
1339 			cs->bcs[channel].at_state.cid = ev->parameter;
1340 			cs->bcs[channel].at_state.pending_commands |=
1341 				PC_DIAL;
1342 			cs->commands_pending = 1;
1343 			break;
1344 		}
1345 		/* fall through */
1346 	case ACT_FAILCID:
1347 		cs->cur_at_seq = SEQ_NONE;
1348 		channel = cs->curchannel;
1349 		if (!reinit_and_retry(cs, channel)) {
1350 			dev_warn(cs->dev,
1351 				 "Could not get a call ID. Cannot dial.\n");
1352 			at_state2 = &cs->bcs[channel].at_state;
1353 			disconnect(&at_state2);
1354 		}
1355 		break;
1356 	case ACT_ABORTCID:
1357 		cs->cur_at_seq = SEQ_NONE;
1358 		at_state2 = &cs->bcs[cs->curchannel].at_state;
1359 		disconnect(&at_state2);
1360 		break;
1361 
1362 	case ACT_DIALING:
1363 	case ACT_ACCEPTED:
1364 		cs->cur_at_seq = SEQ_NONE;
1365 		break;
1366 
1367 	case ACT_ABORTACCEPT:	/* hangup/error/timeout during ICALL processing */
1368 		disconnect(p_at_state);
1369 		break;
1370 
1371 	case ACT_ABORTDIAL:	/* error/timeout during dial preparation */
1372 		cs->cur_at_seq = SEQ_NONE;
1373 		at_state->pending_commands |= PC_HUP;
1374 		cs->commands_pending = 1;
1375 		break;
1376 
1377 	case ACT_REMOTEREJECT:	/* DISCONNECT_IND after dialling */
1378 	case ACT_CONNTIMEOUT:	/* timeout waiting for ZSAU=ACTIVE */
1379 	case ACT_REMOTEHUP:	/* DISCONNECT_IND with established connection */
1380 		at_state->pending_commands |= PC_HUP;
1381 		cs->commands_pending = 1;
1382 		break;
1383 	case ACT_GETSTRING: /* warning: RING, ZDLE, ...
1384 			       are not handled properly anymore */
1385 		at_state->getstring = 1;
1386 		break;
1387 	case ACT_SETVER:
1388 		if (!ev->ptr) {
1389 			*p_genresp = 1;
1390 			*p_resp_code = RSP_ERROR;
1391 			break;
1392 		}
1393 		s = ev->ptr;
1394 
1395 		if (!strcmp(s, "OK")) {
1396 			*p_genresp = 1;
1397 			*p_resp_code = RSP_ERROR;
1398 			break;
1399 		}
1400 
1401 		for (i = 0; i < 4; ++i) {
1402 			val = simple_strtoul(s, (char **) &e, 10);
1403 			if (val > INT_MAX || e == s)
1404 				break;
1405 			if (i == 3) {
1406 				if (*e)
1407 					break;
1408 			} else if (*e != '.')
1409 				break;
1410 			else
1411 				s = e + 1;
1412 			cs->fwver[i] = val;
1413 		}
1414 		if (i != 4) {
1415 			*p_genresp = 1;
1416 			*p_resp_code = RSP_ERROR;
1417 			break;
1418 		}
1419 		/*at_state->getstring = 1;*/
1420 		cs->gotfwver = 0;
1421 		break;
1422 	case ACT_GOTVER:
1423 		if (cs->gotfwver == 0) {
1424 			cs->gotfwver = 1;
1425 			gig_dbg(DEBUG_ANY,
1426 				"firmware version %02d.%03d.%02d.%02d",
1427 				cs->fwver[0], cs->fwver[1],
1428 				cs->fwver[2], cs->fwver[3]);
1429 			break;
1430 		}
1431 		/* fall through */
1432 	case ACT_FAILVER:
1433 		cs->gotfwver = -1;
1434 		dev_err(cs->dev, "could not read firmware version.\n");
1435 		break;
1436 #ifdef CONFIG_GIGASET_DEBUG
1437 	case ACT_ERROR:
1438 		*p_genresp = 1;
1439 		*p_resp_code = RSP_ERROR;
1440 		break;
1441 	case ACT_TEST:
1442 		{
1443 			static int count = 3; //2; //1;
1444 			*p_genresp = 1;
1445 			*p_resp_code = count ? RSP_ERROR : RSP_OK;
1446 			if (count > 0)
1447 				--count;
1448 		}
1449 		break;
1450 #endif
1451 	case ACT_DEBUG:
1452 		gig_dbg(DEBUG_ANY, "%s: resp_code %d in ConState %d",
1453 			__func__, ev->type, at_state->ConState);
1454 		break;
1455 	case ACT_WARN:
1456 		dev_warn(cs->dev, "%s: resp_code %d in ConState %d!\n",
1457 			 __func__, ev->type, at_state->ConState);
1458 		break;
1459 	case ACT_ZCAU:
1460 		dev_warn(cs->dev, "cause code %04x in connection state %d.\n",
1461 			 ev->parameter, at_state->ConState);
1462 		break;
1463 
1464 	/* events from the LL */
1465 	case ACT_DIAL:
1466 		start_dial(at_state, ev->ptr, ev->parameter);
1467 		break;
1468 	case ACT_ACCEPT:
1469 		start_accept(at_state);
1470 		break;
1471 	case ACT_PROTO_L2:
1472 		gig_dbg(DEBUG_CMD, "set protocol to %u",
1473 			(unsigned) ev->parameter);
1474 		at_state->bcs->proto2 = ev->parameter;
1475 		break;
1476 	case ACT_HUP:
1477 		at_state->pending_commands |= PC_HUP;
1478 		cs->commands_pending = 1;
1479 		gig_dbg(DEBUG_CMD, "Scheduling PC_HUP");
1480 		break;
1481 
1482 	/* hotplug events */
1483 	case ACT_STOP:
1484 		do_stop(cs);
1485 		break;
1486 	case ACT_START:
1487 		do_start(cs);
1488 		break;
1489 
1490 	/* events from the interface */ // FIXME without ACT_xxxx?
1491 	case ACT_IF_LOCK:
1492 		cs->cmd_result = ev->parameter ? do_lock(cs) : do_unlock(cs);
1493 		cs->waiting = 0;
1494 		wake_up(&cs->waitqueue);
1495 		break;
1496 	case ACT_IF_VER:
1497 		if (ev->parameter != 0)
1498 			cs->cmd_result = -EINVAL;
1499 		else if (cs->gotfwver != 1) {
1500 			cs->cmd_result = -ENOENT;
1501 		} else {
1502 			memcpy(ev->arg, cs->fwver, sizeof cs->fwver);
1503 			cs->cmd_result = 0;
1504 		}
1505 		cs->waiting = 0;
1506 		wake_up(&cs->waitqueue);
1507 		break;
1508 
1509 	/* events from the proc file system */ // FIXME without ACT_xxxx?
1510 	case ACT_PROC_CIDMODE:
1511 		spin_lock_irqsave(&cs->lock, flags);
1512 		if (ev->parameter != cs->cidmode) {
1513 			cs->cidmode = ev->parameter;
1514 			if (ev->parameter) {
1515 				cs->at_state.pending_commands |= PC_CIDMODE;
1516 				gig_dbg(DEBUG_CMD, "Scheduling PC_CIDMODE");
1517 			} else {
1518 				cs->at_state.pending_commands |= PC_UMMODE;
1519 				gig_dbg(DEBUG_CMD, "Scheduling PC_UMMODE");
1520 			}
1521 			cs->commands_pending = 1;
1522 		}
1523 		spin_unlock_irqrestore(&cs->lock, flags);
1524 		cs->waiting = 0;
1525 		wake_up(&cs->waitqueue);
1526 		break;
1527 
1528 	/* events from the hardware drivers */
1529 	case ACT_NOTIFY_BC_DOWN:
1530 		bchannel_down(bcs);
1531 		break;
1532 	case ACT_NOTIFY_BC_UP:
1533 		bchannel_up(bcs);
1534 		break;
1535 	case ACT_SHUTDOWN:
1536 		do_shutdown(cs);
1537 		break;
1538 
1539 
1540 	default:
1541 		if (action >= ACT_CMD && action < ACT_CMD + AT_NUM) {
1542 			*pp_command = at_state->bcs->commands[action - ACT_CMD];
1543 			if (!*pp_command) {
1544 				*p_genresp = 1;
1545 				*p_resp_code = RSP_NULL;
1546 			}
1547 		} else
1548 			dev_err(cs->dev, "%s: action==%d!\n", __func__, action);
1549 	}
1550 }
1551 
1552 /* State machine to do the calling and hangup procedure */
process_event(struct cardstate * cs,struct event_t * ev)1553 static void process_event(struct cardstate *cs, struct event_t *ev)
1554 {
1555 	struct bc_state *bcs;
1556 	char *p_command = NULL;
1557 	struct reply_t *rep;
1558 	int rcode;
1559 	int genresp = 0;
1560 	int resp_code = RSP_ERROR;
1561 	int sendcid;
1562 	struct at_state_t *at_state;
1563 	int index;
1564 	int curact;
1565 	unsigned long flags;
1566 
1567 	if (ev->cid >= 0) {
1568 		at_state = at_state_from_cid(cs, ev->cid);
1569 		if (!at_state) {
1570 			gigaset_add_event(cs, &cs->at_state, RSP_WRONG_CID,
1571 					  NULL, 0, NULL);
1572 			return;
1573 		}
1574 	} else {
1575 		at_state = ev->at_state;
1576 		if (at_state_invalid(cs, at_state)) {
1577 			gig_dbg(DEBUG_ANY, "event for invalid at_state %p",
1578 				at_state);
1579 			return;
1580 		}
1581 	}
1582 
1583 	gig_dbg(DEBUG_CMD, "connection state %d, event %d",
1584 		at_state->ConState, ev->type);
1585 
1586 	bcs = at_state->bcs;
1587 	sendcid = at_state->cid;
1588 
1589 	/* Setting the pointer to the dial array */
1590 	rep = at_state->replystruct;
1591 
1592 	spin_lock_irqsave(&cs->lock, flags);
1593 	if (ev->type == EV_TIMEOUT) {
1594 		if (ev->parameter != at_state->timer_index
1595 		    || !at_state->timer_active) {
1596 			ev->type = RSP_NONE; /* old timeout */
1597 			gig_dbg(DEBUG_ANY, "old timeout");
1598 		} else if (!at_state->waiting)
1599 			gig_dbg(DEBUG_ANY, "timeout occurred");
1600 		else
1601 			gig_dbg(DEBUG_ANY, "stopped waiting");
1602 	}
1603 	spin_unlock_irqrestore(&cs->lock, flags);
1604 
1605 	/* if the response belongs to a variable in at_state->int_var[VAR_XXXX]
1606 	   or at_state->str_var[STR_XXXX], set it */
1607 	if (ev->type >= RSP_VAR && ev->type < RSP_VAR + VAR_NUM) {
1608 		index = ev->type - RSP_VAR;
1609 		at_state->int_var[index] = ev->parameter;
1610 	} else if (ev->type >= RSP_STR && ev->type < RSP_STR + STR_NUM) {
1611 		index = ev->type - RSP_STR;
1612 		kfree(at_state->str_var[index]);
1613 		at_state->str_var[index] = ev->ptr;
1614 		ev->ptr = NULL; /* prevent process_events() from
1615 				   deallocating ptr */
1616 	}
1617 
1618 	if (ev->type == EV_TIMEOUT || ev->type == RSP_STRING)
1619 		at_state->getstring = 0;
1620 
1621 	/* Search row in dial array which matches modem response and current
1622 	   constate */
1623 	for (;; rep++) {
1624 		rcode = rep->resp_code;
1625 		if (rcode == RSP_LAST) {
1626 			/* found nothing...*/
1627 			dev_warn(cs->dev, "%s: rcode=RSP_LAST: "
1628 					"resp_code %d in ConState %d!\n",
1629 				 __func__, ev->type, at_state->ConState);
1630 			return;
1631 		}
1632 		if ((rcode == RSP_ANY || rcode == ev->type)
1633 		  && ((int) at_state->ConState >= rep->min_ConState)
1634 		  && (rep->max_ConState < 0
1635 		      || (int) at_state->ConState <= rep->max_ConState)
1636 		  && (rep->parameter < 0 || rep->parameter == ev->parameter))
1637 			break;
1638 	}
1639 
1640 	p_command = rep->command;
1641 
1642 	at_state->waiting = 0;
1643 	for (curact = 0; curact < MAXACT; ++curact) {
1644 		/* The row tells us what we should do  ..
1645 		 */
1646 		do_action(rep->action[curact], cs, bcs, &at_state, &p_command, &genresp, &resp_code, ev);
1647 		if (!at_state)
1648 			break; /* may be freed after disconnect */
1649 	}
1650 
1651 	if (at_state) {
1652 		/* Jump to the next con-state regarding the array */
1653 		if (rep->new_ConState >= 0)
1654 			at_state->ConState = rep->new_ConState;
1655 
1656 		if (genresp) {
1657 			spin_lock_irqsave(&cs->lock, flags);
1658 			at_state->timer_expires = 0; //FIXME
1659 			at_state->timer_active = 0; //FIXME
1660 			spin_unlock_irqrestore(&cs->lock, flags);
1661 			gigaset_add_event(cs, at_state, resp_code, NULL, 0, NULL);
1662 		} else {
1663 			/* Send command to modem if not NULL... */
1664 			if (p_command/*rep->command*/) {
1665 				if (cs->connected)
1666 					send_command(cs, p_command,
1667 						     sendcid, cs->dle,
1668 						     GFP_ATOMIC);
1669 				else
1670 					gigaset_add_event(cs, at_state,
1671 							  RSP_NODEV,
1672 							  NULL, 0, NULL);
1673 			}
1674 
1675 			spin_lock_irqsave(&cs->lock, flags);
1676 			if (!rep->timeout) {
1677 				at_state->timer_expires = 0;
1678 				at_state->timer_active = 0;
1679 			} else if (rep->timeout > 0) { /* new timeout */
1680 				at_state->timer_expires = rep->timeout * 10;
1681 				at_state->timer_active = 1;
1682 				++at_state->timer_index;
1683 			}
1684 			spin_unlock_irqrestore(&cs->lock, flags);
1685 		}
1686 	}
1687 }
1688 
schedule_sequence(struct cardstate * cs,struct at_state_t * at_state,int sequence)1689 static void schedule_sequence(struct cardstate *cs,
1690 			      struct at_state_t *at_state, int sequence)
1691 {
1692 	cs->cur_at_seq = sequence;
1693 	gigaset_add_event(cs, at_state, RSP_INIT, NULL, sequence, NULL);
1694 }
1695 
process_command_flags(struct cardstate * cs)1696 static void process_command_flags(struct cardstate *cs)
1697 {
1698 	struct at_state_t *at_state = NULL;
1699 	struct bc_state *bcs;
1700 	int i;
1701 	int sequence;
1702 	unsigned long flags;
1703 
1704 	cs->commands_pending = 0;
1705 
1706 	if (cs->cur_at_seq) {
1707 		gig_dbg(DEBUG_CMD, "not searching scheduled commands: busy");
1708 		return;
1709 	}
1710 
1711 	gig_dbg(DEBUG_CMD, "searching scheduled commands");
1712 
1713 	sequence = SEQ_NONE;
1714 
1715 	/* clear pending_commands and hangup channels on shutdown */
1716 	if (cs->at_state.pending_commands & PC_SHUTDOWN) {
1717 		cs->at_state.pending_commands &= ~PC_CIDMODE;
1718 		for (i = 0; i < cs->channels; ++i) {
1719 			bcs = cs->bcs + i;
1720 			at_state = &bcs->at_state;
1721 			at_state->pending_commands &=
1722 				~(PC_DLE1 | PC_ACCEPT | PC_DIAL);
1723 			if (at_state->cid > 0)
1724 				at_state->pending_commands |= PC_HUP;
1725 			if (at_state->pending_commands & PC_CID) {
1726 				at_state->pending_commands |= PC_NOCID;
1727 				at_state->pending_commands &= ~PC_CID;
1728 			}
1729 		}
1730 	}
1731 
1732 	/* clear pending_commands and hangup channels on reset */
1733 	if (cs->at_state.pending_commands & PC_INIT) {
1734 		cs->at_state.pending_commands &= ~PC_CIDMODE;
1735 		for (i = 0; i < cs->channels; ++i) {
1736 			bcs = cs->bcs + i;
1737 			at_state = &bcs->at_state;
1738 			at_state->pending_commands &=
1739 				~(PC_DLE1 | PC_ACCEPT | PC_DIAL);
1740 			if (at_state->cid > 0)
1741 				at_state->pending_commands |= PC_HUP;
1742 			if (cs->mstate == MS_RECOVER) {
1743 				if (at_state->pending_commands & PC_CID) {
1744 					at_state->pending_commands |= PC_NOCID;
1745 					at_state->pending_commands &= ~PC_CID;
1746 				}
1747 			}
1748 		}
1749 	}
1750 
1751 	/* only switch back to unimodem mode, if no commands are pending and no channels are up */
1752 	spin_lock_irqsave(&cs->lock, flags);
1753 	if (cs->at_state.pending_commands == PC_UMMODE
1754 	    && !cs->cidmode
1755 	    && list_empty(&cs->temp_at_states)
1756 	    && cs->mode == M_CID) {
1757 		sequence = SEQ_UMMODE;
1758 		at_state = &cs->at_state;
1759 		for (i = 0; i < cs->channels; ++i) {
1760 			bcs = cs->bcs + i;
1761 			if (bcs->at_state.pending_commands ||
1762 			    bcs->at_state.cid > 0) {
1763 				sequence = SEQ_NONE;
1764 				break;
1765 			}
1766 		}
1767 	}
1768 	spin_unlock_irqrestore(&cs->lock, flags);
1769 	cs->at_state.pending_commands &= ~PC_UMMODE;
1770 	if (sequence != SEQ_NONE) {
1771 		schedule_sequence(cs, at_state, sequence);
1772 		return;
1773 	}
1774 
1775 	for (i = 0; i < cs->channels; ++i) {
1776 		bcs = cs->bcs + i;
1777 		if (bcs->at_state.pending_commands & PC_HUP) {
1778 			bcs->at_state.pending_commands &= ~PC_HUP;
1779 			if (bcs->at_state.pending_commands & PC_CID) {
1780 				/* not yet dialing: PC_NOCID is sufficient */
1781 				bcs->at_state.pending_commands |= PC_NOCID;
1782 				bcs->at_state.pending_commands &= ~PC_CID;
1783 			} else {
1784 				schedule_sequence(cs, &bcs->at_state, SEQ_HUP);
1785 				return;
1786 			}
1787 		}
1788 		if (bcs->at_state.pending_commands & PC_NOCID) {
1789 			bcs->at_state.pending_commands &= ~PC_NOCID;
1790 			cs->curchannel = bcs->channel;
1791 			schedule_sequence(cs, &cs->at_state, SEQ_NOCID);
1792 			return;
1793 		} else if (bcs->at_state.pending_commands & PC_DLE0) {
1794 			bcs->at_state.pending_commands &= ~PC_DLE0;
1795 			cs->curchannel = bcs->channel;
1796 			schedule_sequence(cs, &cs->at_state, SEQ_DLE0);
1797 			return;
1798 		}
1799 	}
1800 
1801 	list_for_each_entry(at_state, &cs->temp_at_states, list)
1802 		if (at_state->pending_commands & PC_HUP) {
1803 			at_state->pending_commands &= ~PC_HUP;
1804 			schedule_sequence(cs, at_state, SEQ_HUP);
1805 			return;
1806 		}
1807 
1808 	if (cs->at_state.pending_commands & PC_INIT) {
1809 		cs->at_state.pending_commands &= ~PC_INIT;
1810 		cs->dle = 0; //FIXME
1811 		cs->inbuf->inputstate = INS_command;
1812 		//FIXME reset card state (or -> LOCK0)?
1813 		schedule_sequence(cs, &cs->at_state, SEQ_INIT);
1814 		return;
1815 	}
1816 	if (cs->at_state.pending_commands & PC_SHUTDOWN) {
1817 		cs->at_state.pending_commands &= ~PC_SHUTDOWN;
1818 		schedule_sequence(cs, &cs->at_state, SEQ_SHUTDOWN);
1819 		return;
1820 	}
1821 	if (cs->at_state.pending_commands & PC_CIDMODE) {
1822 		cs->at_state.pending_commands &= ~PC_CIDMODE;
1823 		if (cs->mode == M_UNIMODEM) {
1824 			cs->retry_count = 1;
1825 			schedule_sequence(cs, &cs->at_state, SEQ_CIDMODE);
1826 			return;
1827 		}
1828 	}
1829 
1830 	for (i = 0; i < cs->channels; ++i) {
1831 		bcs = cs->bcs + i;
1832 		if (bcs->at_state.pending_commands & PC_DLE1) {
1833 			bcs->at_state.pending_commands &= ~PC_DLE1;
1834 			cs->curchannel = bcs->channel;
1835 			schedule_sequence(cs, &cs->at_state, SEQ_DLE1);
1836 			return;
1837 		}
1838 		if (bcs->at_state.pending_commands & PC_ACCEPT) {
1839 			bcs->at_state.pending_commands &= ~PC_ACCEPT;
1840 			schedule_sequence(cs, &bcs->at_state, SEQ_ACCEPT);
1841 			return;
1842 		}
1843 		if (bcs->at_state.pending_commands & PC_DIAL) {
1844 			bcs->at_state.pending_commands &= ~PC_DIAL;
1845 			schedule_sequence(cs, &bcs->at_state, SEQ_DIAL);
1846 			return;
1847 		}
1848 		if (bcs->at_state.pending_commands & PC_CID) {
1849 			switch (cs->mode) {
1850 			case M_UNIMODEM:
1851 				cs->at_state.pending_commands |= PC_CIDMODE;
1852 				gig_dbg(DEBUG_CMD, "Scheduling PC_CIDMODE");
1853 				cs->commands_pending = 1;
1854 				return;
1855 #ifdef GIG_MAYINITONDIAL
1856 			case M_UNKNOWN:
1857 				schedule_init(cs, MS_INIT);
1858 				return;
1859 #endif
1860 			}
1861 			bcs->at_state.pending_commands &= ~PC_CID;
1862 			cs->curchannel = bcs->channel;
1863 #ifdef GIG_RETRYCID
1864 			cs->retry_count = 2;
1865 #else
1866 			cs->retry_count = 1;
1867 #endif
1868 			schedule_sequence(cs, &cs->at_state, SEQ_CID);
1869 			return;
1870 		}
1871 	}
1872 }
1873 
process_events(struct cardstate * cs)1874 static void process_events(struct cardstate *cs)
1875 {
1876 	struct event_t *ev;
1877 	unsigned head, tail;
1878 	int i;
1879 	int check_flags = 0;
1880 	int was_busy;
1881 	unsigned long flags;
1882 
1883 	spin_lock_irqsave(&cs->ev_lock, flags);
1884 	head = cs->ev_head;
1885 
1886 	for (i = 0; i < 2 * MAX_EVENTS; ++i) {
1887 		tail = cs->ev_tail;
1888 		if (tail == head) {
1889 			if (!check_flags && !cs->commands_pending)
1890 				break;
1891 			check_flags = 0;
1892 			spin_unlock_irqrestore(&cs->ev_lock, flags);
1893 			process_command_flags(cs);
1894 			spin_lock_irqsave(&cs->ev_lock, flags);
1895 			tail = cs->ev_tail;
1896 			if (tail == head) {
1897 				if (!cs->commands_pending)
1898 					break;
1899 				continue;
1900 			}
1901 		}
1902 
1903 		ev = cs->events + head;
1904 		was_busy = cs->cur_at_seq != SEQ_NONE;
1905 		spin_unlock_irqrestore(&cs->ev_lock, flags);
1906 		process_event(cs, ev);
1907 		spin_lock_irqsave(&cs->ev_lock, flags);
1908 		kfree(ev->ptr);
1909 		ev->ptr = NULL;
1910 		if (was_busy && cs->cur_at_seq == SEQ_NONE)
1911 			check_flags = 1;
1912 
1913 		head = (head + 1) % MAX_EVENTS;
1914 		cs->ev_head = head;
1915 	}
1916 
1917 	spin_unlock_irqrestore(&cs->ev_lock, flags);
1918 
1919 	if (i == 2 * MAX_EVENTS) {
1920 		dev_err(cs->dev,
1921 			"infinite loop in process_events; aborting.\n");
1922 	}
1923 }
1924 
1925 /* tasklet scheduled on any event received from the Gigaset device
1926  * parameter:
1927  *	data	ISDN controller state structure
1928  */
gigaset_handle_event(unsigned long data)1929 void gigaset_handle_event(unsigned long data)
1930 {
1931 	struct cardstate *cs = (struct cardstate *) data;
1932 
1933 	/* handle incoming data on control/common channel */
1934 	if (cs->inbuf->head != cs->inbuf->tail) {
1935 		gig_dbg(DEBUG_INTR, "processing new data");
1936 		cs->ops->handle_input(cs->inbuf);
1937 	}
1938 
1939 	process_events(cs);
1940 }
1941