diff --git a/sap/sap-u8500.c b/sap/sap-u8500.c
index dadea29..e699fd7 100644
--- a/sap/sap-u8500.c
+++ b/sap/sap-u8500.c
STE_GET_ATR_RSP = 0x2E07,
STE_GET_STATUS_REQ = 0x2D08,
STE_GET_STATUS_RSP = 0x2E08,
- STE_STATUS_IND = 0x2F02
+ STE_STATUS_IND = 0x2F02,
+ STE_SIM_READY_IND = 0x2F03,
};
enum ste_msg {
enum ste_status {
STE_STATUS_OK = 0x00000000,
STE_STATUS_FAILURE = 0x00000001,
+ STE_STATUS_BUSY_CALL = 0x00000002,
};
enum ste_card_status {
STE_POWERED_OFF, /* Card in the reader but powered off */
STE_NO_CARD, /* No card in the reader */
STE_ENABLED, /* Card in the reader and powered on */
+ STE_SIM_BUSY, /* Modem is busy with ongoing call.*/
STE_STATE_MAX
};
u8500.sap_data = NULL;
}
+static void recv_sim_ready()
+{
+ sap_info("sim is ready. Try to connect again");
+
+ if (send_request(u8500.io, STE_START_SAP_REQ, NULL) < 0) {
+ sap_connect_rsp(u8500.sap_data, SAP_STATUS_CONNECTION_FAILED,
+ SAP_BUF_SIZE);
+ simd_close();
+ }
+}
+
+static void recv_connect_rsp(uint32_t status)
+{
+ switch (status) {
+ case STE_STATUS_OK:
+ if (u8500.state != STE_SIM_BUSY)
+ sap_connect_rsp(u8500.sap_data,
+ SAP_STATUS_OK, 0);
+ break;
+ case STE_STATUS_BUSY_CALL:
+ if (u8500.state != STE_SIM_BUSY) {
+ sap_connect_rsp(u8500.sap_data,
+ SAP_STATUS_OK_ONGOING_CALL,
+ SAP_BUF_SIZE);
+
+ u8500.state = STE_SIM_BUSY;
+ }
+ break;
+ default:
+ sap_connect_rsp(u8500.sap_data,
+ SAP_STATUS_CONNECTION_FAILED, 0);
+ simd_close();
+ break;
+ }
+}
+
static void recv_response(struct ste_message *msg)
{
uint32_t status;
switch (msg->id) {
case STE_START_SAP_RSP:
- if (status == STE_STATUS_OK) {
- sap_connect_rsp(u8500.sap_data, SAP_STATUS_OK, 0);
- } else {
- sap_connect_rsp(u8500.sap_data,
- SAP_STATUS_CONNECTION_FAILED, 0);
- simd_close();
- }
+ recv_connect_rsp(status);
break;
-
case STE_SEND_APDU_RSP:
recv_pdu(STE_SEND_APDU_MSG, msg, status, param,
sap_transfer_apdu_rsp);
recv_status(status);
break;
+ case STE_SIM_READY_IND:
+ recv_sim_ready();
+ break;
+
default:
sap_error("unsupported message received (id 0x%x)", msg->id);
}