Commit bf71ab8b authored by Eric Lapuyade's avatar Eric Lapuyade Committed by Samuel Ortiz

NFC: Add HCI quirks to support driver (non)standard implementations

Some chips diverge from the HCI spec in their implementation of standard
features. This adds a new quirks parameter to
nfc_hci_allocate_device() to let the driver indicate its divergence.
Signed-off-by: default avatarEric Lapuyade <eric.lapuyade@intel.com>
Signed-off-by: default avatarSamuel Ortiz <sameo@linux.intel.com>
parent 924d4a02
...@@ -833,7 +833,7 @@ int pn544_hci_probe(void *phy_id, struct nfc_phy_ops *phy_ops, char *llc_name, ...@@ -833,7 +833,7 @@ int pn544_hci_probe(void *phy_id, struct nfc_phy_ops *phy_ops, char *llc_name,
NFC_PROTO_ISO14443_B_MASK | NFC_PROTO_ISO14443_B_MASK |
NFC_PROTO_NFC_DEP_MASK; NFC_PROTO_NFC_DEP_MASK;
info->hdev = nfc_hci_allocate_device(&pn544_hci_ops, &init_data, info->hdev = nfc_hci_allocate_device(&pn544_hci_ops, &init_data, 0,
protocols, llc_name, protocols, llc_name,
phy_headroom + PN544_CMDS_HEADROOM, phy_headroom + PN544_CMDS_HEADROOM,
phy_tailroom, phy_payload); phy_tailroom, phy_payload);
......
...@@ -82,6 +82,16 @@ typedef int (*xmit) (struct sk_buff *skb, void *cb_data); ...@@ -82,6 +82,16 @@ typedef int (*xmit) (struct sk_buff *skb, void *cb_data);
#define NFC_HCI_MAX_GATES 256 #define NFC_HCI_MAX_GATES 256
/*
* These values can be specified by a driver to indicate it requires some
* adaptation of the HCI standard.
*
* NFC_HCI_QUIRK_SHORT_CLEAR - send HCI_ADM_CLEAR_ALL_PIPE cmd with no params
*/
enum {
NFC_HCI_QUIRK_SHORT_CLEAR = 0,
};
struct nfc_hci_dev { struct nfc_hci_dev {
struct nfc_dev *ndev; struct nfc_dev *ndev;
...@@ -131,11 +141,14 @@ struct nfc_hci_dev { ...@@ -131,11 +141,14 @@ struct nfc_hci_dev {
u8 *gb; u8 *gb;
size_t gb_len; size_t gb_len;
unsigned long quirks;
}; };
/* hci device allocation */ /* hci device allocation */
struct nfc_hci_dev *nfc_hci_allocate_device(struct nfc_hci_ops *ops, struct nfc_hci_dev *nfc_hci_allocate_device(struct nfc_hci_ops *ops,
struct nfc_hci_init_data *init_data, struct nfc_hci_init_data *init_data,
unsigned long quirks,
u32 protocols, u32 protocols,
const char *llc_name, const char *llc_name,
int tx_headroom, int tx_headroom,
......
...@@ -280,14 +280,19 @@ static int nfc_hci_delete_pipe(struct nfc_hci_dev *hdev, u8 pipe) ...@@ -280,14 +280,19 @@ static int nfc_hci_delete_pipe(struct nfc_hci_dev *hdev, u8 pipe)
static int nfc_hci_clear_all_pipes(struct nfc_hci_dev *hdev) static int nfc_hci_clear_all_pipes(struct nfc_hci_dev *hdev)
{ {
u8 param[2]; u8 param[2];
size_t param_len = 2;
/* TODO: Find out what the identity reference data is /* TODO: Find out what the identity reference data is
* and fill param with it. HCI spec 6.1.3.5 */ * and fill param with it. HCI spec 6.1.3.5 */
pr_debug("\n"); pr_debug("\n");
if (test_bit(NFC_HCI_QUIRK_SHORT_CLEAR, &hdev->quirks))
param_len = 0;
return nfc_hci_execute_cmd(hdev, NFC_HCI_ADMIN_PIPE, return nfc_hci_execute_cmd(hdev, NFC_HCI_ADMIN_PIPE,
NFC_HCI_ADM_CLEAR_ALL_PIPE, param, 2, NULL); NFC_HCI_ADM_CLEAR_ALL_PIPE, param, param_len,
NULL);
} }
int nfc_hci_disconnect_gate(struct nfc_hci_dev *hdev, u8 gate) int nfc_hci_disconnect_gate(struct nfc_hci_dev *hdev, u8 gate)
......
...@@ -795,6 +795,7 @@ static struct nfc_ops hci_nfc_ops = { ...@@ -795,6 +795,7 @@ static struct nfc_ops hci_nfc_ops = {
struct nfc_hci_dev *nfc_hci_allocate_device(struct nfc_hci_ops *ops, struct nfc_hci_dev *nfc_hci_allocate_device(struct nfc_hci_ops *ops,
struct nfc_hci_init_data *init_data, struct nfc_hci_init_data *init_data,
unsigned long quirks,
u32 protocols, u32 protocols,
const char *llc_name, const char *llc_name,
int tx_headroom, int tx_headroom,
...@@ -838,6 +839,8 @@ struct nfc_hci_dev *nfc_hci_allocate_device(struct nfc_hci_ops *ops, ...@@ -838,6 +839,8 @@ struct nfc_hci_dev *nfc_hci_allocate_device(struct nfc_hci_ops *ops,
memset(hdev->gate2pipe, NFC_HCI_INVALID_PIPE, sizeof(hdev->gate2pipe)); memset(hdev->gate2pipe, NFC_HCI_INVALID_PIPE, sizeof(hdev->gate2pipe));
hdev->quirks = quirks;
return hdev; return hdev;
} }
EXPORT_SYMBOL(nfc_hci_allocate_device); EXPORT_SYMBOL(nfc_hci_allocate_device);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment