ccid: support warm reset
Change-Id: I4b0a119afcb37edb1d30badc85834165883a12b5
diff --git a/ccid_common/ccid_slot_fsm.c b/ccid_common/ccid_slot_fsm.c
index 8b8fdd2..a00375e 100644
--- a/ccid_common/ccid_slot_fsm.c
+++ b/ccid_common/ccid_slot_fsm.c
@@ -91,22 +91,33 @@
ss->seq = ipo->hdr.bSeq;
LOGPCS(cs, LOGL_DEBUG, "scheduling power-up\n");
- /* FIXME: do this via a FSM? */
- card_uart_ctrl(ss->cuart, CUART_CTL_RST, true);
- osmo_fsm_inst_dispatch(ss->fi, ISO7816_E_RESET_ACT_IND, NULL);
- card_uart_ctrl(ss->cuart, CUART_CTL_POWER, true);
- osmo_fsm_inst_dispatch(ss->fi, ISO7816_E_POWER_UP_IND, NULL);
- cs->icc_powered = true;
- card_uart_ctrl(ss->cuart, CUART_CTL_CLOCK, true);
-#ifdef OCTSIMFWBUILD
- delay_us(10000);
-#else
- usleep(10000);
-#endif
+ if (! cs->icc_powered) {
+ /* FIXME: do this via a FSM? */
+ card_uart_ctrl(ss->cuart, CUART_CTL_RST, true);
+ osmo_fsm_inst_dispatch(ss->fi, ISO7816_E_RESET_ACT_IND, NULL);
+ card_uart_ctrl(ss->cuart, CUART_CTL_POWER, true);
+ osmo_fsm_inst_dispatch(ss->fi, ISO7816_E_POWER_UP_IND, NULL);
+ cs->icc_powered = true;
+ card_uart_ctrl(ss->cuart, CUART_CTL_CLOCK, true);
+ #ifdef OCTSIMFWBUILD
+ delay_us(10000);
+ #else
+ usleep(10000);
+ #endif
- osmo_fsm_inst_dispatch(ss->fi, ISO7816_E_RESET_REL_IND, NULL);
- card_uart_ctrl(ss->cuart, CUART_CTL_RST, false);
-
+ osmo_fsm_inst_dispatch(ss->fi, ISO7816_E_RESET_REL_IND, NULL);
+ card_uart_ctrl(ss->cuart, CUART_CTL_RST, false);
+ } else { /* warm reset */
+ card_uart_ctrl(ss->cuart, CUART_CTL_RST, true);
+ osmo_fsm_inst_dispatch(ss->fi, ISO7816_E_RESET_ACT_IND, NULL);
+ #ifdef OCTSIMFWBUILD
+ delay_us(10000);
+ #else
+ usleep(10000);
+ #endif
+ osmo_fsm_inst_dispatch(ss->fi, ISO7816_E_RESET_REL_IND, NULL);
+ card_uart_ctrl(ss->cuart, CUART_CTL_RST, false);
+ }
msgb_free(msg);
/* continues in iso_fsm_clot_user_cb once ATR is received */
}