Lines Matching refs:cs
407 static void add_cid_event(struct cardstate *cs, int cid, int type, in add_cid_event() argument
416 spin_lock_irqsave(&cs->ev_lock, flags); in add_cid_event()
418 tail = cs->ev_tail; in add_cid_event()
420 if (unlikely(next == cs->ev_head)) { in add_cid_event()
421 dev_err(cs->dev, "event queue full\n"); in add_cid_event()
424 event = cs->events + tail; in add_cid_event()
431 cs->ev_tail = next; in add_cid_event()
434 spin_unlock_irqrestore(&cs->ev_lock, flags); in add_cid_event()
445 void gigaset_handle_modem_response(struct cardstate *cs) in gigaset_handle_modem_response() argument
453 if (!cs->cbytes) { in gigaset_handle_modem_response()
455 gig_dbg(DEBUG_MCMD, "skipped EOL [%02X]", cs->respdata[0]); in gigaset_handle_modem_response()
458 cs->respdata[cs->cbytes] = 0; in gigaset_handle_modem_response()
460 if (cs->at_state.getstring) { in gigaset_handle_modem_response()
462 cs->at_state.getstring = 0; in gigaset_handle_modem_response()
463 ptr = kstrdup(cs->respdata, GFP_ATOMIC); in gigaset_handle_modem_response()
465 add_cid_event(cs, 0, RSP_STRING, ptr, 0); in gigaset_handle_modem_response()
471 eoc = skip_prefix(cs->respdata, rt->response); in gigaset_handle_modem_response()
476 add_cid_event(cs, 0, RSP_NONE, NULL, 0); in gigaset_handle_modem_response()
478 cs->respdata); in gigaset_handle_modem_response()
483 psep = strrchr(cs->respdata, ';'); in gigaset_handle_modem_response()
494 gig_dbg(DEBUG_EVENT, "CMD received: %s", cs->respdata); in gigaset_handle_modem_response()
504 add_cid_event(cs, cid, rt->resp_code, NULL, 0); in gigaset_handle_modem_response()
514 add_cid_event(cs, 0, rt->resp_code, NULL, cid); in gigaset_handle_modem_response()
528 dev_warn(cs->dev, in gigaset_handle_modem_response()
547 add_cid_event(cs, cid, rt->resp_code, ptr, 0); in gigaset_handle_modem_response()
555 add_cid_event(cs, cid, rt->resp_code, NULL, ZSAU_NONE); in gigaset_handle_modem_response()
568 add_cid_event(cs, cid, rt->resp_code, NULL, zr->code); in gigaset_handle_modem_response()
580 add_cid_event(cs, cid, rt->resp_code, ptr, 0); in gigaset_handle_modem_response()
599 add_cid_event(cs, cid, rt->resp_code, NULL, parameter); in gigaset_handle_modem_response()
613 cs->dle = parameter; in gigaset_handle_modem_response()
615 add_cid_event(cs, cid, rt->resp_code, NULL, parameter); in gigaset_handle_modem_response()
620 dev_warn(cs->dev, "bad parameter in response '%s'\n", in gigaset_handle_modem_response()
621 cs->respdata); in gigaset_handle_modem_response()
622 add_cid_event(cs, cid, rt->resp_code, NULL, -1); in gigaset_handle_modem_response()
626 dev_err(cs->dev, "%s: internal error on '%s'\n", in gigaset_handle_modem_response()
627 __func__, cs->respdata); in gigaset_handle_modem_response()
637 struct cardstate *cs) in disconnect_nobc() argument
641 spin_lock_irqsave(&cs->lock, flags); in disconnect_nobc()
645 if (!cs->cidmode) { in disconnect_nobc()
646 cs->at_state.pending_commands |= PC_UMMODE; in disconnect_nobc()
648 cs->commands_pending = 1; in disconnect_nobc()
658 spin_unlock_irqrestore(&cs->lock, flags); in disconnect_nobc()
666 struct cardstate *cs, struct bc_state *bcs) in disconnect_bc() argument
670 spin_lock_irqsave(&cs->lock, flags); in disconnect_bc()
674 if (!cs->cidmode) { in disconnect_bc()
675 cs->at_state.pending_commands |= PC_UMMODE; in disconnect_bc()
677 cs->commands_pending = 1; in disconnect_bc()
679 spin_unlock_irqrestore(&cs->lock, flags); in disconnect_bc()
682 cs->ops->close_bchannel(bcs); in disconnect_bc()
697 static inline struct at_state_t *get_free_channel(struct cardstate *cs, in get_free_channel() argument
708 for (i = 0; i < cs->channels; ++i) in get_free_channel()
709 if (gigaset_get_channel(cs->bcs + i) >= 0) { in get_free_channel()
710 ret = &cs->bcs[i].at_state; in get_free_channel()
715 spin_lock_irqsave(&cs->lock, flags); in get_free_channel()
718 gigaset_at_init(ret, NULL, cs, cid); in get_free_channel()
719 list_add(&ret->list, &cs->temp_at_states); in get_free_channel()
721 spin_unlock_irqrestore(&cs->lock, flags); in get_free_channel()
725 static void init_failed(struct cardstate *cs, int mode) in init_failed() argument
730 cs->at_state.pending_commands &= ~PC_INIT; in init_failed()
731 cs->mode = mode; in init_failed()
732 cs->mstate = MS_UNINITIALIZED; in init_failed()
733 gigaset_free_channels(cs); in init_failed()
734 for (i = 0; i < cs->channels; ++i) { in init_failed()
735 at_state = &cs->bcs[i].at_state; in init_failed()
739 cs->commands_pending = 1; in init_failed()
744 static void schedule_init(struct cardstate *cs, int state) in schedule_init() argument
746 if (cs->at_state.pending_commands & PC_INIT) { in schedule_init()
750 cs->mstate = state; in schedule_init()
751 cs->mode = M_UNKNOWN; in schedule_init()
752 gigaset_block_channels(cs); in schedule_init()
753 cs->at_state.pending_commands |= PC_INIT; in schedule_init()
755 cs->commands_pending = 1; in schedule_init()
761 static void send_command(struct cardstate *cs, const char *cmd, in send_command() argument
771 dev_err(cs->dev, "%s: out of memory\n", __func__); in send_command()
776 cs->dle ? "\020(AT%d%s\020)" : "AT%d%s", in send_command()
780 cs->dle ? "\020(AT%s\020)" : "AT%s", in send_command()
785 cs->ops->write_cmd(cs, cb); in send_command()
788 static struct at_state_t *at_state_from_cid(struct cardstate *cs, int cid) in at_state_from_cid() argument
795 return &cs->at_state; in at_state_from_cid()
797 for (i = 0; i < cs->channels; ++i) in at_state_from_cid()
798 if (cid == cs->bcs[i].at_state.cid) in at_state_from_cid()
799 return &cs->bcs[i].at_state; in at_state_from_cid()
801 spin_lock_irqsave(&cs->lock, flags); in at_state_from_cid()
803 list_for_each_entry(at_state, &cs->temp_at_states, list) in at_state_from_cid()
805 spin_unlock_irqrestore(&cs->lock, flags); in at_state_from_cid()
809 spin_unlock_irqrestore(&cs->lock, flags); in at_state_from_cid()
834 dev_notice(bcs->cs->dev, "%s: B channel already up\n", in bchannel_up()
847 struct cardstate *cs = at_state->cs; in start_dial() local
854 spin_lock_irqsave(&cs->lock, flags); in start_dial()
856 spin_unlock_irqrestore(&cs->lock, flags); in start_dial()
859 spin_unlock_irqrestore(&cs->lock, flags); in start_dial()
868 cs->commands_pending = 1; in start_dial()
878 cs->commands_pending = 1; in start_dial()
884 struct cardstate *cs = at_state->cs; in start_accept() local
896 dev_err(at_state->cs->dev, "out of memory\n"); in start_accept()
900 cs->commands_pending = 1; in start_accept()
909 cs->commands_pending = 1; in start_accept()
912 static void do_start(struct cardstate *cs) in do_start() argument
914 gigaset_free_channels(cs); in do_start()
916 if (cs->mstate != MS_LOCKED) in do_start()
917 schedule_init(cs, MS_INIT); in do_start()
919 cs->isdn_up = 1; in do_start()
920 gigaset_isdn_start(cs); in do_start()
922 cs->waiting = 0; in do_start()
923 wake_up(&cs->waitqueue); in do_start()
926 static void finish_shutdown(struct cardstate *cs) in finish_shutdown() argument
928 if (cs->mstate != MS_LOCKED) { in finish_shutdown()
929 cs->mstate = MS_UNINITIALIZED; in finish_shutdown()
930 cs->mode = M_UNKNOWN; in finish_shutdown()
934 if (cs->isdn_up) { in finish_shutdown()
935 cs->isdn_up = 0; in finish_shutdown()
936 gigaset_isdn_stop(cs); in finish_shutdown()
941 cs->cmd_result = -ENODEV; in finish_shutdown()
942 cs->waiting = 0; in finish_shutdown()
943 wake_up(&cs->waitqueue); in finish_shutdown()
946 static void do_shutdown(struct cardstate *cs) in do_shutdown() argument
948 gigaset_block_channels(cs); in do_shutdown()
950 if (cs->mstate == MS_READY) { in do_shutdown()
951 cs->mstate = MS_SHUTDOWN; in do_shutdown()
952 cs->at_state.pending_commands |= PC_SHUTDOWN; in do_shutdown()
954 cs->commands_pending = 1; in do_shutdown()
956 finish_shutdown(cs); in do_shutdown()
959 static void do_stop(struct cardstate *cs) in do_stop() argument
963 spin_lock_irqsave(&cs->lock, flags); in do_stop()
964 cs->connected = 0; in do_stop()
965 spin_unlock_irqrestore(&cs->lock, flags); in do_stop()
967 do_shutdown(cs); in do_stop()
978 static int reinit_and_retry(struct cardstate *cs, int channel) in reinit_and_retry() argument
982 if (--cs->retry_count <= 0) in reinit_and_retry()
985 for (i = 0; i < cs->channels; ++i) in reinit_and_retry()
986 if (cs->bcs[i].at_state.cid > 0) in reinit_and_retry()
990 dev_warn(cs->dev, in reinit_and_retry()
993 dev_warn(cs->dev, in reinit_and_retry()
995 cs->bcs[channel].at_state.pending_commands |= PC_CID; in reinit_and_retry()
997 schedule_init(cs, MS_INIT); in reinit_and_retry()
1001 static int at_state_invalid(struct cardstate *cs, in at_state_invalid() argument
1009 spin_lock_irqsave(&cs->lock, flags); in at_state_invalid()
1011 if (test_ptr == &cs->at_state) in at_state_invalid()
1014 list_for_each_entry(at_state, &cs->temp_at_states, list) in at_state_invalid()
1018 for (channel = 0; channel < cs->channels; ++channel) in at_state_invalid()
1019 if (&cs->bcs[channel].at_state == test_ptr) in at_state_invalid()
1024 spin_unlock_irqrestore(&cs->lock, flags); in at_state_invalid()
1028 static void handle_icall(struct cardstate *cs, struct bc_state *bcs, in handle_icall() argument
1038 dev_err(cs->dev, "internal error: disposition=%d\n", retval); in handle_icall()
1047 cs->commands_pending = 1; in handle_icall()
1052 static int do_lock(struct cardstate *cs) in do_lock() argument
1057 switch (cs->mstate) { in do_lock()
1060 if (cs->cur_at_seq || !list_empty(&cs->temp_at_states) || in do_lock()
1061 cs->at_state.pending_commands) in do_lock()
1064 for (i = 0; i < cs->channels; ++i) in do_lock()
1065 if (cs->bcs[i].at_state.pending_commands) in do_lock()
1068 if (gigaset_get_channels(cs) < 0) in do_lock()
1078 mode = cs->mode; in do_lock()
1079 cs->mstate = MS_LOCKED; in do_lock()
1080 cs->mode = M_UNKNOWN; in do_lock()
1085 static int do_unlock(struct cardstate *cs) in do_unlock() argument
1087 if (cs->mstate != MS_LOCKED) in do_unlock()
1090 cs->mstate = MS_UNINITIALIZED; in do_unlock()
1091 cs->mode = M_UNKNOWN; in do_unlock()
1092 gigaset_free_channels(cs); in do_unlock()
1093 if (cs->connected) in do_unlock()
1094 schedule_init(cs, MS_INIT); in do_unlock()
1099 static void do_action(int action, struct cardstate *cs, in do_action() argument
1122 cs->at_state.pending_commands &= ~PC_INIT; in do_action()
1123 cs->cur_at_seq = SEQ_NONE; in do_action()
1124 cs->mode = M_UNIMODEM; in do_action()
1125 spin_lock_irqsave(&cs->lock, flags); in do_action()
1126 if (!cs->cidmode) { in do_action()
1127 spin_unlock_irqrestore(&cs->lock, flags); in do_action()
1128 gigaset_free_channels(cs); in do_action()
1129 cs->mstate = MS_READY; in do_action()
1132 spin_unlock_irqrestore(&cs->lock, flags); in do_action()
1133 cs->at_state.pending_commands |= PC_CIDMODE; in do_action()
1135 cs->commands_pending = 1; in do_action()
1138 dev_warn(cs->dev, "Could not initialize the device.\n"); in do_action()
1139 cs->dle = 0; in do_action()
1140 init_failed(cs, M_UNKNOWN); in do_action()
1141 cs->cur_at_seq = SEQ_NONE; in do_action()
1144 init_failed(cs, M_CONFIG); in do_action()
1145 cs->cur_at_seq = SEQ_NONE; in do_action()
1148 cs->dle = 1; in do_action()
1150 cs->inbuf[0].inputstate &= in do_action()
1154 cs->dle = 0; in do_action()
1155 cs->inbuf[0].inputstate = in do_action()
1156 (cs->inbuf[0].inputstate & ~INS_DLE_command) in do_action()
1160 if (cs->mstate == MS_INIT || cs->mstate == MS_RECOVER) { in do_action()
1161 gigaset_free_channels(cs); in do_action()
1162 cs->mstate = MS_READY; in do_action()
1164 cs->mode = M_CID; in do_action()
1165 cs->cur_at_seq = SEQ_NONE; in do_action()
1168 cs->mode = M_UNIMODEM; in do_action()
1169 cs->cur_at_seq = SEQ_NONE; in do_action()
1172 cs->cur_at_seq = SEQ_NONE; in do_action()
1173 if (cs->mstate == MS_INIT || cs->mstate == MS_RECOVER) { in do_action()
1174 init_failed(cs, M_UNKNOWN); in do_action()
1177 if (reinit_and_retry(cs, -1) < 0) in do_action()
1178 schedule_init(cs, MS_RECOVER); in do_action()
1181 cs->cur_at_seq = SEQ_NONE; in do_action()
1182 schedule_init(cs, MS_RECOVER); in do_action()
1186 if (cs->connected) { in do_action()
1191 dev_err(cs->dev, "%s: out of memory\n", in do_action()
1200 cs->ops->write_cmd(cs, cb); in do_action()
1205 at_state = get_free_channel(cs, ev->parameter); in do_action()
1207 dev_warn(cs->dev, in do_action()
1222 spin_lock_irqsave(&cs->lock, flags); in do_action()
1225 spin_unlock_irqrestore(&cs->lock, flags); in do_action()
1228 handle_icall(cs, bcs, at_state); in do_action()
1231 dev_warn(cs->dev, "Could not shut down the device.\n"); in do_action()
1235 cs->cur_at_seq = SEQ_NONE; in do_action()
1236 finish_shutdown(cs); in do_action()
1239 if (cs->onechannel) { in do_action()
1241 cs->commands_pending = 1; in do_action()
1246 cs->ops->init_bchannel(bcs); in do_action()
1249 cs->cur_at_seq = SEQ_NONE; in do_action()
1250 bcs = cs->bcs + cs->curchannel; in do_action()
1254 cs->ops->init_bchannel(bcs); in do_action()
1260 cs->cur_at_seq = SEQ_NONE; in do_action()
1263 disconnect_nobc(p_at_state, cs); in do_action()
1264 } else if (cs->onechannel && cs->dle) { in do_action()
1269 cs->commands_pending = 1; in do_action()
1271 disconnect_bc(at_state, cs, bcs); in do_action()
1276 cs->dle = 0; in do_action()
1279 cs->cur_at_seq = SEQ_NONE; in do_action()
1280 bcs2 = cs->bcs + cs->curchannel; in do_action()
1281 disconnect_bc(&bcs2->at_state, cs, bcs2); in do_action()
1284 cs->cur_at_seq = SEQ_NONE; in do_action()
1285 dev_warn(cs->dev, "Could not hang up.\n"); in do_action()
1288 disconnect_nobc(p_at_state, cs); in do_action()
1289 else if (cs->onechannel) in do_action()
1292 disconnect_bc(at_state, cs, bcs); in do_action()
1293 schedule_init(cs, MS_RECOVER); in do_action()
1296 cs->cur_at_seq = SEQ_NONE; in do_action()
1297 dev_warn(cs->dev, "Error leaving DLE mode.\n"); in do_action()
1298 cs->dle = 0; in do_action()
1299 bcs2 = cs->bcs + cs->curchannel; in do_action()
1300 disconnect_bc(&bcs2->at_state, cs, bcs2); in do_action()
1301 schedule_init(cs, MS_RECOVER); in do_action()
1304 cs->cur_at_seq = SEQ_NONE; in do_action()
1305 dev_warn(cs->dev, in do_action()
1307 channel = cs->curchannel; in do_action()
1308 cs->bcs[channel].at_state.pending_commands |= PC_HUP; in do_action()
1309 cs->commands_pending = 1; in do_action()
1313 cs->cur_at_seq = SEQ_NONE; in do_action()
1314 channel = cs->curchannel; in do_action()
1316 cs->bcs[channel].at_state.cid = ev->parameter; in do_action()
1317 cs->bcs[channel].at_state.pending_commands |= in do_action()
1319 cs->commands_pending = 1; in do_action()
1324 cs->cur_at_seq = SEQ_NONE; in do_action()
1325 channel = cs->curchannel; in do_action()
1326 if (reinit_and_retry(cs, channel) < 0) { in do_action()
1327 dev_warn(cs->dev, in do_action()
1329 bcs2 = cs->bcs + channel; in do_action()
1330 disconnect_bc(&bcs2->at_state, cs, bcs2); in do_action()
1334 cs->cur_at_seq = SEQ_NONE; in do_action()
1335 bcs2 = cs->bcs + cs->curchannel; in do_action()
1336 disconnect_bc(&bcs2->at_state, cs, bcs2); in do_action()
1341 cs->cur_at_seq = SEQ_NONE; in do_action()
1346 disconnect_bc(at_state, cs, bcs); in do_action()
1348 disconnect_nobc(p_at_state, cs); in do_action()
1352 cs->cur_at_seq = SEQ_NONE; in do_action()
1354 cs->commands_pending = 1; in do_action()
1361 cs->commands_pending = 1; in do_action()
1393 cs->fwver[i] = val; in do_action()
1400 cs->gotfwver = 0; in do_action()
1403 if (cs->gotfwver == 0) { in do_action()
1404 cs->gotfwver = 1; in do_action()
1407 cs->fwver[0], cs->fwver[1], in do_action()
1408 cs->fwver[2], cs->fwver[3]); in do_action()
1413 cs->gotfwver = -1; in do_action()
1414 dev_err(cs->dev, "could not read firmware version.\n"); in do_action()
1419 cs->cur_at_seq = SEQ_NONE; in do_action()
1426 dev_warn(cs->dev, "%s: resp_code %d in ConState %d!\n", in do_action()
1430 dev_warn(cs->dev, "cause code %04x in connection state %d.\n", in do_action()
1450 cs->commands_pending = 1; in do_action()
1456 do_stop(cs); in do_action()
1459 do_start(cs); in do_action()
1465 cs->cmd_result = ev->parameter ? do_lock(cs) : do_unlock(cs); in do_action()
1466 cs->waiting = 0; in do_action()
1467 wake_up(&cs->waitqueue); in do_action()
1471 cs->cmd_result = -EINVAL; in do_action()
1472 else if (cs->gotfwver != 1) { in do_action()
1473 cs->cmd_result = -ENOENT; in do_action()
1475 memcpy(ev->arg, cs->fwver, sizeof cs->fwver); in do_action()
1476 cs->cmd_result = 0; in do_action()
1478 cs->waiting = 0; in do_action()
1479 wake_up(&cs->waitqueue); in do_action()
1485 spin_lock_irqsave(&cs->lock, flags); in do_action()
1486 if (ev->parameter != cs->cidmode) { in do_action()
1487 cs->cidmode = ev->parameter; in do_action()
1489 cs->at_state.pending_commands |= PC_CIDMODE; in do_action()
1492 cs->at_state.pending_commands |= PC_UMMODE; in do_action()
1495 cs->commands_pending = 1; in do_action()
1497 spin_unlock_irqrestore(&cs->lock, flags); in do_action()
1498 cs->waiting = 0; in do_action()
1499 wake_up(&cs->waitqueue); in do_action()
1511 do_shutdown(cs); in do_action()
1523 dev_err(cs->dev, "%s: action==%d!\n", __func__, action); in do_action()
1528 static void process_event(struct cardstate *cs, struct event_t *ev) in process_event() argument
1542 at_state = at_state_from_cid(cs, ev->cid); in process_event()
1546 gigaset_add_event(cs, &cs->at_state, RSP_WRONG_CID, in process_event()
1552 if (at_state_invalid(cs, at_state)) { in process_event()
1567 spin_lock_irqsave(&cs->lock, flags); in process_event()
1580 spin_unlock_irqrestore(&cs->lock, flags); in process_event()
1604 dev_warn(cs->dev, "%s: rcode=RSP_LAST: " in process_event()
1623 do_action(rep->action[curact], cs, bcs, &at_state, &p_command, in process_event()
1635 spin_lock_irqsave(&cs->lock, flags); in process_event()
1638 spin_unlock_irqrestore(&cs->lock, flags); in process_event()
1639 gigaset_add_event(cs, at_state, resp_code, NULL, 0, NULL); in process_event()
1643 if (cs->connected) in process_event()
1644 send_command(cs, p_command, at_state); in process_event()
1646 gigaset_add_event(cs, at_state, RSP_NODEV, in process_event()
1650 spin_lock_irqsave(&cs->lock, flags); in process_event()
1659 spin_unlock_irqrestore(&cs->lock, flags); in process_event()
1663 static void schedule_sequence(struct cardstate *cs, in schedule_sequence() argument
1666 cs->cur_at_seq = sequence; in schedule_sequence()
1667 gigaset_add_event(cs, at_state, RSP_INIT, NULL, sequence, NULL); in schedule_sequence()
1670 static void process_command_flags(struct cardstate *cs) in process_command_flags() argument
1678 cs->commands_pending = 0; in process_command_flags()
1680 if (cs->cur_at_seq) { in process_command_flags()
1690 if (cs->at_state.pending_commands & PC_SHUTDOWN) { in process_command_flags()
1691 cs->at_state.pending_commands &= ~PC_CIDMODE; in process_command_flags()
1692 for (i = 0; i < cs->channels; ++i) { in process_command_flags()
1693 bcs = cs->bcs + i; in process_command_flags()
1707 if (cs->at_state.pending_commands & PC_INIT) { in process_command_flags()
1708 cs->at_state.pending_commands &= ~PC_CIDMODE; in process_command_flags()
1709 for (i = 0; i < cs->channels; ++i) { in process_command_flags()
1710 bcs = cs->bcs + i; in process_command_flags()
1716 if (cs->mstate == MS_RECOVER) { in process_command_flags()
1727 spin_lock_irqsave(&cs->lock, flags); in process_command_flags()
1728 if (cs->at_state.pending_commands == PC_UMMODE in process_command_flags()
1729 && !cs->cidmode in process_command_flags()
1730 && list_empty(&cs->temp_at_states) in process_command_flags()
1731 && cs->mode == M_CID) { in process_command_flags()
1733 at_state = &cs->at_state; in process_command_flags()
1734 for (i = 0; i < cs->channels; ++i) { in process_command_flags()
1735 bcs = cs->bcs + i; in process_command_flags()
1743 spin_unlock_irqrestore(&cs->lock, flags); in process_command_flags()
1744 cs->at_state.pending_commands &= ~PC_UMMODE; in process_command_flags()
1746 schedule_sequence(cs, at_state, sequence); in process_command_flags()
1750 for (i = 0; i < cs->channels; ++i) { in process_command_flags()
1751 bcs = cs->bcs + i; in process_command_flags()
1753 if (cs->dle) { in process_command_flags()
1754 cs->curchannel = bcs->channel; in process_command_flags()
1755 schedule_sequence(cs, &cs->at_state, SEQ_DLE0); in process_command_flags()
1764 schedule_sequence(cs, &bcs->at_state, SEQ_HUP); in process_command_flags()
1770 cs->curchannel = bcs->channel; in process_command_flags()
1771 schedule_sequence(cs, &cs->at_state, SEQ_NOCID); in process_command_flags()
1775 cs->curchannel = bcs->channel; in process_command_flags()
1776 schedule_sequence(cs, &cs->at_state, SEQ_DLE0); in process_command_flags()
1781 list_for_each_entry(at_state, &cs->temp_at_states, list) in process_command_flags()
1784 schedule_sequence(cs, at_state, SEQ_HUP); in process_command_flags()
1788 if (cs->at_state.pending_commands & PC_INIT) { in process_command_flags()
1789 cs->at_state.pending_commands &= ~PC_INIT; in process_command_flags()
1790 cs->dle = 0; in process_command_flags()
1791 cs->inbuf->inputstate = INS_command; in process_command_flags()
1792 schedule_sequence(cs, &cs->at_state, SEQ_INIT); in process_command_flags()
1795 if (cs->at_state.pending_commands & PC_SHUTDOWN) { in process_command_flags()
1796 cs->at_state.pending_commands &= ~PC_SHUTDOWN; in process_command_flags()
1797 schedule_sequence(cs, &cs->at_state, SEQ_SHUTDOWN); in process_command_flags()
1800 if (cs->at_state.pending_commands & PC_CIDMODE) { in process_command_flags()
1801 cs->at_state.pending_commands &= ~PC_CIDMODE; in process_command_flags()
1802 if (cs->mode == M_UNIMODEM) { in process_command_flags()
1803 cs->retry_count = 1; in process_command_flags()
1804 schedule_sequence(cs, &cs->at_state, SEQ_CIDMODE); in process_command_flags()
1809 for (i = 0; i < cs->channels; ++i) { in process_command_flags()
1810 bcs = cs->bcs + i; in process_command_flags()
1813 cs->curchannel = bcs->channel; in process_command_flags()
1814 schedule_sequence(cs, &cs->at_state, SEQ_DLE1); in process_command_flags()
1819 schedule_sequence(cs, &bcs->at_state, SEQ_ACCEPT); in process_command_flags()
1824 schedule_sequence(cs, &bcs->at_state, SEQ_DIAL); in process_command_flags()
1828 switch (cs->mode) { in process_command_flags()
1830 cs->at_state.pending_commands |= PC_CIDMODE; in process_command_flags()
1832 cs->commands_pending = 1; in process_command_flags()
1835 schedule_init(cs, MS_INIT); in process_command_flags()
1839 cs->curchannel = bcs->channel; in process_command_flags()
1840 cs->retry_count = 2; in process_command_flags()
1841 schedule_sequence(cs, &cs->at_state, SEQ_CID); in process_command_flags()
1847 static void process_events(struct cardstate *cs) in process_events() argument
1856 spin_lock_irqsave(&cs->ev_lock, flags); in process_events()
1857 head = cs->ev_head; in process_events()
1860 tail = cs->ev_tail; in process_events()
1862 if (!check_flags && !cs->commands_pending) in process_events()
1865 spin_unlock_irqrestore(&cs->ev_lock, flags); in process_events()
1866 process_command_flags(cs); in process_events()
1867 spin_lock_irqsave(&cs->ev_lock, flags); in process_events()
1868 tail = cs->ev_tail; in process_events()
1870 if (!cs->commands_pending) in process_events()
1876 ev = cs->events + head; in process_events()
1877 was_busy = cs->cur_at_seq != SEQ_NONE; in process_events()
1878 spin_unlock_irqrestore(&cs->ev_lock, flags); in process_events()
1879 process_event(cs, ev); in process_events()
1880 spin_lock_irqsave(&cs->ev_lock, flags); in process_events()
1883 if (was_busy && cs->cur_at_seq == SEQ_NONE) in process_events()
1887 cs->ev_head = head; in process_events()
1890 spin_unlock_irqrestore(&cs->ev_lock, flags); in process_events()
1893 dev_err(cs->dev, in process_events()
1904 struct cardstate *cs = (struct cardstate *) data; in gigaset_handle_event() local
1907 if (cs->inbuf->head != cs->inbuf->tail) { in gigaset_handle_event()
1909 cs->ops->handle_input(cs->inbuf); in gigaset_handle_event()
1912 process_events(cs); in gigaset_handle_event()