<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>