Skip to content

Commit

Permalink
NFC: Add HCI quirks to support driver (non)standard implementations
Browse files Browse the repository at this point in the history
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: Eric Lapuyade <eric.lapuyade@intel.com>
Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
  • Loading branch information
Eric Lapuyade authored and Samuel Ortiz committed Jan 9, 2013
1 parent 924d4a0 commit bf71ab8
Show file tree
Hide file tree
Showing 4 changed files with 23 additions and 2 deletions.
2 changes: 1 addition & 1 deletion drivers/nfc/pn544/pn544.c
Original file line number Diff line number Diff line change
Expand Up @@ -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_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,
phy_headroom + PN544_CMDS_HEADROOM,
phy_tailroom, phy_payload);
Expand Down
13 changes: 13 additions & 0 deletions include/net/nfc/hci.h
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,16 @@ typedef int (*xmit) (struct sk_buff *skb, void *cb_data);

#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_dev *ndev;

Expand Down Expand Up @@ -131,11 +141,14 @@ struct nfc_hci_dev {

u8 *gb;
size_t gb_len;

unsigned long quirks;
};

/* hci device allocation */
struct nfc_hci_dev *nfc_hci_allocate_device(struct nfc_hci_ops *ops,
struct nfc_hci_init_data *init_data,
unsigned long quirks,
u32 protocols,
const char *llc_name,
int tx_headroom,
Expand Down
7 changes: 6 additions & 1 deletion net/nfc/hci/command.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
u8 param[2];
size_t param_len = 2;

/* TODO: Find out what the identity reference data is
* and fill param with it. HCI spec 6.1.3.5 */

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,
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)
Expand Down
3 changes: 3 additions & 0 deletions net/nfc/hci/core.c
Original file line number Diff line number Diff line change
Expand Up @@ -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_init_data *init_data,
unsigned long quirks,
u32 protocols,
const char *llc_name,
int tx_headroom,
Expand Down Expand Up @@ -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));

hdev->quirks = quirks;

return hdev;
}
EXPORT_SYMBOL(nfc_hci_allocate_device);
Expand Down

0 comments on commit bf71ab8

Please sign in to comment.