NFC: hci: Add load_session HCI operand
[sfrench/cifs-2.6.git] / net / nfc / hci / core.c
index d45b638e77c78ec25b8228eacf2ea0ac754ad8d7..c4d251a6fd6791b9836c6332af87ab4091b4163b 100644 (file)
@@ -380,34 +380,31 @@ static int hci_dev_session_init(struct nfc_hci_dev *hdev)
        if (r < 0)
                goto disconnect_all;
 
-       if (skb->len && skb->len == strlen(hdev->init_data.session_id))
-               if (memcmp(hdev->init_data.session_id, skb->data,
-                          skb->len) == 0) {
-                       /* TODO ELa: restore gate<->pipe table from
-                        * some TBD location.
-                        * note: it doesn't seem possible to get the chip
-                        * currently open gate/pipe table.
-                        * It is only possible to obtain the supported
-                        * gate list.
-                        */
+       if (skb->len && skb->len == strlen(hdev->init_data.session_id) &&
+               (memcmp(hdev->init_data.session_id, skb->data,
+                          skb->len) == 0) && hdev->ops->load_session) {
+               /* Restore gate<->pipe table from some proprietary location. */
 
-                       /* goto exit
-                        * For now, always do a full initialization */
-               }
+               r = hdev->ops->load_session(hdev);
 
-       r = nfc_hci_disconnect_all_gates(hdev);
-       if (r < 0)
-               goto exit;
+               if (r < 0)
+                       goto disconnect_all;
+       } else {
 
-       r = hci_dev_connect_gates(hdev, hdev->init_data.gate_count,
-                                 hdev->init_data.gates);
-       if (r < 0)
-               goto disconnect_all;
+               r = nfc_hci_disconnect_all_gates(hdev);
+               if (r < 0)
+                       goto exit;
 
-       r = nfc_hci_set_param(hdev, NFC_HCI_ADMIN_GATE,
-                             NFC_HCI_ADMIN_SESSION_IDENTITY,
-                             hdev->init_data.session_id,
-                             strlen(hdev->init_data.session_id));
+               r = hci_dev_connect_gates(hdev, hdev->init_data.gate_count,
+                                         hdev->init_data.gates);
+               if (r < 0)
+                       goto disconnect_all;
+
+               r = nfc_hci_set_param(hdev, NFC_HCI_ADMIN_GATE,
+                               NFC_HCI_ADMIN_SESSION_IDENTITY,
+                               hdev->init_data.session_id,
+                               strlen(hdev->init_data.session_id));
+       }
        if (r == 0)
                goto exit;