if (cookie == NULL)
return err;
+ if (cookie->cb != NULL)
+ cookie->cb(cookie->adapter_idx, cookie->target_idx, err);
+
if (cookie->ndef != NULL)
g_free(cookie->ndef->data);
/* common: Simple checks on received frame */
static int check_recv_frame(uint8_t *resp, uint8_t reply_code)
{
- int err = 0;
-
if (resp[OFS_NFC_STATUS] != 0) {
DBG("NFC Command failed: 0x%x", resp[OFS_NFC_STATUS]);
- err = -EIO;
+ return -EIO;
}
if (resp[OFS_CMD_RESP] != reply_code) {
DBG("Felica cmd failed: 0x%x", resp[OFS_CMD_RESP]);
- err = -EIO;
+ return -EIO;
}
- return err;
+ return 0;
}
static int data_recv(uint8_t *resp, int length, void *data)
tag->IDm, &cmd);
err = near_adapter_send(adapter_idx, (uint8_t *) &cmd, cmd.len,
- data_recv, tag);
+ data_recv, tag, NULL);
if (err < 0)
goto out_err;
return near_adapter_send(adapter_idx,
(uint8_t *) &cmd, cmd.len,
- data_recv, tag);
+ data_recv, tag, NULL);
}
/* Read block 0 to retrieve the data length */
err = data_read(t3_tag);
-out_err:
- if (err < 0) {
- if (cookie->cb)
- cookie->cb(cookie->adapter_idx, cookie->target_idx,
- err);
+ /*
+ * As reading isn't complete,
+ * callback shouldn't be called while freeing the cookie
+ */
+ if (err == 0)
+ cookie->cb = NULL;
+out_err:
+ if (err < 0)
g_free(t3_tag);
- }
return t3_cookie_release(err, cookie);
}
prepare_read_block(META_BLOCK_START, cookie->IDm, &cmd);
err = near_adapter_send(cookie->adapter_idx, (uint8_t *) &cmd,
- cmd.len, nfctype3_recv_block_0, cookie);
+ cmd.len, nfctype3_recv_block_0, cookie, NULL);
if (err < 0)
goto out_err;
return 0;
out_err:
- if (err < 0 && cookie->cb)
- cookie->cb(cookie->adapter_idx,
- cookie->target_idx, err);
-
return t3_cookie_release(err, cookie);
}
near_tag_set_ic_type(tag, cookie->ic_type);
near_tag_set_blank(tag, TRUE);
- if (cookie->cb)
- cookie->cb(cookie->adapter_idx,
- cookie->target_idx, 0);
-
return t3_cookie_release(0, cookie);
} else {
/* CMD POLL */
cmd.len = LEN_CMD + LEN_CMD_LEN + 4 ;
err = near_adapter_send(cookie->adapter_idx, (uint8_t *) &cmd,
- cmd.len , poll_ndef_system_code, cookie);
+ cmd.len , poll_ndef_system_code, cookie, NULL);
}
if (err < 0)
return 0;
out_err:
- if (err < 0 && cookie->cb)
- cookie->cb(cookie->adapter_idx, cookie->target_idx, err);
-
return t3_cookie_release(err, cookie);
}
prepare_read_block(FELICA_LITE_MC_BLOCK, cookie->IDm, &cmd);
err = near_adapter_send(cookie->adapter_idx, (uint8_t *) &cmd,
cmd.len, check_sys_op_in_mc_block,
- cookie);
+ cookie, NULL);
break;
case FELICA_LITE_S_IC_TYPE:
cmd.len = LEN_CMD + LEN_CMD_LEN + 4 ;
err = near_adapter_send(cookie->adapter_idx, (uint8_t *) &cmd,
- cmd.len, poll_ndef_system_code, cookie);
+ cmd.len, poll_ndef_system_code, cookie,
+ NULL);
}
if (err < 0)
return 0;
out_err:
- if (err < 0 && cookie->cb)
- cookie->cb(cookie->adapter_idx, cookie->target_idx, err);
-
return t3_cookie_release(err, cookie);
}
{
struct type3_cmd cmd;
struct t3_cookie *cookie;
- int err;
DBG("");
cookie->target_idx = target_idx;
cookie->cb = cb;
- err = near_adapter_send(adapter_idx, (uint8_t *) &cmd,
- cmd.len, receive_system_code, cookie);
- if (err < 0)
- g_free(cookie);
-
- return err;
+ return near_adapter_send(adapter_idx, (uint8_t *) &cmd, cmd.len,
+ receive_system_code, cookie,
+ t3_cookie_release);
}
static int update_attr_block_cb(uint8_t *resp, int length, void *data)
DBG("Done writing");
out_err:
- if (cookie->cb)
- cookie->cb(cookie->adapter_idx, cookie->target_idx, err);
-
return t3_cookie_release(err, cookie);
}
prepare_write_block(cookie->IDm, &cmd, 0, cookie->attr);
return near_adapter_send(cookie->adapter_idx, (uint8_t *) &cmd, cmd.len,
- update_attr_block_cb, cookie);
+ update_attr_block_cb, cookie,
+ t3_cookie_release);
}
static int data_write_resp(uint8_t *resp, int length, void *data)
cookie->ndef->offset += BLOCK_SIZE;
err = near_adapter_send(cookie->adapter_idx, (uint8_t *) &cmd, cmd.len,
- data_write_resp, cookie);
+ data_write_resp, cookie, NULL);
if (err < 0)
goto out_err;
return 0;
out_err:
- if (err < 0 && cookie->cb)
- cookie->cb(cookie->adapter_idx, cookie->target_idx, err);
-
return t3_cookie_release(err, cookie);
}
DBG("");
cookie = g_try_malloc0(sizeof(struct t3_cookie));
+
if (cookie == NULL) {
err = -ENOMEM;
- goto out_err;
+
+ if (cb != NULL)
+ cb(adapter_idx, target_idx, err);
+
+ return err;
}
cookie->adapter_idx = adapter_idx;
cookie->current_block = 0;
idm = near_tag_get_idm(tag, &len);
- if (idm == NULL) {
- err = -EINVAL;
- goto out_err;
- }
+ if (idm == NULL)
+ return t3_cookie_release(-EINVAL, cookie);
memcpy(cookie->IDm, idm, len);
attr = near_tag_get_attr_block(tag, &len);
- if (attr == NULL) {
- err = -EINVAL;
- goto out_err;
- }
+ if (attr == NULL)
+ return t3_cookie_release(-EINVAL, cookie);
memcpy(cookie->attr, attr, len);
nmaxb = (((uint16_t) (cookie->attr[3])) << 8) | cookie->attr[4];
if (cookie->ndef->length > (nmaxb * BLOCK_SIZE)) {
near_error("not enough space on tag");
- err = -ENOSPC;
- goto out_err;
+
+ return t3_cookie_release(-ENOSPC, cookie);
}
cookie->attr[9] = 0x0F; /* writing data in progress */
cookie->attr);
cookie->current_block++;
- err = near_adapter_send(adapter_idx, (uint8_t *) &cmd, cmd.len,
- data_write_resp, cookie);
- if (err < 0)
- goto out_err;
-
- return 0;
-
-out_err:
- return t3_cookie_release(err, cookie);
+ return near_adapter_send(adapter_idx, (uint8_t *) &cmd, cmd.len,
+ data_write_resp, cookie,
+ t3_cookie_release);
}
static int nfctype3_write(uint32_t adapter_idx, uint32_t target_idx,
near_tag_io_cb cb)
{
struct near_tag *tag;
+ int err;
DBG("");
- if (ndef == NULL || cb == NULL)
- return -EINVAL;
+ if (ndef == NULL || cb == NULL) {
+ err = -EINVAL;
+ goto out_err;
+ }
tag = near_tag_get_tag(adapter_idx, target_idx);
- if (tag == NULL)
- return -EINVAL;
+ if (tag == NULL) {
+ err = -EINVAL;
+ goto out_err;
+ }
+
+ err = data_write(adapter_idx, target_idx, ndef, tag, cb);
- return data_write(adapter_idx, target_idx, ndef, tag, cb);
+out_err:
+ if (cb != NULL)
+ cb(adapter_idx, target_idx, err);
+
+ return err;
}
static int check_presence(uint8_t *resp, int length, void *data)
if (length < 0)
err = -EIO;
- if (cookie->cb)
- cookie->cb(cookie->adapter_idx,
- cookie->target_idx, err);
-
return t3_cookie_release(err, cookie);
}
{
struct type3_cmd cmd;
struct t3_cookie *cookie;
- int err;
DBG("");
cookie->target_idx = target_idx;
cookie->cb = cb;
- err = near_adapter_send(adapter_idx, (uint8_t *) &cmd,
- cmd.len, check_presence, cookie);
-
- if (err < 0)
- goto out_err;
-
- return 0;
-
-out_err:
- return t3_cookie_release(err, cookie);
+ return near_adapter_send(adapter_idx, (uint8_t *) &cmd,
+ cmd.len, check_presence, cookie,
+ t3_cookie_release);
}
static int format_resp(uint8_t *resp, int length, void *data)
DBG("Formatting is done");
out_err:
- if (cookie->cb)
- cookie->cb(cookie->adapter_idx, cookie->target_idx, err);
-
return t3_cookie_release(err, cookie);
}
cookie->attr);
err = near_adapter_send(cookie->adapter_idx, (uint8_t *) &cmd,
- cmd.len, format_resp, cookie);
+ cmd.len, format_resp, cookie, NULL);
if (err < 0)
goto out_err;
return 0;
out_err:
- if (err < 0 && cookie->cb)
- cookie->cb(cookie->adapter_idx, cookie->target_idx, err);
-
return t3_cookie_release(err, cookie);
}
prepare_write_block(cookie->IDm, &cmd, FELICA_LITE_MC_BLOCK,
cookie->mc_block);
err = near_adapter_send(cookie->adapter_idx, (uint8_t *) &cmd,
- cmd.len, write_attr_block, cookie);
+ cmd.len, write_attr_block, cookie, NULL);
if (err < 0)
goto out_err;
return 0;
out_err:
- if (err < 0 && cookie->cb)
- cookie->cb(cookie->adapter_idx, cookie->target_idx, err);
-
return t3_cookie_release(err, cookie);
}
struct t3_cookie *cookie;
uint8_t ic_type;
uint8_t *idm, len;
- int err;
DBG("");
cookie->ic_type = ic_type;
idm = near_tag_get_idm(tag, &len);
- if (idm == NULL) {
- err = -EINVAL;
- goto out_err;
- }
+ if (idm == NULL)
+ return t3_cookie_release(-EINVAL, cookie);
memcpy(cookie->IDm, idm, len);
prepare_read_block(FELICA_LITE_MC_BLOCK, cookie->IDm, &cmd);
- err = near_adapter_send(cookie->adapter_idx, (uint8_t *) &cmd,
- cmd.len, write_mc_block, cookie);
- if (err < 0)
- goto out_err;
- return 0;
+ return near_adapter_send(cookie->adapter_idx, (uint8_t *) &cmd, cmd.len,
+ write_mc_block, cookie,
+ t3_cookie_release);
-out_err:
- return t3_cookie_release(err, cookie);
}
static struct near_tag_driver type1_driver = {