NFC: st21nfca: Rework st21nfca_hci_event_received to route event to relevent gate.
authorChristophe Ricard <christophe.ricard@gmail.com>
Wed, 12 Nov 2014 23:30:39 +0000 (00:30 +0100)
committerSamuel Ortiz <sameo@linux.intel.com>
Tue, 2 Dec 2014 01:02:00 +0000 (02:02 +0100)
As many event with the same id can come from several gates,
it will be easier to manage each of them by gate.

Signed-off-by: Christophe Ricard <christophe-h.ricard@st.com>
Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
drivers/nfc/st21nfca/st21nfca.c
drivers/nfc/st21nfca/st21nfca.h
drivers/nfc/st21nfca/st21nfca_dep.c
drivers/nfc/st21nfca/st21nfca_dep.h

index a89e56c2c74954a0ac248bb00f603cd0528af3c4..f2596c8d68b0b36b12501914e7a1ea49ce16c058 100644 (file)
        ((p & 0x0f) == (ST21NFCA_DM_PIPE_CREATED | ST21NFCA_DM_PIPE_OPEN))
 
 #define ST21NFCA_NFC_MODE                      0x03    /* NFC_MODE parameter*/
-#define ST21NFCA_EVT_FIELD_ON                  0x11
-#define ST21NFCA_EVT_CARD_DEACTIVATED          0x12
-#define ST21NFCA_EVT_CARD_ACTIVATED            0x13
-#define ST21NFCA_EVT_FIELD_OFF                 0x14
 
 static DECLARE_BITMAP(dev_mask, ST21NFCA_NUM_DEVICES);
 
@@ -841,31 +837,11 @@ static int st21nfca_hci_check_presence(struct nfc_hci_dev *hdev,
 static int st21nfca_hci_event_received(struct nfc_hci_dev *hdev, u8 gate,
                                       u8 event, struct sk_buff *skb)
 {
-       int r;
-       struct st21nfca_hci_info *info = nfc_hci_get_clientdata(hdev);
-
-       pr_debug("hci event: %d\n", event);
+       pr_debug("hci event: %d gate: %x\n", event, gate);
 
-       switch (event) {
-       case ST21NFCA_EVT_CARD_ACTIVATED:
-               if (gate == ST21NFCA_RF_CARD_F_GATE)
-                       info->dep_info.curr_nfc_dep_pni = 0;
-               break;
-       case ST21NFCA_EVT_CARD_DEACTIVATED:
-               break;
-       case ST21NFCA_EVT_FIELD_ON:
-               break;
-       case ST21NFCA_EVT_FIELD_OFF:
-               break;
-       case ST21NFCA_EVT_SEND_DATA:
-               if (gate == ST21NFCA_RF_CARD_F_GATE) {
-                       r = st21nfca_tm_event_send_data(hdev, skb, gate);
-                       if (r < 0)
-                               return r;
-                       return 0;
-               }
-               info->dep_info.curr_nfc_dep_pni = 0;
-               return 1;
+       switch (gate) {
+       case ST21NFCA_RF_CARD_F_GATE:
+               return st21nfca_dep_event_received(hdev, event, skb);
        default:
                return 1;
        }
index a0b77f1ba6d905ae07f322414250bfc4ee6cbc9c..7c2a852922304513c4bd52794e0b03eb7de11d23 100644 (file)
@@ -85,6 +85,4 @@ struct st21nfca_hci_info {
 
 #define ST21NFCA_RF_CARD_F_GATE 0x24
 
-#define ST21NFCA_EVT_SEND_DATA 0x10
-
 #endif /* __LOCAL_ST21NFCA_H_ */
index bfb6df56c5058d36d007c0753a8aa31e25e4f9ce..8882181d65de7c71c3f5940d9aee422d5a57ecd1 100644 (file)
 #define ST21NFCA_LR_BITS_PAYLOAD_SIZE_254B 0x30
 #define ST21NFCA_GB_BIT  0x02
 
+#define ST21NFCA_EVT_SEND_DATA         0x10
+#define ST21NFCA_EVT_FIELD_ON           0x11
+#define ST21NFCA_EVT_CARD_DEACTIVATED   0x12
+#define ST21NFCA_EVT_CARD_ACTIVATED     0x13
+#define ST21NFCA_EVT_FIELD_OFF          0x14
+
 #define ST21NFCA_EVT_CARD_F_BITRATE 0x16
 #define ST21NFCA_EVT_READER_F_BITRATE 0x13
 #define        ST21NFCA_PSL_REQ_SEND_SPEED(brs) (brs & 0x38)
@@ -372,8 +378,8 @@ exit:
        return r;
 }
 
-int st21nfca_tm_event_send_data(struct nfc_hci_dev *hdev, struct sk_buff *skb,
-                               u8 gate)
+static int st21nfca_tm_event_send_data(struct nfc_hci_dev *hdev,
+                               struct sk_buff *skb)
 {
        u8 cmd0, cmd1;
        int r;
@@ -400,7 +406,42 @@ int st21nfca_tm_event_send_data(struct nfc_hci_dev *hdev, struct sk_buff *skb,
        }
        return r;
 }
-EXPORT_SYMBOL(st21nfca_tm_event_send_data);
+
+/*
+ * Returns:
+ * <= 0: driver handled the event, skb consumed
+ *    1: driver does not handle the event, please do standard processing
+ */
+int st21nfca_dep_event_received(struct nfc_hci_dev *hdev,
+                               u8 event, struct sk_buff *skb)
+{
+       int r = 0;
+       struct st21nfca_hci_info *info = nfc_hci_get_clientdata(hdev);
+
+       pr_debug("dep event: %d\n", event);
+
+       switch (event) {
+       case ST21NFCA_EVT_CARD_ACTIVATED:
+               info->dep_info.curr_nfc_dep_pni = 0;
+               break;
+       case ST21NFCA_EVT_CARD_DEACTIVATED:
+               break;
+       case ST21NFCA_EVT_FIELD_ON:
+               break;
+       case ST21NFCA_EVT_FIELD_OFF:
+               break;
+       case ST21NFCA_EVT_SEND_DATA:
+               r = st21nfca_tm_event_send_data(hdev, skb);
+               if (r < 0)
+                       return r;
+               return 0;
+       default:
+               return 1;
+       }
+       kfree_skb(skb);
+       return r;
+}
+EXPORT_SYMBOL(st21nfca_dep_event_received);
 
 static void st21nfca_im_send_psl_req(struct nfc_hci_dev *hdev, u8 did, u8 bsi,
                                     u8 bri, u8 lri)
index ca213dee9c6e66537389c03a0e9682cef08471b1..baf4664b4fc44d6db40aba4e879425df66d2e5e9 100644 (file)
@@ -32,8 +32,8 @@ struct st21nfca_dep_info {
        u8 lri;
 } __packed;
 
-int st21nfca_tm_event_send_data(struct nfc_hci_dev *hdev, struct sk_buff *skb,
-                               u8 gate);
+int st21nfca_dep_event_received(struct nfc_hci_dev *hdev,
+                               u8 event, struct sk_buff *skb);
 int st21nfca_tm_send_dep_res(struct nfc_hci_dev *hdev, struct sk_buff *skb);
 
 int st21nfca_im_send_atr_req(struct nfc_hci_dev *hdev, u8 *gb, size_t gb_len);