]> Pileus Git - ~andy/linux/blobdiff - net/nfc/nci/rsp.c
Merge tag 'ktest-v3.4' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux...
[~andy/linux] / net / nfc / nci / rsp.c
index 2840ae2f361527e278ae871a84f18f968d612057..3003c3390e492c18907cc7f5076949439dd7273d 100644 (file)
@@ -67,19 +67,18 @@ static void nci_core_init_rsp_packet(struct nci_dev *ndev, struct sk_buff *skb)
        ndev->num_supported_rf_interfaces = rsp_1->num_supported_rf_interfaces;
 
        if (ndev->num_supported_rf_interfaces >
-                       NCI_MAX_SUPPORTED_RF_INTERFACES) {
+           NCI_MAX_SUPPORTED_RF_INTERFACES) {
                ndev->num_supported_rf_interfaces =
                        NCI_MAX_SUPPORTED_RF_INTERFACES;
        }
 
        memcpy(ndev->supported_rf_interfaces,
-               rsp_1->supported_rf_interfaces,
-               ndev->num_supported_rf_interfaces);
+              rsp_1->supported_rf_interfaces,
+              ndev->num_supported_rf_interfaces);
 
        rsp_2 = (void *) (skb->data + 6 + rsp_1->num_supported_rf_interfaces);
 
-       ndev->max_logical_connections =
-               rsp_2->max_logical_connections;
+       ndev->max_logical_connections = rsp_2->max_logical_connections;
        ndev->max_routing_table_size =
                __le16_to_cpu(rsp_2->max_routing_table_size);
        ndev->max_ctrl_pkt_payload_len =
@@ -121,7 +120,7 @@ exit:
 }
 
 static void nci_rf_disc_map_rsp_packet(struct nci_dev *ndev,
-                                       struct sk_buff *skb)
+                                      struct sk_buff *skb)
 {
        __u8 status = skb->data[0];
 
@@ -137,21 +136,37 @@ static void nci_rf_disc_rsp_packet(struct nci_dev *ndev, struct sk_buff *skb)
        pr_debug("status 0x%x\n", status);
 
        if (status == NCI_STATUS_OK)
-               set_bit(NCI_DISCOVERY, &ndev->flags);
+               atomic_set(&ndev->state, NCI_DISCOVERY);
 
        nci_req_complete(ndev, status);
 }
 
-static void nci_rf_deactivate_rsp_packet(struct nci_dev *ndev,
-                                       struct sk_buff *skb)
+static void nci_rf_disc_select_rsp_packet(struct nci_dev *ndev,
+                                         struct sk_buff *skb)
 {
        __u8 status = skb->data[0];
 
        pr_debug("status 0x%x\n", status);
 
-       clear_bit(NCI_DISCOVERY, &ndev->flags);
+       /* Complete the request on intf_activated_ntf or generic_error_ntf */
+       if (status != NCI_STATUS_OK)
+               nci_req_complete(ndev, status);
+}
 
-       nci_req_complete(ndev, status);
+static void nci_rf_deactivate_rsp_packet(struct nci_dev *ndev,
+                                        struct sk_buff *skb)
+{
+       __u8 status = skb->data[0];
+
+       pr_debug("status 0x%x\n", status);
+
+       /* If target was active, complete the request only in deactivate_ntf */
+       if ((status != NCI_STATUS_OK) ||
+           (atomic_read(&ndev->state) != NCI_POLL_ACTIVE)) {
+               nci_clear_target_list(ndev);
+               atomic_set(&ndev->state, NCI_IDLE);
+               nci_req_complete(ndev, status);
+       }
 }
 
 void nci_rsp_packet(struct nci_dev *ndev, struct sk_buff *skb)
@@ -187,6 +202,10 @@ void nci_rsp_packet(struct nci_dev *ndev, struct sk_buff *skb)
                nci_rf_disc_rsp_packet(ndev, skb);
                break;
 
+       case NCI_OP_RF_DISCOVER_SELECT_RSP:
+               nci_rf_disc_select_rsp_packet(ndev, skb);
+               break;
+
        case NCI_OP_RF_DEACTIVATE_RSP:
                nci_rf_deactivate_rsp_packet(ndev, skb);
                break;