]> Pileus Git - ~andy/linux/blobdiff - net/nfc/digital_core.c
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wirel...
[~andy/linux] / net / nfc / digital_core.c
index 09fc95439955052c2b2f6f178ae0ea421f3fab24..c129d1571ca6c55281807781aeb803d6f9f9415b 100644 (file)
@@ -339,7 +339,6 @@ int digital_target_found(struct nfc_digital_dev *ddev,
        pr_debug("rf_tech=%d, protocol=%d\n", rf_tech, protocol);
 
        ddev->curr_rf_tech = rf_tech;
-       ddev->curr_protocol = protocol;
 
        if (DIGITAL_DRV_CAPS_IN_CRC(ddev)) {
                ddev->skb_add_crc = digital_skb_add_crc_none;
@@ -541,8 +540,14 @@ static int digital_dep_link_up(struct nfc_dev *nfc_dev,
                               __u8 comm_mode, __u8 *gb, size_t gb_len)
 {
        struct nfc_digital_dev *ddev = nfc_get_drvdata(nfc_dev);
+       int rc;
+
+       rc = digital_in_send_atr_req(ddev, target, comm_mode, gb, gb_len);
 
-       return digital_in_send_atr_req(ddev, target, comm_mode, gb, gb_len);
+       if (!rc)
+               ddev->curr_protocol = NFC_PROTO_NFC_DEP;
+
+       return rc;
 }
 
 static int digital_dep_link_down(struct nfc_dev *nfc_dev)
@@ -557,6 +562,20 @@ static int digital_dep_link_down(struct nfc_dev *nfc_dev)
 static int digital_activate_target(struct nfc_dev *nfc_dev,
                                   struct nfc_target *target, __u32 protocol)
 {
+       struct nfc_digital_dev *ddev = nfc_get_drvdata(nfc_dev);
+
+       if (ddev->poll_tech_count) {
+               pr_err("Can't activate a target while polling\n");
+               return -EBUSY;
+       }
+
+       if (ddev->curr_protocol) {
+               pr_err("A target is already active\n");
+               return -EBUSY;
+       }
+
+       ddev->curr_protocol = protocol;
+
        return 0;
 }
 
@@ -565,6 +584,11 @@ static void digital_deactivate_target(struct nfc_dev *nfc_dev,
 {
        struct nfc_digital_dev *ddev = nfc_get_drvdata(nfc_dev);
 
+       if (!ddev->curr_protocol) {
+               pr_err("No active target\n");
+               return;
+       }
+
        ddev->curr_protocol = 0;
 }