<p>Hoernchen has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-ccid-firmware/+/16238">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">attempt at handling card insertion/removal<br><br>Change-Id: Ib1a9a9c5cfb8c22cc3b885bc30a349e0f0145630<br>---<br>M ccid_common/ccid_device.c<br>M ccid_common/ccid_device.h<br>M ccid_common/ccid_slot_fsm.c<br>M ccid_common/iso7816_fsm.c<br>M ccid_common/iso7816_fsm.h<br>M sysmoOCTSIM/main.c<br>6 files changed, 89 insertions(+), 34 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-ccid-firmware refs/changes/38/16238/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/ccid_common/ccid_device.c b/ccid_common/ccid_device.c</span><br><span>index ba36988..84bd09a 100644</span><br><span>--- a/ccid_common/ccid_device.c</span><br><span>+++ b/ccid_common/ccid_device.c</span><br><span>@@ -438,9 +438,20 @@</span><br><span> {</span><br><span>   const union ccid_pc_to_rdr *u = msgb_ccid_out(msg);</span><br><span>  const struct ccid_header *ch = (const struct ccid_header *) u;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct msgb *resp;</span><br><span style="color: hsl(120, 100%, 40%);">+    int rc;</span><br><span> </span><br><span>  /* handle this asynchronously */</span><br><span style="color: hsl(0, 100%, 40%);">-        cs->ci->slot_ops->xfr_block_async(cs, msg, &u->xfr_block);</span><br><span style="color: hsl(120, 100%, 40%);">+    rc = cs->ci->slot_ops->xfr_block_async(cs, msg, &u->xfr_block);</span><br><span style="color: hsl(120, 100%, 40%);">+       if (rc < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+              msgb_trim(msg, sizeof(struct ccid_rdr_to_pc_data_block));</span><br><span style="color: hsl(120, 100%, 40%);">+             resp = ccid_gen_data_block(cs, u->xfr_block.hdr.bSeq, CCID_CMD_STATUS_FAILED, -rc, 0, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+          goto out;</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+     /* busy */</span><br><span style="color: hsl(120, 100%, 40%);">+    return 1;</span><br><span style="color: hsl(120, 100%, 40%);">+out:</span><br><span style="color: hsl(120, 100%, 40%);">+       ccid_slot_send_unbusy(cs, resp);</span><br><span>     return 1;</span><br><span> }</span><br><span> </span><br><span>diff --git a/ccid_common/ccid_device.h b/ccid_common/ccid_device.h</span><br><span>index 8390783..38a71db 100644</span><br><span>--- a/ccid_common/ccid_device.h</span><br><span>+++ b/ccid_common/ccid_device.h</span><br><span>@@ -78,13 +78,14 @@</span><br><span> </span><br><span>        void (*icc_power_on_async)(struct ccid_slot *cs, struct msgb *msg,</span><br><span>                              const struct ccid_pc_to_rdr_icc_power_on *ipo);</span><br><span style="color: hsl(0, 100%, 40%);">-      void (*xfr_block_async)(struct ccid_slot *cs, struct msgb *msg,</span><br><span style="color: hsl(120, 100%, 40%);">+       int (*xfr_block_async)(struct ccid_slot *cs, struct msgb *msg,</span><br><span>                               const struct ccid_pc_to_rdr_xfr_block *xfb);</span><br><span>         void (*set_power)(struct ccid_slot *cs, bool enable);</span><br><span>        void (*set_clock)(struct ccid_slot *cs, enum ccid_clock_command cmd);</span><br><span>        int (*set_params)(struct ccid_slot *cs, uint8_t seq, enum ccid_protocol_num proto,</span><br><span>                     const struct ccid_pars_decoded *pars_dec);</span><br><span>         int (*set_rate_and_clock)(struct ccid_slot *cs, uint32_t freq_hz, uint32_t rate_bps);</span><br><span style="color: hsl(120, 100%, 40%);">+ void (*icc_set_insertion_status)(struct ccid_slot *cs, bool present);</span><br><span> };</span><br><span> </span><br><span> /* An instance of CCID (i.e. a card reader device) */</span><br><span>diff --git a/ccid_common/ccid_slot_fsm.c b/ccid_common/ccid_slot_fsm.c</span><br><span>index 8bdcfd5..8d38f29 100644</span><br><span>--- a/ccid_common/ccid_slot_fsm.c</span><br><span>+++ b/ccid_common/ccid_slot_fsm.c</span><br><span>@@ -66,6 +66,23 @@</span><br><span>       /* do nothing; real hardware would update the slot related state here */</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static void iso_fsm_slot_icc_set_insertion_status(struct ccid_slot *cs, bool present) {</span><br><span style="color: hsl(120, 100%, 40%);">+    struct iso_fsm_slot *ss = ccid_slot2iso_fsm_slot(cs);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       if(present == cs->icc_present)</span><br><span style="color: hsl(120, 100%, 40%);">+             return;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     cs->icc_present = present;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       if (!present) {</span><br><span style="color: hsl(120, 100%, 40%);">+               osmo_fsm_inst_dispatch(ss->fi, ISO7816_E_CARD_REMOVAL, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+              card_uart_ctrl(ss->cuart, CUART_CTL_RST, true);</span><br><span style="color: hsl(120, 100%, 40%);">+            card_uart_ctrl(ss->cuart, CUART_CTL_POWER, false);</span><br><span style="color: hsl(120, 100%, 40%);">+         cs->icc_powered = false;</span><br><span style="color: hsl(120, 100%, 40%);">+           cs->cmd_busy = false;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> static void iso_fsm_slot_icc_power_on_async(struct ccid_slot *cs, struct msgb *msg,</span><br><span>                                        const struct ccid_pc_to_rdr_icc_power_on *ipo)</span><br><span> {</span><br><span>@@ -113,6 +130,15 @@</span><br><span>           ccid_slot_send_unbusy(cs, resp);</span><br><span>             msgb_free(tpdu);</span><br><span>             break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case ISO7816_E_TPDU_FAILED_IND:</span><br><span style="color: hsl(120, 100%, 40%);">+               tpdu = data;</span><br><span style="color: hsl(120, 100%, 40%);">+          LOGPCS(cs, LOGL_DEBUG, "%s(event=%d, cause=%d, data=%s)\n", __func__, event, cause,</span><br><span style="color: hsl(120, 100%, 40%);">+                 msgb_hexdump(tpdu));</span><br><span style="color: hsl(120, 100%, 40%);">+          /* FIXME: other error causes than card removal?*/</span><br><span style="color: hsl(120, 100%, 40%);">+             resp = ccid_gen_data_block(cs, ss->seq, CCID_CMD_STATUS_FAILED, CCID_ERR_ICC_MUTE, msgb_l2(tpdu), 0);</span><br><span style="color: hsl(120, 100%, 40%);">+              ccid_slot_send_unbusy(cs, resp);</span><br><span style="color: hsl(120, 100%, 40%);">+              msgb_free(tpdu);</span><br><span style="color: hsl(120, 100%, 40%);">+              break;</span><br><span>       case ISO7816_E_PPS_DONE_IND:</span><br><span>                 tpdu = data;</span><br><span>                 /* pps was successful, so we know these values are fine */</span><br><span>@@ -147,12 +173,15 @@</span><br><span>   }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static void iso_fsm_slot_xfr_block_async(struct ccid_slot *cs, struct msgb *msg,</span><br><span style="color: hsl(120, 100%, 40%);">+static int iso_fsm_slot_xfr_block_async(struct ccid_slot *cs, struct msgb *msg,</span><br><span>                          const struct ccid_pc_to_rdr_xfr_block *xfb)</span><br><span> {</span><br><span>     struct iso_fsm_slot *ss = ccid_slot2iso_fsm_slot(cs);</span><br><span>        struct msgb *tpdu;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+        if(!cs->icc_present)</span><br><span style="color: hsl(120, 100%, 40%);">+               return -CCID_ERR_ICC_MUTE;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>         ss->seq = xfb->hdr.bSeq;</span><br><span> </span><br><span>   /* must be '0' for TPDU level exchanges or for short APDU */</span><br><span>@@ -171,6 +200,7 @@</span><br><span>   LOGPCS(cs, LOGL_DEBUG, "scheduling TPDU transfer: %s\n", msgb_hexdump(tpdu));</span><br><span>      osmo_fsm_inst_dispatch(ss->fi, ISO7816_E_XCEIVE_TPDU_CMD, tpdu);</span><br><span>  /* continues in iso_fsm_clot_user_cb once response/error/timeout is received */</span><br><span style="color: hsl(120, 100%, 40%);">+       return 0;</span><br><span> }</span><br><span> </span><br><span> </span><br><span>@@ -296,6 +326,7 @@</span><br><span>         .init = iso_fsm_slot_init,</span><br><span>   .pre_proc_cb = iso_fsm_slot_pre_proc_cb,</span><br><span>     .icc_power_on_async = iso_fsm_slot_icc_power_on_async,</span><br><span style="color: hsl(120, 100%, 40%);">+        .icc_set_insertion_status = iso_fsm_slot_icc_set_insertion_status,</span><br><span>   .xfr_block_async = iso_fsm_slot_xfr_block_async,</span><br><span>     .set_power = iso_fsm_slot_set_power,</span><br><span>         .set_clock = iso_fsm_slot_set_clock,</span><br><span>diff --git a/ccid_common/iso7816_fsm.c b/ccid_common/iso7816_fsm.c</span><br><span>index c675ece..3d09a84 100644</span><br><span>--- a/ccid_common/iso7816_fsm.c</span><br><span>+++ b/ccid_common/iso7816_fsm.c</span><br><span>@@ -45,7 +45,6 @@</span><br><span>    ISO7816_S_IN_ATR, /*!< while we are receiving the ATR */</span><br><span>  ISO7816_S_WAIT_TPDU, /*!< waiting for start of new TPDU */</span><br><span>        ISO7816_S_IN_TPDU, /*!< inside a single TPDU */</span><br><span style="color: hsl(0, 100%, 40%);">-      ISO7816_S_IN_PPS_REQ, /*!< while we are inside the PPS request */</span><br><span>         ISO7816_S_WAIT_PPS_RSP, /*!< waiting for start of the PPS response */</span><br><span>     ISO7816_S_IN_PPS_RSP, /*!< while we are inside the PPS request */</span><br><span> };</span><br><span>@@ -230,6 +229,7 @@</span><br><span> {</span><br><span>        struct iso7816_3_priv *ip = get_iso7816_3_priv(fi);</span><br><span>  OSMO_ASSERT(fi->fsm == &iso7816_3_fsm);</span><br><span style="color: hsl(120, 100%, 40%);">+        struct msgb *msg;</span><br><span> </span><br><span>        switch (event) {</span><br><span>     case ISO7816_E_RESET_REL_IND:</span><br><span>@@ -238,6 +238,16 @@</span><br><span>                 osmo_fsm_inst_state_chg_ms(fi, ISO7816_S_WAIT_ATR,</span><br><span>                                      fi_cycles2ms(fi, 40000), T_WAIT_ATR);</span><br><span>             break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case ISO7816_E_PPS_FAILED_IND:</span><br><span style="color: hsl(120, 100%, 40%);">+                msg = data;</span><br><span style="color: hsl(120, 100%, 40%);">+           /* notify user about PPS result */</span><br><span style="color: hsl(120, 100%, 40%);">+            ip->user_cb(fi, event, 0, msg);</span><br><span style="color: hsl(120, 100%, 40%);">+            break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case ISO7816_E_TPDU_FAILED_IND:</span><br><span style="color: hsl(120, 100%, 40%);">+               msg = data;</span><br><span style="color: hsl(120, 100%, 40%);">+           /* hand finished TPDU to user */</span><br><span style="color: hsl(120, 100%, 40%);">+              ip->user_cb(fi, event, 0, msg);</span><br><span style="color: hsl(120, 100%, 40%);">+            break;</span><br><span>       default:</span><br><span>             OSMO_ASSERT(0);</span><br><span>      }</span><br><span>@@ -376,22 +386,6 @@</span><br><span>     }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static void iso7816_3_in_pps_req_action(struct osmo_fsm_inst *fi, uint32_t event, void *data)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-        struct iso7816_3_priv *tfp = get_iso7816_3_priv(fi);</span><br><span style="color: hsl(0, 100%, 40%);">-//  struct osmo_fsm_inst *parent_fi = fi->proc.parent;</span><br><span style="color: hsl(0, 100%, 40%);">-// struct iso7816_3_priv *ip = get_iso7816_3_priv(parent_fi);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      switch (event) {</span><br><span style="color: hsl(0, 100%, 40%);">-        case ISO7816_E_XCEIVE_PPS_CMD:</span><br><span style="color: hsl(0, 100%, 40%);">-          osmo_fsm_inst_state_chg(fi, ISO7816_S_WAIT_PPS_RSP, 0, 0);</span><br><span style="color: hsl(0, 100%, 40%);">-//            card_uart_tx(tfp->uart, msgb_data(data), msgb_length(data), true);</span><br><span style="color: hsl(0, 100%, 40%);">-           break;</span><br><span style="color: hsl(0, 100%, 40%);">-  default:</span><br><span style="color: hsl(0, 100%, 40%);">-                OSMO_ASSERT(0);</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> </span><br><span> static void iso7816_3_s_wait_pps_rsp_action(struct osmo_fsm_inst *fi, uint32_t event, void *data)</span><br><span> {</span><br><span>@@ -438,7 +432,9 @@</span><br><span> static const struct osmo_fsm_state iso7816_3_states[] = {</span><br><span>  [ISO7816_S_RESET] = {</span><br><span>                .name = "RESET",</span><br><span style="color: hsl(0, 100%, 40%);">-              .in_event_mask =        S(ISO7816_E_RESET_REL_IND),</span><br><span style="color: hsl(120, 100%, 40%);">+           .in_event_mask =        S(ISO7816_E_RESET_REL_IND) |</span><br><span style="color: hsl(120, 100%, 40%);">+                                                  S(ISO7816_E_PPS_FAILED_IND)|</span><br><span style="color: hsl(120, 100%, 40%);">+                                                  S(ISO7816_E_TPDU_FAILED_IND),</span><br><span>                .out_state_mask =       S(ISO7816_S_WAIT_ATR) |</span><br><span>                                      S(ISO7816_S_RESET),</span><br><span>          .action = iso7816_3_reset_action,</span><br><span>@@ -471,7 +467,6 @@</span><br><span>              .out_state_mask =       S(ISO7816_S_RESET) |</span><br><span>                                         S(ISO7816_S_WAIT_TPDU) |</span><br><span>                                     S(ISO7816_S_IN_TPDU) |</span><br><span style="color: hsl(0, 100%, 40%);">-                                  S(ISO7816_S_IN_PPS_REQ) |</span><br><span>                                    S(ISO7816_S_WAIT_PPS_RSP),</span><br><span>           .action = iso7816_3_wait_tpdu_action,</span><br><span>                .onenter = iso7816_3_wait_tpdu_onenter,</span><br><span>@@ -490,15 +485,6 @@</span><br><span>                                       S(ISO7816_S_IN_TPDU),</span><br><span>                .action = iso7816_3_in_tpdu_action,</span><br><span>  },</span><br><span style="color: hsl(0, 100%, 40%);">-      [ISO7816_S_IN_PPS_REQ] = {</span><br><span style="color: hsl(0, 100%, 40%);">-              .name = "IN_PPS_REQ",</span><br><span style="color: hsl(0, 100%, 40%);">-         .in_event_mask =        S(ISO7816_E_XCEIVE_TPDU_CMD),</span><br><span style="color: hsl(0, 100%, 40%);">-           .out_state_mask =       S(ISO7816_S_RESET) |</span><br><span style="color: hsl(0, 100%, 40%);">-                                    S(ISO7816_S_WAIT_TPDU) |</span><br><span style="color: hsl(0, 100%, 40%);">-                                        S(ISO7816_S_IN_PPS_REQ) |</span><br><span style="color: hsl(0, 100%, 40%);">-                                       S(ISO7816_S_WAIT_PPS_RSP),</span><br><span style="color: hsl(0, 100%, 40%);">-              .action = iso7816_3_in_pps_req_action,</span><br><span style="color: hsl(0, 100%, 40%);">-  },</span><br><span>   [ISO7816_S_WAIT_PPS_RSP] = {</span><br><span>                 .name = "WAIT_PPS_RESP",</span><br><span>           .in_event_mask =        S(ISO7816_E_TX_COMPL) |</span><br><span>@@ -885,18 +871,27 @@</span><br><span>      struct pps_fsm_priv *atp = fi->priv;</span><br><span> </span><br><span>  if (!atp->rx_cmd)</span><br><span style="color: hsl(0, 100%, 40%);">-            atp->rx_cmd = msgb_alloc_c(fi, 6, "ATR"); /* TS + 32 chars */</span><br><span style="color: hsl(120, 100%, 40%);">+            atp->rx_cmd = msgb_alloc_c(fi, 6, "PPSRSP"); /* at most 6 */</span><br><span>    else</span><br><span>                 msgb_reset(atp->rx_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* notify in case card got pulled out */</span><br><span style="color: hsl(120, 100%, 40%);">+      if (atp->tx_cmd){</span><br><span style="color: hsl(120, 100%, 40%);">+          osmo_fsm_inst_dispatch(fi->proc.parent,</span><br><span style="color: hsl(120, 100%, 40%);">+                            ISO7816_E_PPS_FAILED_IND, atp->tx_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+            atp->tx_cmd = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+   }</span><br><span> }</span><br><span> </span><br><span> static void pps_s_tx_pps_req_action(struct osmo_fsm_inst *fi, uint32_t event, void *data)</span><br><span> {</span><br><span>         struct pps_fsm_priv *atp = fi->priv;</span><br><span style="color: hsl(0, 100%, 40%);">- atp->tx_cmd = data;</span><br><span>       struct osmo_fsm_inst *parent_fi = fi->proc.parent;</span><br><span>        struct iso7816_3_priv *ip = get_iso7816_3_priv(parent_fi);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+        /* keep the buffer to compare it with the received response */</span><br><span style="color: hsl(120, 100%, 40%);">+        atp->tx_cmd = data;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>     switch (event) {</span><br><span>     case ISO7816_E_XCEIVE_PPS_CMD:</span><br><span>               osmo_fsm_inst_state_chg(fi, PPS_S_WAIT_PPSS, 0, 0);</span><br><span>@@ -976,6 +971,8 @@</span><br><span>                                    osmo_fsm_inst_dispatch(fi->proc.parent,</span><br><span>                                                   ISO7816_E_PPS_FAILED_IND, atp->tx_cmd);</span><br><span>                           }</span><br><span style="color: hsl(120, 100%, 40%);">+                             /* ownership transfer */</span><br><span style="color: hsl(120, 100%, 40%);">+                              atp->tx_cmd = 0;</span><br><span>                  }</span><br><span>                    break;</span><br><span>               default:</span><br><span>@@ -1097,6 +1094,16 @@</span><br><span>    return (struct tpdu_fsm_priv *) fi->priv;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static void tpdu_s_init_onenter(struct osmo_fsm_inst *fi, uint32_t old_state)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       struct tpdu_fsm_priv *tfp = get_tpdu_fsm_priv(fi);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* notify in case card got pulled out */</span><br><span style="color: hsl(120, 100%, 40%);">+      if (tfp->tpdu){</span><br><span style="color: hsl(120, 100%, 40%);">+            osmo_fsm_inst_dispatch(fi->proc.parent, ISO7816_E_TPDU_FAILED_IND, tfp->tpdu);</span><br><span style="color: hsl(120, 100%, 40%);">+          tfp->tpdu = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span> </span><br><span> static void tpdu_s_init_action(struct osmo_fsm_inst *fi, uint32_t event, void *data)</span><br><span> {</span><br><span>@@ -1315,6 +1322,9 @@</span><br><span>                osmo_fsm_inst_state_chg(fi, TPDU_S_DONE, 0, 0);</span><br><span>              /* Notify parent FSM */</span><br><span>              osmo_fsm_inst_dispatch(fi->proc.parent, ISO7816_E_TPDU_DONE_IND, tfp->tpdu);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          /* ownership transfer */</span><br><span style="color: hsl(120, 100%, 40%);">+              tfp->tpdu = 0;</span><br><span>            break;</span><br><span>       default:</span><br><span>             OSMO_ASSERT(0);</span><br><span>@@ -1346,6 +1356,7 @@</span><br><span>              .out_state_mask = S(TPDU_S_INIT) |</span><br><span>                             S(TPDU_S_TX_HDR),</span><br><span>          .action = tpdu_s_init_action,</span><br><span style="color: hsl(120, 100%, 40%);">+         .onenter = tpdu_s_init_onenter,</span><br><span>      },</span><br><span>   [TPDU_S_TX_HDR] = {</span><br><span>          .name = "TX_HDR",</span><br><span>diff --git a/ccid_common/iso7816_fsm.h b/ccid_common/iso7816_fsm.h</span><br><span>index f512709..d4aee59 100644</span><br><span>--- a/ccid_common/iso7816_fsm.h</span><br><span>+++ b/ccid_common/iso7816_fsm.h</span><br><span>@@ -32,6 +32,7 @@</span><br><span>     ISO7816_E_ATR_DONE_IND,         /*!< ATR Done indication from ATR child FSM */</span><br><span>    ISO7816_E_ATR_ERR_IND,          /*!< ATR Error indication from ATR child FSM */</span><br><span>   ISO7816_E_TPDU_DONE_IND,        /*!< TPDU Done indication from TPDU child FSM */</span><br><span style="color: hsl(120, 100%, 40%);">+   ISO7816_E_TPDU_FAILED_IND,      /*!< TPDU Failed indication from TPDU child FSM */</span><br><span>        ISO7816_E_TPDU_CLEAR_REQ,       /*!< Return TPDU FSM to TPDU_S_INIT */</span><br><span> };</span><br><span> </span><br><span>diff --git a/sysmoOCTSIM/main.c b/sysmoOCTSIM/main.c</span><br><span>index 1949aa8..92091cd 100644</span><br><span>--- a/sysmoOCTSIM/main.c</span><br><span>+++ b/sysmoOCTSIM/main.c</span><br><span>@@ -353,7 +353,7 @@</span><br><span>       for (i = 0; i < 8; i++){</span><br><span>          bool level = ncn8025_interrupt_level(i);</span><br><span>             new_mask |= level << i;</span><br><span style="color: hsl(0, 100%, 40%);">-           g_ci.slot[i].icc_present = level;</span><br><span style="color: hsl(120, 100%, 40%);">+             g_ci.slot_ops->icc_set_insertion_status(&g_ci.slot[i], level);</span><br><span>        }</span><br><span> </span><br><span>        /* notify the user/host about any changes */</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-ccid-firmware/+/16238">change 16238</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/c/osmo-ccid-firmware/+/16238"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-ccid-firmware </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: Ib1a9a9c5cfb8c22cc3b885bc30a349e0f0145630 </div>
<div style="display:none"> Gerrit-Change-Number: 16238 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Hoernchen <ewild@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>