diff --git a/drivers/nfc/pn544/pn544.c b/drivers/nfc/pn544/pn544.c
index 4af70f9c01aac1aeaa01bd6375c6b0023370ad60..9349c548e8dc4e33dfa3f4a56123b44efc35065e 100644
--- a/drivers/nfc/pn544/pn544.c
+++ b/drivers/nfc/pn544/pn544.c
@@ -714,18 +714,23 @@ static int pn544_hci_check_presence(struct nfc_hci_dev *hdev,
 	return 0;
 }
 
+/*
+ * Returns:
+ * <= 0: driver handled the event, skb consumed
+ *    1: driver does not handle the event, please do standard processing
+ */
 static int pn544_hci_event_received(struct nfc_hci_dev *hdev, u8 gate, u8 event,
 				    struct sk_buff *skb)
 {
 	struct sk_buff *rgb_skb = NULL;
-	int r = 0;
+	int r;
 
 	pr_debug("hci event %d", event);
 	switch (event) {
 	case PN544_HCI_EVT_ACTIVATED:
-		if (gate == PN544_RF_READER_NFCIP1_INITIATOR_GATE)
+		if (gate == PN544_RF_READER_NFCIP1_INITIATOR_GATE) {
 			r = nfc_hci_target_discovered(hdev, gate);
-		else if (gate == PN544_RF_READER_NFCIP1_TARGET_GATE) {
+		} else if (gate == PN544_RF_READER_NFCIP1_TARGET_GATE) {
 			r = nfc_hci_get_param(hdev, gate, PN544_DEP_ATR_REQ,
 					      &rgb_skb);
 			if (r < 0)
@@ -736,6 +741,8 @@ static int pn544_hci_event_received(struct nfc_hci_dev *hdev, u8 gate, u8 event,
 					     rgb_skb->len);
 
 			kfree_skb(rgb_skb);
+		} else {
+			r = -EINVAL;
 		}
 		break;
 	case PN544_HCI_EVT_DEACTIVATED:
@@ -757,8 +764,7 @@ static int pn544_hci_event_received(struct nfc_hci_dev *hdev, u8 gate, u8 event,
 		skb_pull(skb, 2);
 		return nfc_tm_data_received(hdev->ndev, skb);
 	default:
-		pr_err("Discarded unknown event %x to gate %x\n", event, gate);
-		break;
+		return 1;
 	}
 
 exit:
diff --git a/net/nfc/hci/core.c b/net/nfc/hci/core.c
index f30f6fe815b4b56a009b1021af28a16ce5810f80..0430f3086e4127c7a637834233627a96c0144926 100644
--- a/net/nfc/hci/core.c
+++ b/net/nfc/hci/core.c
@@ -297,6 +297,12 @@ void nfc_hci_event_received(struct nfc_hci_dev *hdev, u8 pipe, u8 event,
 		goto exit;
 	}
 
+	if (hdev->ops->event_received) {
+		r = hdev->ops->event_received(hdev, gate, event, skb);
+		if (r <= 0)
+			goto exit_noskb;
+	}
+
 	switch (event) {
 	case NFC_HCI_EVT_TARGET_DISCOVERED:
 		if (skb->len < 1) {	/* no status data? */
@@ -322,12 +328,8 @@ void nfc_hci_event_received(struct nfc_hci_dev *hdev, u8 pipe, u8 event,
 		r = nfc_hci_target_discovered(hdev, gate);
 		break;
 	default:
-		if (hdev->ops->event_received) {
-			r = hdev->ops->event_received(hdev, gate, event, skb);
-			goto exit_noskb;
-		} else {
-			r = -EINVAL;
-		}
+		pr_info("Discarded unknown event %x to gate %x\n", event, gate);
+		r = -EINVAL;
 		break;
 	}