neard 0.7
[profile/ivi/neard.git] / plugins / nfctype3.c
index ffb401a..0fb444b 100644 (file)
@@ -144,6 +144,9 @@ static int t3_cookie_release(int err, void *data)
        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);
 
@@ -195,19 +198,17 @@ static void prepare_read_block(uint8_t cur_block,
 /* 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)
@@ -261,7 +262,7 @@ 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;
@@ -293,7 +294,7 @@ static int data_read(struct type3_tag *tag)
 
        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 */
@@ -365,14 +366,16 @@ static int nfctype3_recv_block_0(uint8_t *resp, int length, void *data)
 
        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);
 }
@@ -397,17 +400,13 @@ static int poll_ndef_system_code(uint8_t *resp, int length, void *data)
        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);
 }
 
@@ -449,10 +448,6 @@ static int check_sys_op_in_mc_block(uint8_t *resp, int length, void *data)
                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 */
@@ -465,7 +460,7 @@ static int check_sys_op_in_mc_block(uint8_t *resp, int length, void *data)
                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)
@@ -474,9 +469,6 @@ static int check_sys_op_in_mc_block(uint8_t *resp, int length, void *data)
        return 0;
 
 out_err:
-       if (err < 0 && cookie->cb)
-               cookie->cb(cookie->adapter_idx, cookie->target_idx, err);
-
        return t3_cookie_release(err, cookie);
 }
 
@@ -508,7 +500,7 @@ static int receive_system_code(uint8_t *resp, int length, void *data)
                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:
@@ -523,7 +515,8 @@ static int receive_system_code(uint8_t *resp, int length, void *data)
                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)
@@ -532,9 +525,6 @@ static int receive_system_code(uint8_t *resp, int length, void *data)
        return 0;
 
 out_err:
-       if (err < 0 && cookie->cb)
-               cookie->cb(cookie->adapter_idx, cookie->target_idx, err);
-
        return t3_cookie_release(err, cookie);
 }
 
@@ -543,7 +533,6 @@ static int nfctype3_read(uint32_t adapter_idx,
 {
        struct type3_cmd cmd;
        struct t3_cookie *cookie;
-       int err;
 
        DBG("");
 
@@ -565,12 +554,9 @@ static int nfctype3_read(uint32_t adapter_idx,
        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)
@@ -592,9 +578,6 @@ 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);
 }
 
@@ -621,7 +604,8 @@ static int update_attr_block(struct t3_cookie *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)
@@ -665,16 +649,13 @@ 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);
 }
 
@@ -693,9 +674,14 @@ static int data_write(uint32_t adapter_idx, uint32_t target_idx,
        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;
@@ -705,26 +691,22 @@ static int data_write(uint32_t adapter_idx, uint32_t target_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 */
@@ -740,15 +722,9 @@ static int data_write(uint32_t adapter_idx, uint32_t target_idx,
                                                        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,
@@ -756,17 +732,28 @@ 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)
@@ -779,10 +766,6 @@ 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);
 }
 
@@ -791,7 +774,6 @@ static int nfctype3_check_presence(uint32_t adapter_idx,
 {
        struct type3_cmd cmd;
        struct t3_cookie *cookie;
-       int err;
 
        DBG("");
 
@@ -813,16 +795,9 @@ static int nfctype3_check_presence(uint32_t adapter_idx,
        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)
@@ -856,9 +831,6 @@ 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);
 }
 
@@ -905,16 +877,13 @@ static int write_attr_block(uint8_t *resp, int length , void *data)
                                                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);
 }
 
@@ -950,16 +919,13 @@ static int write_mc_block(uint8_t *resp, int length, void *data)
        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);
 }
 
@@ -971,7 +937,6 @@ static int nfctype3_format(uint32_t adapter_idx,
        struct t3_cookie *cookie;
        uint8_t ic_type;
        uint8_t *idm, len;
-       int err;
 
        DBG("");
 
@@ -993,23 +958,17 @@ static int nfctype3_format(uint32_t adapter_idx,
        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 = {