|
@@ -1218,33 +1218,48 @@ exit:
|
|
|
dev_kfree_skb(resp);
|
|
|
}
|
|
|
|
|
|
-int digital_tg_listen_nfca(struct nfc_digital_dev *ddev, u8 rf_tech)
|
|
|
+static int digital_tg_config_nfca(struct nfc_digital_dev *ddev)
|
|
|
{
|
|
|
int rc;
|
|
|
|
|
|
- rc = digital_tg_configure_hw(ddev, NFC_DIGITAL_CONFIG_RF_TECH, rf_tech);
|
|
|
+ rc = digital_tg_configure_hw(ddev, NFC_DIGITAL_CONFIG_RF_TECH,
|
|
|
+ NFC_DIGITAL_RF_TECH_106A);
|
|
|
if (rc)
|
|
|
return rc;
|
|
|
|
|
|
- rc = digital_tg_configure_hw(ddev, NFC_DIGITAL_CONFIG_FRAMING,
|
|
|
- NFC_DIGITAL_FRAMING_NFCA_NFC_DEP);
|
|
|
+ return digital_tg_configure_hw(ddev, NFC_DIGITAL_CONFIG_FRAMING,
|
|
|
+ NFC_DIGITAL_FRAMING_NFCA_NFC_DEP);
|
|
|
+}
|
|
|
+
|
|
|
+int digital_tg_listen_nfca(struct nfc_digital_dev *ddev, u8 rf_tech)
|
|
|
+{
|
|
|
+ int rc;
|
|
|
+
|
|
|
+ rc = digital_tg_config_nfca(ddev);
|
|
|
if (rc)
|
|
|
return rc;
|
|
|
|
|
|
return digital_tg_listen(ddev, 300, digital_tg_recv_sens_req, NULL);
|
|
|
}
|
|
|
|
|
|
-int digital_tg_listen_nfcf(struct nfc_digital_dev *ddev, u8 rf_tech)
|
|
|
+static int digital_tg_config_nfcf(struct nfc_digital_dev *ddev, u8 rf_tech)
|
|
|
{
|
|
|
int rc;
|
|
|
- u8 *nfcid2;
|
|
|
|
|
|
rc = digital_tg_configure_hw(ddev, NFC_DIGITAL_CONFIG_RF_TECH, rf_tech);
|
|
|
if (rc)
|
|
|
return rc;
|
|
|
|
|
|
- rc = digital_tg_configure_hw(ddev, NFC_DIGITAL_CONFIG_FRAMING,
|
|
|
- NFC_DIGITAL_FRAMING_NFCF_NFC_DEP);
|
|
|
+ return digital_tg_configure_hw(ddev, NFC_DIGITAL_CONFIG_FRAMING,
|
|
|
+ NFC_DIGITAL_FRAMING_NFCF_NFC_DEP);
|
|
|
+}
|
|
|
+
|
|
|
+int digital_tg_listen_nfcf(struct nfc_digital_dev *ddev, u8 rf_tech)
|
|
|
+{
|
|
|
+ int rc;
|
|
|
+ u8 *nfcid2;
|
|
|
+
|
|
|
+ rc = digital_tg_config_nfcf(ddev, rf_tech);
|
|
|
if (rc)
|
|
|
return rc;
|
|
|
|
|
@@ -1258,3 +1273,43 @@ int digital_tg_listen_nfcf(struct nfc_digital_dev *ddev, u8 rf_tech)
|
|
|
|
|
|
return digital_tg_listen(ddev, 300, digital_tg_recv_sensf_req, nfcid2);
|
|
|
}
|
|
|
+
|
|
|
+void digital_tg_recv_md_req(struct nfc_digital_dev *ddev, void *arg,
|
|
|
+ struct sk_buff *resp)
|
|
|
+{
|
|
|
+ u8 rf_tech;
|
|
|
+ int rc;
|
|
|
+
|
|
|
+ if (IS_ERR(resp)) {
|
|
|
+ resp = NULL;
|
|
|
+ goto exit_free_skb;
|
|
|
+ }
|
|
|
+
|
|
|
+ rc = ddev->ops->tg_get_rf_tech(ddev, &rf_tech);
|
|
|
+ if (rc)
|
|
|
+ goto exit_free_skb;
|
|
|
+
|
|
|
+ switch (rf_tech) {
|
|
|
+ case NFC_DIGITAL_RF_TECH_106A:
|
|
|
+ rc = digital_tg_config_nfca(ddev);
|
|
|
+ if (rc)
|
|
|
+ goto exit_free_skb;
|
|
|
+ digital_tg_recv_sens_req(ddev, arg, resp);
|
|
|
+ break;
|
|
|
+ case NFC_DIGITAL_RF_TECH_212F:
|
|
|
+ case NFC_DIGITAL_RF_TECH_424F:
|
|
|
+ rc = digital_tg_config_nfcf(ddev, rf_tech);
|
|
|
+ if (rc)
|
|
|
+ goto exit_free_skb;
|
|
|
+ digital_tg_recv_sensf_req(ddev, arg, resp);
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ goto exit_free_skb;
|
|
|
+ }
|
|
|
+
|
|
|
+ return;
|
|
|
+
|
|
|
+exit_free_skb:
|
|
|
+ digital_poll_next_tech(ddev);
|
|
|
+ dev_kfree_skb(resp);
|
|
|
+}
|