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