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 */ 150struct 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 */ 259struct 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 353static const struct resp_type_t { 354 char *response; 355 int resp_code; 356 int type; 357} 358resp_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 377static const struct zsau_resp_t { 378 char *str; 379 int code; 380} 381zsau_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 */ 396static 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 */ 407static 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 */ 445void 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, ¶meter)) 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 618bad_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} 630EXPORT_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 */ 636static 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 */ 665static 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 */ 697static 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 725static 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 744static 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 */ 761static 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 788static 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 814static 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 831static 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 843static 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 871error: 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 882static 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 912static 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 926static 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 946static 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 959static 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 */ 978static 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 1001static 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; 1023exit: 1024 spin_unlock_irqrestore(&cs->lock, flags); 1025 return retval; 1026} 1027 1028static 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 1052static 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 1085static 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 1099static 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 */ 1528static 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 1663static 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 1670static 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 1847static 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 */ 1902void 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