diff options
author | Eric Wild <ewild@sysmocom.de> | 2020-03-30 04:10:31 +0200 |
---|---|---|
committer | laforge <laforge@osmocom.org> | 2020-07-31 21:28:07 +0000 |
commit | 91f75ce2802537770ce771e1f7b734f08501f2ce (patch) | |
tree | da9bf9227efacdf17807a5b03601f68987a4494d | |
parent | bf21f24a5bfd7b7ac125e273af5d53f26eccea28 (diff) |
ccid: handle timeouts
Empty trays caused a hang, because the timeout was not handled. This
fixes this, and allows manual voltage selection by attempting slot
powerup with different voltages after timeout until it succeeds.
Change-Id: I4dfc8d6d0e25008765615d3c4149a75efc0ef44d
-rw-r--r-- | ccid_common/ccid_slot_fsm.c | 20 |
1 files changed, 18 insertions, 2 deletions
diff --git a/ccid_common/ccid_slot_fsm.c b/ccid_common/ccid_slot_fsm.c index 4bd1b0d..8b8fdd2 100644 --- a/ccid_common/ccid_slot_fsm.c +++ b/ccid_common/ccid_slot_fsm.c @@ -122,6 +122,7 @@ static void iso_fsm_clot_user_cb(struct osmo_fsm_inst *fi, int event, int cause, case ISO7816_E_TPDU_FAILED_IND: case ISO7816_E_PPS_DONE_IND: case ISO7816_E_PPS_FAILED_IND: + case ISO7816_E_WTIME_EXP: cs->event_data = data; #ifdef OCTSIMFWBUILD asm volatile("dmb st": : :"memory"); @@ -143,10 +144,25 @@ static int iso_handle_fsm_events(struct ccid_slot *cs, bool enable){ if(!event) return 0; - if(event && !data) - return 0; +// if(event && !data) +// return 0; switch (event) { + case ISO7816_E_WTIME_EXP: + tpdu = data; + LOGPCS(cs, LOGL_DEBUG, "%s(event=%d, data=0)\n", __func__, event); + + + /* perform deactivation */ + card_uart_ctrl(ss->cuart, CUART_CTL_RST, true); + card_uart_ctrl(ss->cuart, CUART_CTL_POWER, false); + cs->icc_powered = false; + + + resp = ccid_gen_data_block(cs, ss->seq, CCID_CMD_STATUS_FAILED, CCID_ERR_ICC_MUTE, 0, 0); + ccid_slot_send_unbusy(cs, resp); + cs->event = 0; + break; case ISO7816_E_ATR_DONE_IND: tpdu = data; LOGPCS(cs, LOGL_DEBUG, "%s(event=%d, data=%s)\n", __func__, event, |