aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSamuel Ortiz <sameo@linux.intel.com>2013-05-27 09:29:11 -0400
committerSamuel Ortiz <sameo@linux.intel.com>2013-06-14 07:44:18 -0400
commit322bce957e9b0e30ef7147dae0414ad8f3f558c8 (patch)
tree83791eb96720eb16127f7820202935268a09db36
parent31c44464acb8152db5745da700be58ac95ba0a83 (diff)
NFC: pn533: Copy NFCID2 through ATR_REQ
When using NFC-F we should copy the NFCID2 buffer that we got from SENSF_RES through the ATR_REQ NFCID3 buffer. Not doing so violates NFC Forum digital requirement #189. Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
-rw-r--r--drivers/nfc/pn533.c14
-rw-r--r--include/net/nfc/nfc.h2
-rw-r--r--include/uapi/linux/nfc.h2
3 files changed, 17 insertions, 1 deletions
diff --git a/drivers/nfc/pn533.c b/drivers/nfc/pn533.c
index 6bd4f598b3e1..e196bdfcfc30 100644
--- a/drivers/nfc/pn533.c
+++ b/drivers/nfc/pn533.c
@@ -1235,7 +1235,7 @@ static int pn533_target_found_type_a(struct nfc_target *nfc_tgt, u8 *tgt_data,
1235struct pn533_target_felica { 1235struct pn533_target_felica {
1236 u8 pol_res; 1236 u8 pol_res;
1237 u8 opcode; 1237 u8 opcode;
1238 u8 nfcid2[8]; 1238 u8 nfcid2[NFC_NFCID2_MAXSIZE];
1239 u8 pad[8]; 1239 u8 pad[8];
1240 /* optional */ 1240 /* optional */
1241 u8 syst_code[]; 1241 u8 syst_code[];
@@ -1275,6 +1275,9 @@ static int pn533_target_found_felica(struct nfc_target *nfc_tgt, u8 *tgt_data,
1275 memcpy(nfc_tgt->sensf_res, &tgt_felica->opcode, 9); 1275 memcpy(nfc_tgt->sensf_res, &tgt_felica->opcode, 9);
1276 nfc_tgt->sensf_res_len = 9; 1276 nfc_tgt->sensf_res_len = 9;
1277 1277
1278 memcpy(nfc_tgt->nfcid2, tgt_felica->nfcid2, NFC_NFCID2_MAXSIZE);
1279 nfc_tgt->nfcid2_len = NFC_NFCID2_MAXSIZE;
1280
1278 return 0; 1281 return 0;
1279} 1282}
1280 1283
@@ -2084,6 +2087,9 @@ static int pn533_dep_link_up(struct nfc_dev *nfc_dev, struct nfc_target *target,
2084 if (comm_mode == NFC_COMM_PASSIVE) 2087 if (comm_mode == NFC_COMM_PASSIVE)
2085 skb_len += PASSIVE_DATA_LEN; 2088 skb_len += PASSIVE_DATA_LEN;
2086 2089
2090 if (target && target->nfcid2_len)
2091 skb_len += NFC_NFCID3_MAXSIZE;
2092
2087 skb = pn533_alloc_skb(dev, skb_len); 2093 skb = pn533_alloc_skb(dev, skb_len);
2088 if (!skb) 2094 if (!skb)
2089 return -ENOMEM; 2095 return -ENOMEM;
@@ -2100,6 +2106,12 @@ static int pn533_dep_link_up(struct nfc_dev *nfc_dev, struct nfc_target *target,
2100 *next |= 1; 2106 *next |= 1;
2101 } 2107 }
2102 2108
2109 if (target && target->nfcid2_len) {
2110 memcpy(skb_put(skb, NFC_NFCID3_MAXSIZE), target->nfcid2,
2111 target->nfcid2_len);
2112 *next |= 2;
2113 }
2114
2103 if (gb != NULL && gb_len > 0) { 2115 if (gb != NULL && gb_len > 0) {
2104 memcpy(skb_put(skb, gb_len), gb, gb_len); 2116 memcpy(skb_put(skb, gb_len), gb, gb_len);
2105 *next |= 4; /* We have some Gi */ 2117 *next |= 4; /* We have some Gi */
diff --git a/include/net/nfc/nfc.h b/include/net/nfc/nfc.h
index 3563dbdcaaf2..8fc1784a264d 100644
--- a/include/net/nfc/nfc.h
+++ b/include/net/nfc/nfc.h
@@ -84,6 +84,8 @@ struct nfc_target {
84 u8 sel_res; 84 u8 sel_res;
85 u8 nfcid1_len; 85 u8 nfcid1_len;
86 u8 nfcid1[NFC_NFCID1_MAXSIZE]; 86 u8 nfcid1[NFC_NFCID1_MAXSIZE];
87 u8 nfcid2_len;
88 u8 nfcid2[NFC_NFCID2_MAXSIZE];
87 u8 sensb_res_len; 89 u8 sensb_res_len;
88 u8 sensb_res[NFC_SENSB_RES_MAXSIZE]; 90 u8 sensb_res[NFC_SENSB_RES_MAXSIZE];
89 u8 sensf_res_len; 91 u8 sensf_res_len;
diff --git a/include/uapi/linux/nfc.h b/include/uapi/linux/nfc.h
index b6cbd164f146..fb304fb774cc 100644
--- a/include/uapi/linux/nfc.h
+++ b/include/uapi/linux/nfc.h
@@ -164,6 +164,8 @@ enum nfc_sdp_attr {
164 164
165#define NFC_DEVICE_NAME_MAXSIZE 8 165#define NFC_DEVICE_NAME_MAXSIZE 8
166#define NFC_NFCID1_MAXSIZE 10 166#define NFC_NFCID1_MAXSIZE 10
167#define NFC_NFCID2_MAXSIZE 8
168#define NFC_NFCID3_MAXSIZE 10
167#define NFC_SENSB_RES_MAXSIZE 12 169#define NFC_SENSB_RES_MAXSIZE 12
168#define NFC_SENSF_RES_MAXSIZE 18 170#define NFC_SENSF_RES_MAXSIZE 18
169#define NFC_GB_MAXSIZE 48 171#define NFC_GB_MAXSIZE 48