NFC: Changed target activated state logic
authorEric Lapuyade <eric.lapuyade@intel.com>
Tue, 10 Apr 2012 17:43:11 +0000 (19:43 +0200)
committerJohn W. Linville <linville@tuxdriver.com>
Thu, 12 Apr 2012 19:10:38 +0000 (15:10 -0400)
Signed-off-by: Eric Lapuyade <eric.lapuyade@intel.com>
Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
include/net/nfc/nfc.h
net/nfc/core.c

index f4f6950..7273ff1 100644 (file)
@@ -66,6 +66,7 @@ struct nfc_ops {
 
 #define NFC_TARGET_IDX_ANY -1
 #define NFC_MAX_GT_LEN 48
+#define NFC_TARGET_IDX_NONE 0xffffffff
 
 struct nfc_target {
        u32 idx;
@@ -97,7 +98,7 @@ struct nfc_dev {
        struct device dev;
        bool dev_up;
        bool polling;
-       bool remote_activated;
+       u32 activated_target_idx;
        bool dep_link_up;
        u32 dep_rf_mode;
        struct nfc_genl_data genl_data;
index db88429..44a7018 100644 (file)
@@ -95,7 +95,7 @@ int nfc_dev_down(struct nfc_dev *dev)
                goto error;
        }
 
-       if (dev->polling || dev->remote_activated) {
+       if (dev->polling || dev->activated_target_idx != NFC_TARGET_IDX_NONE) {
                rc = -EBUSY;
                goto error;
        }
@@ -211,6 +211,8 @@ int nfc_dep_link_up(struct nfc_dev *dev, int target_index, u8 comm_mode)
        }
 
        rc = dev->ops->dep_link_up(dev, target_index, comm_mode, gb, gb_len);
+       if (!rc)
+               dev->activated_target_idx = target_index;
 
 error:
        device_unlock(&dev->dev);
@@ -246,6 +248,7 @@ int nfc_dep_link_down(struct nfc_dev *dev)
        rc = dev->ops->dep_link_down(dev);
        if (!rc) {
                dev->dep_link_up = false;
+               dev->activated_target_idx = NFC_TARGET_IDX_NONE;
                nfc_llcp_mac_is_down(dev);
                nfc_genl_dep_link_down_event(dev);
        }
@@ -290,7 +293,7 @@ int nfc_activate_target(struct nfc_dev *dev, u32 target_idx, u32 protocol)
 
        rc = dev->ops->activate_target(dev, target_idx, protocol);
        if (!rc)
-               dev->remote_activated = true;
+               dev->activated_target_idx = target_idx;
 
 error:
        device_unlock(&dev->dev);
@@ -318,7 +321,7 @@ int nfc_deactivate_target(struct nfc_dev *dev, u32 target_idx)
        }
 
        dev->ops->deactivate_target(dev, target_idx);
-       dev->remote_activated = false;
+       dev->activated_target_idx = NFC_TARGET_IDX_NONE;
 
 error:
        device_unlock(&dev->dev);
@@ -352,6 +355,18 @@ int nfc_data_exchange(struct nfc_dev *dev, u32 target_idx, struct sk_buff *skb,
                goto error;
        }
 
+       if (dev->activated_target_idx == NFC_TARGET_IDX_NONE) {
+               rc = -ENOTCONN;
+               kfree_skb(skb);
+               goto error;
+       }
+
+       if (target_idx != dev->activated_target_idx) {
+               rc = -EADDRNOTAVAIL;
+               kfree_skb(skb);
+               goto error;
+       }
+
        rc = dev->ops->data_exchange(dev, target_idx, skb, cb, cb_context);
 
 error:
@@ -482,6 +497,7 @@ int nfc_target_lost(struct nfc_dev *dev, u32 target_idx)
 
        dev->targets_generation++;
        dev->n_targets--;
+       dev->activated_target_idx = NFC_TARGET_IDX_NONE;
 
        if (dev->n_targets) {
                memcpy(&dev->targets[i], &dev->targets[i + 1],
@@ -575,6 +591,8 @@ struct nfc_dev *nfc_allocate_device(struct nfc_ops *ops,
        /* first generation must not be 0 */
        dev->targets_generation = 1;
 
+       dev->activated_target_idx = NFC_TARGET_IDX_NONE;
+
        return dev;
 }
 EXPORT_SYMBOL(nfc_allocate_device);