|
@@ -261,8 +261,9 @@ static int st21nfca_hci_ready(struct nfc_hci_dev *hdev)
|
|
|
if (r < 0)
|
|
|
return r;
|
|
|
|
|
|
- if (skb->data[0] == 0) {
|
|
|
- kfree_skb(skb);
|
|
|
+ param = skb->data[0];
|
|
|
+ kfree_skb(skb);
|
|
|
+ if (param == 0) {
|
|
|
param = 1;
|
|
|
|
|
|
r = nfc_hci_set_param(hdev, ST21NFCA_DEVICE_MGNT_GATE,
|
|
@@ -404,9 +405,12 @@ static int st21nfca_hci_start_poll(struct nfc_hci_dev *hdev,
|
|
|
r = nfc_hci_set_param(hdev, ST21NFCA_RF_CARD_F_GATE,
|
|
|
ST21NFCA_RF_CARD_F_DATARATE,
|
|
|
param, 1);
|
|
|
- if (r < 0)
|
|
|
+ if (r < 0) {
|
|
|
+ kfree_skb(datarate_skb);
|
|
|
return r;
|
|
|
+ }
|
|
|
}
|
|
|
+ kfree_skb(datarate_skb);
|
|
|
|
|
|
/*
|
|
|
* Configure sens_res
|
|
@@ -660,15 +664,15 @@ static int st21nfca_hci_complete_target_discovered(struct nfc_hci_dev *hdev,
|
|
|
struct nfc_target *target)
|
|
|
{
|
|
|
int r;
|
|
|
- struct sk_buff *nfcid2_skb = NULL, *nfcid1_skb;
|
|
|
+ struct sk_buff *nfcid_skb = NULL;
|
|
|
|
|
|
if (gate == ST21NFCA_RF_READER_F_GATE) {
|
|
|
r = nfc_hci_get_param(hdev, ST21NFCA_RF_READER_F_GATE,
|
|
|
- ST21NFCA_RF_READER_F_NFCID2, &nfcid2_skb);
|
|
|
+ ST21NFCA_RF_READER_F_NFCID2, &nfcid_skb);
|
|
|
if (r < 0)
|
|
|
goto exit;
|
|
|
|
|
|
- if (nfcid2_skb->len > NFC_SENSF_RES_MAXSIZE) {
|
|
|
+ if (nfcid_skb->len > NFC_SENSF_RES_MAXSIZE) {
|
|
|
r = -EPROTO;
|
|
|
goto exit;
|
|
|
}
|
|
@@ -680,11 +684,11 @@ static int st21nfca_hci_complete_target_discovered(struct nfc_hci_dev *hdev,
|
|
|
* - After the reception of SEL_RES with NFCIP-1 compliant bit
|
|
|
* set for type A frame NFCID1 will be updated
|
|
|
*/
|
|
|
- if (nfcid2_skb->len > 0) {
|
|
|
+ if (nfcid_skb->len > 0) {
|
|
|
/* P2P in type F */
|
|
|
- memcpy(target->sensf_res, nfcid2_skb->data,
|
|
|
- nfcid2_skb->len);
|
|
|
- target->sensf_res_len = nfcid2_skb->len;
|
|
|
+ memcpy(target->sensf_res, nfcid_skb->data,
|
|
|
+ nfcid_skb->len);
|
|
|
+ target->sensf_res_len = nfcid_skb->len;
|
|
|
/* NFC Forum Digital Protocol Table 44 */
|
|
|
if (target->sensf_res[0] == 0x01 &&
|
|
|
target->sensf_res[1] == 0xfe)
|
|
@@ -694,27 +698,28 @@ static int st21nfca_hci_complete_target_discovered(struct nfc_hci_dev *hdev,
|
|
|
target->supported_protocols =
|
|
|
NFC_PROTO_FELICA_MASK;
|
|
|
} else {
|
|
|
+ kfree_skb(nfcid_skb);
|
|
|
/* P2P in type A */
|
|
|
r = nfc_hci_get_param(hdev, ST21NFCA_RF_READER_F_GATE,
|
|
|
ST21NFCA_RF_READER_F_NFCID1,
|
|
|
- &nfcid1_skb);
|
|
|
+ &nfcid_skb);
|
|
|
if (r < 0)
|
|
|
goto exit;
|
|
|
|
|
|
- if (nfcid1_skb->len > NFC_NFCID1_MAXSIZE) {
|
|
|
+ if (nfcid_skb->len > NFC_NFCID1_MAXSIZE) {
|
|
|
r = -EPROTO;
|
|
|
goto exit;
|
|
|
}
|
|
|
- memcpy(target->sensf_res, nfcid1_skb->data,
|
|
|
- nfcid1_skb->len);
|
|
|
- target->sensf_res_len = nfcid1_skb->len;
|
|
|
+ memcpy(target->sensf_res, nfcid_skb->data,
|
|
|
+ nfcid_skb->len);
|
|
|
+ target->sensf_res_len = nfcid_skb->len;
|
|
|
target->supported_protocols = NFC_PROTO_NFC_DEP_MASK;
|
|
|
}
|
|
|
target->hci_reader_gate = ST21NFCA_RF_READER_F_GATE;
|
|
|
}
|
|
|
r = 1;
|
|
|
exit:
|
|
|
- kfree_skb(nfcid2_skb);
|
|
|
+ kfree_skb(nfcid_skb);
|
|
|
return r;
|
|
|
}
|
|
|
|