1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-or-later
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun * Driver for NXP PN533 NFC Chip - USB transport layer
4*4882a593Smuzhiyun *
5*4882a593Smuzhiyun * Copyright (C) 2011 Instituto Nokia de Tecnologia
6*4882a593Smuzhiyun * Copyright (C) 2012-2013 Tieto Poland
7*4882a593Smuzhiyun */
8*4882a593Smuzhiyun
9*4882a593Smuzhiyun #include <linux/device.h>
10*4882a593Smuzhiyun #include <linux/kernel.h>
11*4882a593Smuzhiyun #include <linux/module.h>
12*4882a593Smuzhiyun #include <linux/slab.h>
13*4882a593Smuzhiyun #include <linux/usb.h>
14*4882a593Smuzhiyun #include <linux/nfc.h>
15*4882a593Smuzhiyun #include <linux/netdevice.h>
16*4882a593Smuzhiyun #include <net/nfc/nfc.h>
17*4882a593Smuzhiyun #include "pn533.h"
18*4882a593Smuzhiyun
19*4882a593Smuzhiyun #define VERSION "0.1"
20*4882a593Smuzhiyun
21*4882a593Smuzhiyun #define PN533_VENDOR_ID 0x4CC
22*4882a593Smuzhiyun #define PN533_PRODUCT_ID 0x2533
23*4882a593Smuzhiyun
24*4882a593Smuzhiyun #define SCM_VENDOR_ID 0x4E6
25*4882a593Smuzhiyun #define SCL3711_PRODUCT_ID 0x5591
26*4882a593Smuzhiyun
27*4882a593Smuzhiyun #define SONY_VENDOR_ID 0x054c
28*4882a593Smuzhiyun #define PASORI_PRODUCT_ID 0x02e1
29*4882a593Smuzhiyun
30*4882a593Smuzhiyun #define ACS_VENDOR_ID 0x072f
31*4882a593Smuzhiyun #define ACR122U_PRODUCT_ID 0x2200
32*4882a593Smuzhiyun
33*4882a593Smuzhiyun static const struct usb_device_id pn533_usb_table[] = {
34*4882a593Smuzhiyun { USB_DEVICE(PN533_VENDOR_ID, PN533_PRODUCT_ID),
35*4882a593Smuzhiyun .driver_info = PN533_DEVICE_STD },
36*4882a593Smuzhiyun { USB_DEVICE(SCM_VENDOR_ID, SCL3711_PRODUCT_ID),
37*4882a593Smuzhiyun .driver_info = PN533_DEVICE_STD },
38*4882a593Smuzhiyun { USB_DEVICE(SONY_VENDOR_ID, PASORI_PRODUCT_ID),
39*4882a593Smuzhiyun .driver_info = PN533_DEVICE_PASORI },
40*4882a593Smuzhiyun { USB_DEVICE(ACS_VENDOR_ID, ACR122U_PRODUCT_ID),
41*4882a593Smuzhiyun .driver_info = PN533_DEVICE_ACR122U },
42*4882a593Smuzhiyun { }
43*4882a593Smuzhiyun };
44*4882a593Smuzhiyun MODULE_DEVICE_TABLE(usb, pn533_usb_table);
45*4882a593Smuzhiyun
46*4882a593Smuzhiyun struct pn533_usb_phy {
47*4882a593Smuzhiyun struct usb_device *udev;
48*4882a593Smuzhiyun struct usb_interface *interface;
49*4882a593Smuzhiyun
50*4882a593Smuzhiyun struct urb *out_urb;
51*4882a593Smuzhiyun struct urb *in_urb;
52*4882a593Smuzhiyun
53*4882a593Smuzhiyun struct urb *ack_urb;
54*4882a593Smuzhiyun u8 *ack_buffer;
55*4882a593Smuzhiyun
56*4882a593Smuzhiyun struct pn533 *priv;
57*4882a593Smuzhiyun };
58*4882a593Smuzhiyun
pn533_recv_response(struct urb * urb)59*4882a593Smuzhiyun static void pn533_recv_response(struct urb *urb)
60*4882a593Smuzhiyun {
61*4882a593Smuzhiyun struct pn533_usb_phy *phy = urb->context;
62*4882a593Smuzhiyun struct sk_buff *skb = NULL;
63*4882a593Smuzhiyun
64*4882a593Smuzhiyun if (!urb->status) {
65*4882a593Smuzhiyun skb = alloc_skb(urb->actual_length, GFP_ATOMIC);
66*4882a593Smuzhiyun if (!skb) {
67*4882a593Smuzhiyun nfc_err(&phy->udev->dev, "failed to alloc memory\n");
68*4882a593Smuzhiyun } else {
69*4882a593Smuzhiyun skb_put_data(skb, urb->transfer_buffer,
70*4882a593Smuzhiyun urb->actual_length);
71*4882a593Smuzhiyun }
72*4882a593Smuzhiyun }
73*4882a593Smuzhiyun
74*4882a593Smuzhiyun pn533_recv_frame(phy->priv, skb, urb->status);
75*4882a593Smuzhiyun }
76*4882a593Smuzhiyun
pn533_submit_urb_for_response(struct pn533_usb_phy * phy,gfp_t flags)77*4882a593Smuzhiyun static int pn533_submit_urb_for_response(struct pn533_usb_phy *phy, gfp_t flags)
78*4882a593Smuzhiyun {
79*4882a593Smuzhiyun phy->in_urb->complete = pn533_recv_response;
80*4882a593Smuzhiyun
81*4882a593Smuzhiyun return usb_submit_urb(phy->in_urb, flags);
82*4882a593Smuzhiyun }
83*4882a593Smuzhiyun
pn533_recv_ack(struct urb * urb)84*4882a593Smuzhiyun static void pn533_recv_ack(struct urb *urb)
85*4882a593Smuzhiyun {
86*4882a593Smuzhiyun struct pn533_usb_phy *phy = urb->context;
87*4882a593Smuzhiyun struct pn533 *priv = phy->priv;
88*4882a593Smuzhiyun struct pn533_cmd *cmd = priv->cmd;
89*4882a593Smuzhiyun struct pn533_std_frame *in_frame;
90*4882a593Smuzhiyun int rc;
91*4882a593Smuzhiyun
92*4882a593Smuzhiyun cmd->status = urb->status;
93*4882a593Smuzhiyun
94*4882a593Smuzhiyun switch (urb->status) {
95*4882a593Smuzhiyun case 0:
96*4882a593Smuzhiyun break; /* success */
97*4882a593Smuzhiyun case -ECONNRESET:
98*4882a593Smuzhiyun case -ENOENT:
99*4882a593Smuzhiyun dev_dbg(&phy->udev->dev,
100*4882a593Smuzhiyun "The urb has been stopped (status %d)\n",
101*4882a593Smuzhiyun urb->status);
102*4882a593Smuzhiyun goto sched_wq;
103*4882a593Smuzhiyun case -ESHUTDOWN:
104*4882a593Smuzhiyun default:
105*4882a593Smuzhiyun nfc_err(&phy->udev->dev,
106*4882a593Smuzhiyun "Urb failure (status %d)\n", urb->status);
107*4882a593Smuzhiyun goto sched_wq;
108*4882a593Smuzhiyun }
109*4882a593Smuzhiyun
110*4882a593Smuzhiyun in_frame = phy->in_urb->transfer_buffer;
111*4882a593Smuzhiyun
112*4882a593Smuzhiyun if (!pn533_rx_frame_is_ack(in_frame)) {
113*4882a593Smuzhiyun nfc_err(&phy->udev->dev, "Received an invalid ack\n");
114*4882a593Smuzhiyun cmd->status = -EIO;
115*4882a593Smuzhiyun goto sched_wq;
116*4882a593Smuzhiyun }
117*4882a593Smuzhiyun
118*4882a593Smuzhiyun rc = pn533_submit_urb_for_response(phy, GFP_ATOMIC);
119*4882a593Smuzhiyun if (rc) {
120*4882a593Smuzhiyun nfc_err(&phy->udev->dev,
121*4882a593Smuzhiyun "usb_submit_urb failed with result %d\n", rc);
122*4882a593Smuzhiyun cmd->status = rc;
123*4882a593Smuzhiyun goto sched_wq;
124*4882a593Smuzhiyun }
125*4882a593Smuzhiyun
126*4882a593Smuzhiyun return;
127*4882a593Smuzhiyun
128*4882a593Smuzhiyun sched_wq:
129*4882a593Smuzhiyun queue_work(priv->wq, &priv->cmd_complete_work);
130*4882a593Smuzhiyun }
131*4882a593Smuzhiyun
pn533_submit_urb_for_ack(struct pn533_usb_phy * phy,gfp_t flags)132*4882a593Smuzhiyun static int pn533_submit_urb_for_ack(struct pn533_usb_phy *phy, gfp_t flags)
133*4882a593Smuzhiyun {
134*4882a593Smuzhiyun phy->in_urb->complete = pn533_recv_ack;
135*4882a593Smuzhiyun
136*4882a593Smuzhiyun return usb_submit_urb(phy->in_urb, flags);
137*4882a593Smuzhiyun }
138*4882a593Smuzhiyun
pn533_usb_send_ack(struct pn533 * dev,gfp_t flags)139*4882a593Smuzhiyun static int pn533_usb_send_ack(struct pn533 *dev, gfp_t flags)
140*4882a593Smuzhiyun {
141*4882a593Smuzhiyun struct pn533_usb_phy *phy = dev->phy;
142*4882a593Smuzhiyun static const u8 ack[6] = {0x00, 0x00, 0xff, 0x00, 0xff, 0x00};
143*4882a593Smuzhiyun /* spec 7.1.1.3: Preamble, SoPC (2), ACK Code (2), Postamble */
144*4882a593Smuzhiyun
145*4882a593Smuzhiyun if (!phy->ack_buffer) {
146*4882a593Smuzhiyun phy->ack_buffer = kmemdup(ack, sizeof(ack), flags);
147*4882a593Smuzhiyun if (!phy->ack_buffer)
148*4882a593Smuzhiyun return -ENOMEM;
149*4882a593Smuzhiyun }
150*4882a593Smuzhiyun
151*4882a593Smuzhiyun phy->ack_urb->transfer_buffer = phy->ack_buffer;
152*4882a593Smuzhiyun phy->ack_urb->transfer_buffer_length = sizeof(ack);
153*4882a593Smuzhiyun return usb_submit_urb(phy->ack_urb, flags);
154*4882a593Smuzhiyun }
155*4882a593Smuzhiyun
pn533_usb_send_frame(struct pn533 * dev,struct sk_buff * out)156*4882a593Smuzhiyun static int pn533_usb_send_frame(struct pn533 *dev,
157*4882a593Smuzhiyun struct sk_buff *out)
158*4882a593Smuzhiyun {
159*4882a593Smuzhiyun struct pn533_usb_phy *phy = dev->phy;
160*4882a593Smuzhiyun int rc;
161*4882a593Smuzhiyun
162*4882a593Smuzhiyun if (phy->priv == NULL)
163*4882a593Smuzhiyun phy->priv = dev;
164*4882a593Smuzhiyun
165*4882a593Smuzhiyun phy->out_urb->transfer_buffer = out->data;
166*4882a593Smuzhiyun phy->out_urb->transfer_buffer_length = out->len;
167*4882a593Smuzhiyun
168*4882a593Smuzhiyun print_hex_dump_debug("PN533 TX: ", DUMP_PREFIX_NONE, 16, 1,
169*4882a593Smuzhiyun out->data, out->len, false);
170*4882a593Smuzhiyun
171*4882a593Smuzhiyun rc = usb_submit_urb(phy->out_urb, GFP_KERNEL);
172*4882a593Smuzhiyun if (rc)
173*4882a593Smuzhiyun return rc;
174*4882a593Smuzhiyun
175*4882a593Smuzhiyun if (dev->protocol_type == PN533_PROTO_REQ_RESP) {
176*4882a593Smuzhiyun /* request for response for sent packet directly */
177*4882a593Smuzhiyun rc = pn533_submit_urb_for_response(phy, GFP_KERNEL);
178*4882a593Smuzhiyun if (rc)
179*4882a593Smuzhiyun goto error;
180*4882a593Smuzhiyun } else if (dev->protocol_type == PN533_PROTO_REQ_ACK_RESP) {
181*4882a593Smuzhiyun /* request for ACK if that's the case */
182*4882a593Smuzhiyun rc = pn533_submit_urb_for_ack(phy, GFP_KERNEL);
183*4882a593Smuzhiyun if (rc)
184*4882a593Smuzhiyun goto error;
185*4882a593Smuzhiyun }
186*4882a593Smuzhiyun
187*4882a593Smuzhiyun return 0;
188*4882a593Smuzhiyun
189*4882a593Smuzhiyun error:
190*4882a593Smuzhiyun usb_unlink_urb(phy->out_urb);
191*4882a593Smuzhiyun return rc;
192*4882a593Smuzhiyun }
193*4882a593Smuzhiyun
pn533_usb_abort_cmd(struct pn533 * dev,gfp_t flags)194*4882a593Smuzhiyun static void pn533_usb_abort_cmd(struct pn533 *dev, gfp_t flags)
195*4882a593Smuzhiyun {
196*4882a593Smuzhiyun struct pn533_usb_phy *phy = dev->phy;
197*4882a593Smuzhiyun
198*4882a593Smuzhiyun /* ACR122U does not support any command which aborts last
199*4882a593Smuzhiyun * issued command i.e. as ACK for standard PN533. Additionally,
200*4882a593Smuzhiyun * it behaves stange, sending broken or incorrect responses,
201*4882a593Smuzhiyun * when we cancel urb before the chip will send response.
202*4882a593Smuzhiyun */
203*4882a593Smuzhiyun if (dev->device_type == PN533_DEVICE_ACR122U)
204*4882a593Smuzhiyun return;
205*4882a593Smuzhiyun
206*4882a593Smuzhiyun /* An ack will cancel the last issued command */
207*4882a593Smuzhiyun pn533_usb_send_ack(dev, flags);
208*4882a593Smuzhiyun
209*4882a593Smuzhiyun /* cancel the urb request */
210*4882a593Smuzhiyun usb_kill_urb(phy->in_urb);
211*4882a593Smuzhiyun }
212*4882a593Smuzhiyun
213*4882a593Smuzhiyun /* ACR122 specific structs and functions */
214*4882a593Smuzhiyun
215*4882a593Smuzhiyun /* ACS ACR122 pn533 frame definitions */
216*4882a593Smuzhiyun #define PN533_ACR122_TX_FRAME_HEADER_LEN (sizeof(struct pn533_acr122_tx_frame) \
217*4882a593Smuzhiyun + 2)
218*4882a593Smuzhiyun #define PN533_ACR122_TX_FRAME_TAIL_LEN 0
219*4882a593Smuzhiyun #define PN533_ACR122_RX_FRAME_HEADER_LEN (sizeof(struct pn533_acr122_rx_frame) \
220*4882a593Smuzhiyun + 2)
221*4882a593Smuzhiyun #define PN533_ACR122_RX_FRAME_TAIL_LEN 2
222*4882a593Smuzhiyun #define PN533_ACR122_FRAME_MAX_PAYLOAD_LEN PN533_STD_FRAME_MAX_PAYLOAD_LEN
223*4882a593Smuzhiyun
224*4882a593Smuzhiyun /* CCID messages types */
225*4882a593Smuzhiyun #define PN533_ACR122_PC_TO_RDR_ICCPOWERON 0x62
226*4882a593Smuzhiyun #define PN533_ACR122_PC_TO_RDR_ESCAPE 0x6B
227*4882a593Smuzhiyun
228*4882a593Smuzhiyun #define PN533_ACR122_RDR_TO_PC_ESCAPE 0x83
229*4882a593Smuzhiyun
230*4882a593Smuzhiyun
231*4882a593Smuzhiyun struct pn533_acr122_ccid_hdr {
232*4882a593Smuzhiyun u8 type;
233*4882a593Smuzhiyun u32 datalen;
234*4882a593Smuzhiyun u8 slot;
235*4882a593Smuzhiyun u8 seq;
236*4882a593Smuzhiyun
237*4882a593Smuzhiyun /*
238*4882a593Smuzhiyun * 3 msg specific bytes or status, error and 1 specific
239*4882a593Smuzhiyun * byte for reposnse msg
240*4882a593Smuzhiyun */
241*4882a593Smuzhiyun u8 params[3];
242*4882a593Smuzhiyun u8 data[]; /* payload */
243*4882a593Smuzhiyun } __packed;
244*4882a593Smuzhiyun
245*4882a593Smuzhiyun struct pn533_acr122_apdu_hdr {
246*4882a593Smuzhiyun u8 class;
247*4882a593Smuzhiyun u8 ins;
248*4882a593Smuzhiyun u8 p1;
249*4882a593Smuzhiyun u8 p2;
250*4882a593Smuzhiyun } __packed;
251*4882a593Smuzhiyun
252*4882a593Smuzhiyun struct pn533_acr122_tx_frame {
253*4882a593Smuzhiyun struct pn533_acr122_ccid_hdr ccid;
254*4882a593Smuzhiyun struct pn533_acr122_apdu_hdr apdu;
255*4882a593Smuzhiyun u8 datalen;
256*4882a593Smuzhiyun u8 data[]; /* pn533 frame: TFI ... */
257*4882a593Smuzhiyun } __packed;
258*4882a593Smuzhiyun
259*4882a593Smuzhiyun struct pn533_acr122_rx_frame {
260*4882a593Smuzhiyun struct pn533_acr122_ccid_hdr ccid;
261*4882a593Smuzhiyun u8 data[]; /* pn533 frame : TFI ... */
262*4882a593Smuzhiyun } __packed;
263*4882a593Smuzhiyun
pn533_acr122_tx_frame_init(void * _frame,u8 cmd_code)264*4882a593Smuzhiyun static void pn533_acr122_tx_frame_init(void *_frame, u8 cmd_code)
265*4882a593Smuzhiyun {
266*4882a593Smuzhiyun struct pn533_acr122_tx_frame *frame = _frame;
267*4882a593Smuzhiyun
268*4882a593Smuzhiyun frame->ccid.type = PN533_ACR122_PC_TO_RDR_ESCAPE;
269*4882a593Smuzhiyun /* sizeof(apdu_hdr) + sizeof(datalen) */
270*4882a593Smuzhiyun frame->ccid.datalen = sizeof(frame->apdu) + 1;
271*4882a593Smuzhiyun frame->ccid.slot = 0;
272*4882a593Smuzhiyun frame->ccid.seq = 0;
273*4882a593Smuzhiyun frame->ccid.params[0] = 0;
274*4882a593Smuzhiyun frame->ccid.params[1] = 0;
275*4882a593Smuzhiyun frame->ccid.params[2] = 0;
276*4882a593Smuzhiyun
277*4882a593Smuzhiyun frame->data[0] = PN533_STD_FRAME_DIR_OUT;
278*4882a593Smuzhiyun frame->data[1] = cmd_code;
279*4882a593Smuzhiyun frame->datalen = 2; /* data[0] + data[1] */
280*4882a593Smuzhiyun
281*4882a593Smuzhiyun frame->apdu.class = 0xFF;
282*4882a593Smuzhiyun frame->apdu.ins = 0;
283*4882a593Smuzhiyun frame->apdu.p1 = 0;
284*4882a593Smuzhiyun frame->apdu.p2 = 0;
285*4882a593Smuzhiyun }
286*4882a593Smuzhiyun
pn533_acr122_tx_frame_finish(void * _frame)287*4882a593Smuzhiyun static void pn533_acr122_tx_frame_finish(void *_frame)
288*4882a593Smuzhiyun {
289*4882a593Smuzhiyun struct pn533_acr122_tx_frame *frame = _frame;
290*4882a593Smuzhiyun
291*4882a593Smuzhiyun frame->ccid.datalen += frame->datalen;
292*4882a593Smuzhiyun }
293*4882a593Smuzhiyun
pn533_acr122_tx_update_payload_len(void * _frame,int len)294*4882a593Smuzhiyun static void pn533_acr122_tx_update_payload_len(void *_frame, int len)
295*4882a593Smuzhiyun {
296*4882a593Smuzhiyun struct pn533_acr122_tx_frame *frame = _frame;
297*4882a593Smuzhiyun
298*4882a593Smuzhiyun frame->datalen += len;
299*4882a593Smuzhiyun }
300*4882a593Smuzhiyun
pn533_acr122_is_rx_frame_valid(void * _frame,struct pn533 * dev)301*4882a593Smuzhiyun static bool pn533_acr122_is_rx_frame_valid(void *_frame, struct pn533 *dev)
302*4882a593Smuzhiyun {
303*4882a593Smuzhiyun struct pn533_acr122_rx_frame *frame = _frame;
304*4882a593Smuzhiyun
305*4882a593Smuzhiyun if (frame->ccid.type != 0x83)
306*4882a593Smuzhiyun return false;
307*4882a593Smuzhiyun
308*4882a593Smuzhiyun if (!frame->ccid.datalen)
309*4882a593Smuzhiyun return false;
310*4882a593Smuzhiyun
311*4882a593Smuzhiyun if (frame->data[frame->ccid.datalen - 2] == 0x63)
312*4882a593Smuzhiyun return false;
313*4882a593Smuzhiyun
314*4882a593Smuzhiyun return true;
315*4882a593Smuzhiyun }
316*4882a593Smuzhiyun
pn533_acr122_rx_frame_size(void * frame)317*4882a593Smuzhiyun static int pn533_acr122_rx_frame_size(void *frame)
318*4882a593Smuzhiyun {
319*4882a593Smuzhiyun struct pn533_acr122_rx_frame *f = frame;
320*4882a593Smuzhiyun
321*4882a593Smuzhiyun /* f->ccid.datalen already includes tail length */
322*4882a593Smuzhiyun return sizeof(struct pn533_acr122_rx_frame) + f->ccid.datalen;
323*4882a593Smuzhiyun }
324*4882a593Smuzhiyun
pn533_acr122_get_cmd_code(void * frame)325*4882a593Smuzhiyun static u8 pn533_acr122_get_cmd_code(void *frame)
326*4882a593Smuzhiyun {
327*4882a593Smuzhiyun struct pn533_acr122_rx_frame *f = frame;
328*4882a593Smuzhiyun
329*4882a593Smuzhiyun return PN533_FRAME_CMD(f);
330*4882a593Smuzhiyun }
331*4882a593Smuzhiyun
332*4882a593Smuzhiyun static struct pn533_frame_ops pn533_acr122_frame_ops = {
333*4882a593Smuzhiyun .tx_frame_init = pn533_acr122_tx_frame_init,
334*4882a593Smuzhiyun .tx_frame_finish = pn533_acr122_tx_frame_finish,
335*4882a593Smuzhiyun .tx_update_payload_len = pn533_acr122_tx_update_payload_len,
336*4882a593Smuzhiyun .tx_header_len = PN533_ACR122_TX_FRAME_HEADER_LEN,
337*4882a593Smuzhiyun .tx_tail_len = PN533_ACR122_TX_FRAME_TAIL_LEN,
338*4882a593Smuzhiyun
339*4882a593Smuzhiyun .rx_is_frame_valid = pn533_acr122_is_rx_frame_valid,
340*4882a593Smuzhiyun .rx_header_len = PN533_ACR122_RX_FRAME_HEADER_LEN,
341*4882a593Smuzhiyun .rx_tail_len = PN533_ACR122_RX_FRAME_TAIL_LEN,
342*4882a593Smuzhiyun .rx_frame_size = pn533_acr122_rx_frame_size,
343*4882a593Smuzhiyun
344*4882a593Smuzhiyun .max_payload_len = PN533_ACR122_FRAME_MAX_PAYLOAD_LEN,
345*4882a593Smuzhiyun .get_cmd_code = pn533_acr122_get_cmd_code,
346*4882a593Smuzhiyun };
347*4882a593Smuzhiyun
348*4882a593Smuzhiyun struct pn533_acr122_poweron_rdr_arg {
349*4882a593Smuzhiyun int rc;
350*4882a593Smuzhiyun struct completion done;
351*4882a593Smuzhiyun };
352*4882a593Smuzhiyun
pn533_acr122_poweron_rdr_resp(struct urb * urb)353*4882a593Smuzhiyun static void pn533_acr122_poweron_rdr_resp(struct urb *urb)
354*4882a593Smuzhiyun {
355*4882a593Smuzhiyun struct pn533_acr122_poweron_rdr_arg *arg = urb->context;
356*4882a593Smuzhiyun
357*4882a593Smuzhiyun dev_dbg(&urb->dev->dev, "%s\n", __func__);
358*4882a593Smuzhiyun
359*4882a593Smuzhiyun print_hex_dump_debug("ACR122 RX: ", DUMP_PREFIX_NONE, 16, 1,
360*4882a593Smuzhiyun urb->transfer_buffer, urb->transfer_buffer_length,
361*4882a593Smuzhiyun false);
362*4882a593Smuzhiyun
363*4882a593Smuzhiyun arg->rc = urb->status;
364*4882a593Smuzhiyun complete(&arg->done);
365*4882a593Smuzhiyun }
366*4882a593Smuzhiyun
pn533_acr122_poweron_rdr(struct pn533_usb_phy * phy)367*4882a593Smuzhiyun static int pn533_acr122_poweron_rdr(struct pn533_usb_phy *phy)
368*4882a593Smuzhiyun {
369*4882a593Smuzhiyun /* Power on th reader (CCID cmd) */
370*4882a593Smuzhiyun u8 cmd[10] = {PN533_ACR122_PC_TO_RDR_ICCPOWERON,
371*4882a593Smuzhiyun 0, 0, 0, 0, 0, 0, 3, 0, 0};
372*4882a593Smuzhiyun char *buffer;
373*4882a593Smuzhiyun int transferred;
374*4882a593Smuzhiyun int rc;
375*4882a593Smuzhiyun void *cntx;
376*4882a593Smuzhiyun struct pn533_acr122_poweron_rdr_arg arg;
377*4882a593Smuzhiyun
378*4882a593Smuzhiyun dev_dbg(&phy->udev->dev, "%s\n", __func__);
379*4882a593Smuzhiyun
380*4882a593Smuzhiyun buffer = kmemdup(cmd, sizeof(cmd), GFP_KERNEL);
381*4882a593Smuzhiyun if (!buffer)
382*4882a593Smuzhiyun return -ENOMEM;
383*4882a593Smuzhiyun
384*4882a593Smuzhiyun init_completion(&arg.done);
385*4882a593Smuzhiyun cntx = phy->in_urb->context; /* backup context */
386*4882a593Smuzhiyun
387*4882a593Smuzhiyun phy->in_urb->complete = pn533_acr122_poweron_rdr_resp;
388*4882a593Smuzhiyun phy->in_urb->context = &arg;
389*4882a593Smuzhiyun
390*4882a593Smuzhiyun print_hex_dump_debug("ACR122 TX: ", DUMP_PREFIX_NONE, 16, 1,
391*4882a593Smuzhiyun cmd, sizeof(cmd), false);
392*4882a593Smuzhiyun
393*4882a593Smuzhiyun rc = usb_bulk_msg(phy->udev, phy->out_urb->pipe, buffer, sizeof(cmd),
394*4882a593Smuzhiyun &transferred, 5000);
395*4882a593Smuzhiyun kfree(buffer);
396*4882a593Smuzhiyun if (rc || (transferred != sizeof(cmd))) {
397*4882a593Smuzhiyun nfc_err(&phy->udev->dev,
398*4882a593Smuzhiyun "Reader power on cmd error %d\n", rc);
399*4882a593Smuzhiyun return rc;
400*4882a593Smuzhiyun }
401*4882a593Smuzhiyun
402*4882a593Smuzhiyun rc = usb_submit_urb(phy->in_urb, GFP_KERNEL);
403*4882a593Smuzhiyun if (rc) {
404*4882a593Smuzhiyun nfc_err(&phy->udev->dev,
405*4882a593Smuzhiyun "Can't submit reader poweron cmd response %d\n", rc);
406*4882a593Smuzhiyun return rc;
407*4882a593Smuzhiyun }
408*4882a593Smuzhiyun
409*4882a593Smuzhiyun wait_for_completion(&arg.done);
410*4882a593Smuzhiyun phy->in_urb->context = cntx; /* restore context */
411*4882a593Smuzhiyun
412*4882a593Smuzhiyun return arg.rc;
413*4882a593Smuzhiyun }
414*4882a593Smuzhiyun
pn533_send_complete(struct urb * urb)415*4882a593Smuzhiyun static void pn533_send_complete(struct urb *urb)
416*4882a593Smuzhiyun {
417*4882a593Smuzhiyun struct pn533_usb_phy *phy = urb->context;
418*4882a593Smuzhiyun
419*4882a593Smuzhiyun switch (urb->status) {
420*4882a593Smuzhiyun case 0:
421*4882a593Smuzhiyun break; /* success */
422*4882a593Smuzhiyun case -ECONNRESET:
423*4882a593Smuzhiyun case -ENOENT:
424*4882a593Smuzhiyun dev_dbg(&phy->udev->dev,
425*4882a593Smuzhiyun "The urb has been stopped (status %d)\n",
426*4882a593Smuzhiyun urb->status);
427*4882a593Smuzhiyun break;
428*4882a593Smuzhiyun case -ESHUTDOWN:
429*4882a593Smuzhiyun default:
430*4882a593Smuzhiyun nfc_err(&phy->udev->dev,
431*4882a593Smuzhiyun "Urb failure (status %d)\n",
432*4882a593Smuzhiyun urb->status);
433*4882a593Smuzhiyun }
434*4882a593Smuzhiyun }
435*4882a593Smuzhiyun
436*4882a593Smuzhiyun static struct pn533_phy_ops usb_phy_ops = {
437*4882a593Smuzhiyun .send_frame = pn533_usb_send_frame,
438*4882a593Smuzhiyun .send_ack = pn533_usb_send_ack,
439*4882a593Smuzhiyun .abort_cmd = pn533_usb_abort_cmd,
440*4882a593Smuzhiyun };
441*4882a593Smuzhiyun
pn533_usb_probe(struct usb_interface * interface,const struct usb_device_id * id)442*4882a593Smuzhiyun static int pn533_usb_probe(struct usb_interface *interface,
443*4882a593Smuzhiyun const struct usb_device_id *id)
444*4882a593Smuzhiyun {
445*4882a593Smuzhiyun struct pn533 *priv;
446*4882a593Smuzhiyun struct pn533_usb_phy *phy;
447*4882a593Smuzhiyun struct usb_host_interface *iface_desc;
448*4882a593Smuzhiyun struct usb_endpoint_descriptor *endpoint;
449*4882a593Smuzhiyun int in_endpoint = 0;
450*4882a593Smuzhiyun int out_endpoint = 0;
451*4882a593Smuzhiyun int rc = -ENOMEM;
452*4882a593Smuzhiyun int i;
453*4882a593Smuzhiyun u32 protocols;
454*4882a593Smuzhiyun enum pn533_protocol_type protocol_type = PN533_PROTO_REQ_ACK_RESP;
455*4882a593Smuzhiyun struct pn533_frame_ops *fops = NULL;
456*4882a593Smuzhiyun unsigned char *in_buf;
457*4882a593Smuzhiyun int in_buf_len = PN533_EXT_FRAME_HEADER_LEN +
458*4882a593Smuzhiyun PN533_STD_FRAME_MAX_PAYLOAD_LEN +
459*4882a593Smuzhiyun PN533_STD_FRAME_TAIL_LEN;
460*4882a593Smuzhiyun
461*4882a593Smuzhiyun phy = devm_kzalloc(&interface->dev, sizeof(*phy), GFP_KERNEL);
462*4882a593Smuzhiyun if (!phy)
463*4882a593Smuzhiyun return -ENOMEM;
464*4882a593Smuzhiyun
465*4882a593Smuzhiyun in_buf = kzalloc(in_buf_len, GFP_KERNEL);
466*4882a593Smuzhiyun if (!in_buf)
467*4882a593Smuzhiyun return -ENOMEM;
468*4882a593Smuzhiyun
469*4882a593Smuzhiyun phy->udev = usb_get_dev(interface_to_usbdev(interface));
470*4882a593Smuzhiyun phy->interface = interface;
471*4882a593Smuzhiyun
472*4882a593Smuzhiyun iface_desc = interface->cur_altsetting;
473*4882a593Smuzhiyun for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) {
474*4882a593Smuzhiyun endpoint = &iface_desc->endpoint[i].desc;
475*4882a593Smuzhiyun
476*4882a593Smuzhiyun if (!in_endpoint && usb_endpoint_is_bulk_in(endpoint))
477*4882a593Smuzhiyun in_endpoint = endpoint->bEndpointAddress;
478*4882a593Smuzhiyun
479*4882a593Smuzhiyun if (!out_endpoint && usb_endpoint_is_bulk_out(endpoint))
480*4882a593Smuzhiyun out_endpoint = endpoint->bEndpointAddress;
481*4882a593Smuzhiyun }
482*4882a593Smuzhiyun
483*4882a593Smuzhiyun if (!in_endpoint || !out_endpoint) {
484*4882a593Smuzhiyun nfc_err(&interface->dev,
485*4882a593Smuzhiyun "Could not find bulk-in or bulk-out endpoint\n");
486*4882a593Smuzhiyun rc = -ENODEV;
487*4882a593Smuzhiyun goto error;
488*4882a593Smuzhiyun }
489*4882a593Smuzhiyun
490*4882a593Smuzhiyun phy->in_urb = usb_alloc_urb(0, GFP_KERNEL);
491*4882a593Smuzhiyun phy->out_urb = usb_alloc_urb(0, GFP_KERNEL);
492*4882a593Smuzhiyun phy->ack_urb = usb_alloc_urb(0, GFP_KERNEL);
493*4882a593Smuzhiyun
494*4882a593Smuzhiyun if (!phy->in_urb || !phy->out_urb || !phy->ack_urb)
495*4882a593Smuzhiyun goto error;
496*4882a593Smuzhiyun
497*4882a593Smuzhiyun usb_fill_bulk_urb(phy->in_urb, phy->udev,
498*4882a593Smuzhiyun usb_rcvbulkpipe(phy->udev, in_endpoint),
499*4882a593Smuzhiyun in_buf, in_buf_len, NULL, phy);
500*4882a593Smuzhiyun
501*4882a593Smuzhiyun usb_fill_bulk_urb(phy->out_urb, phy->udev,
502*4882a593Smuzhiyun usb_sndbulkpipe(phy->udev, out_endpoint),
503*4882a593Smuzhiyun NULL, 0, pn533_send_complete, phy);
504*4882a593Smuzhiyun usb_fill_bulk_urb(phy->ack_urb, phy->udev,
505*4882a593Smuzhiyun usb_sndbulkpipe(phy->udev, out_endpoint),
506*4882a593Smuzhiyun NULL, 0, pn533_send_complete, phy);
507*4882a593Smuzhiyun
508*4882a593Smuzhiyun switch (id->driver_info) {
509*4882a593Smuzhiyun case PN533_DEVICE_STD:
510*4882a593Smuzhiyun protocols = PN533_ALL_PROTOCOLS;
511*4882a593Smuzhiyun break;
512*4882a593Smuzhiyun
513*4882a593Smuzhiyun case PN533_DEVICE_PASORI:
514*4882a593Smuzhiyun protocols = PN533_NO_TYPE_B_PROTOCOLS;
515*4882a593Smuzhiyun break;
516*4882a593Smuzhiyun
517*4882a593Smuzhiyun case PN533_DEVICE_ACR122U:
518*4882a593Smuzhiyun protocols = PN533_NO_TYPE_B_PROTOCOLS;
519*4882a593Smuzhiyun fops = &pn533_acr122_frame_ops;
520*4882a593Smuzhiyun protocol_type = PN533_PROTO_REQ_RESP,
521*4882a593Smuzhiyun
522*4882a593Smuzhiyun rc = pn533_acr122_poweron_rdr(phy);
523*4882a593Smuzhiyun if (rc < 0) {
524*4882a593Smuzhiyun nfc_err(&interface->dev,
525*4882a593Smuzhiyun "Couldn't poweron the reader (error %d)\n", rc);
526*4882a593Smuzhiyun goto error;
527*4882a593Smuzhiyun }
528*4882a593Smuzhiyun break;
529*4882a593Smuzhiyun
530*4882a593Smuzhiyun default:
531*4882a593Smuzhiyun nfc_err(&interface->dev, "Unknown device type %lu\n",
532*4882a593Smuzhiyun id->driver_info);
533*4882a593Smuzhiyun rc = -EINVAL;
534*4882a593Smuzhiyun goto error;
535*4882a593Smuzhiyun }
536*4882a593Smuzhiyun
537*4882a593Smuzhiyun priv = pn53x_common_init(id->driver_info, protocol_type,
538*4882a593Smuzhiyun phy, &usb_phy_ops, fops,
539*4882a593Smuzhiyun &phy->udev->dev);
540*4882a593Smuzhiyun
541*4882a593Smuzhiyun if (IS_ERR(priv)) {
542*4882a593Smuzhiyun rc = PTR_ERR(priv);
543*4882a593Smuzhiyun goto error;
544*4882a593Smuzhiyun }
545*4882a593Smuzhiyun
546*4882a593Smuzhiyun phy->priv = priv;
547*4882a593Smuzhiyun
548*4882a593Smuzhiyun rc = pn533_finalize_setup(priv);
549*4882a593Smuzhiyun if (rc)
550*4882a593Smuzhiyun goto err_clean;
551*4882a593Smuzhiyun
552*4882a593Smuzhiyun usb_set_intfdata(interface, phy);
553*4882a593Smuzhiyun rc = pn53x_register_nfc(priv, protocols, &interface->dev);
554*4882a593Smuzhiyun if (rc)
555*4882a593Smuzhiyun goto err_clean;
556*4882a593Smuzhiyun
557*4882a593Smuzhiyun return 0;
558*4882a593Smuzhiyun
559*4882a593Smuzhiyun err_clean:
560*4882a593Smuzhiyun pn53x_common_clean(priv);
561*4882a593Smuzhiyun error:
562*4882a593Smuzhiyun usb_kill_urb(phy->in_urb);
563*4882a593Smuzhiyun usb_kill_urb(phy->out_urb);
564*4882a593Smuzhiyun usb_kill_urb(phy->ack_urb);
565*4882a593Smuzhiyun
566*4882a593Smuzhiyun usb_free_urb(phy->in_urb);
567*4882a593Smuzhiyun usb_free_urb(phy->out_urb);
568*4882a593Smuzhiyun usb_free_urb(phy->ack_urb);
569*4882a593Smuzhiyun usb_put_dev(phy->udev);
570*4882a593Smuzhiyun kfree(in_buf);
571*4882a593Smuzhiyun kfree(phy->ack_buffer);
572*4882a593Smuzhiyun
573*4882a593Smuzhiyun return rc;
574*4882a593Smuzhiyun }
575*4882a593Smuzhiyun
pn533_usb_disconnect(struct usb_interface * interface)576*4882a593Smuzhiyun static void pn533_usb_disconnect(struct usb_interface *interface)
577*4882a593Smuzhiyun {
578*4882a593Smuzhiyun struct pn533_usb_phy *phy = usb_get_intfdata(interface);
579*4882a593Smuzhiyun
580*4882a593Smuzhiyun if (!phy)
581*4882a593Smuzhiyun return;
582*4882a593Smuzhiyun
583*4882a593Smuzhiyun pn53x_unregister_nfc(phy->priv);
584*4882a593Smuzhiyun pn53x_common_clean(phy->priv);
585*4882a593Smuzhiyun
586*4882a593Smuzhiyun usb_set_intfdata(interface, NULL);
587*4882a593Smuzhiyun
588*4882a593Smuzhiyun usb_kill_urb(phy->in_urb);
589*4882a593Smuzhiyun usb_kill_urb(phy->out_urb);
590*4882a593Smuzhiyun usb_kill_urb(phy->ack_urb);
591*4882a593Smuzhiyun
592*4882a593Smuzhiyun kfree(phy->in_urb->transfer_buffer);
593*4882a593Smuzhiyun usb_free_urb(phy->in_urb);
594*4882a593Smuzhiyun usb_free_urb(phy->out_urb);
595*4882a593Smuzhiyun usb_free_urb(phy->ack_urb);
596*4882a593Smuzhiyun kfree(phy->ack_buffer);
597*4882a593Smuzhiyun
598*4882a593Smuzhiyun nfc_info(&interface->dev, "NXP PN533 NFC device disconnected\n");
599*4882a593Smuzhiyun }
600*4882a593Smuzhiyun
601*4882a593Smuzhiyun static struct usb_driver pn533_usb_driver = {
602*4882a593Smuzhiyun .name = "pn533_usb",
603*4882a593Smuzhiyun .probe = pn533_usb_probe,
604*4882a593Smuzhiyun .disconnect = pn533_usb_disconnect,
605*4882a593Smuzhiyun .id_table = pn533_usb_table,
606*4882a593Smuzhiyun };
607*4882a593Smuzhiyun
608*4882a593Smuzhiyun module_usb_driver(pn533_usb_driver);
609*4882a593Smuzhiyun
610*4882a593Smuzhiyun MODULE_AUTHOR("Lauro Ramos Venancio <lauro.venancio@openbossa.org>");
611*4882a593Smuzhiyun MODULE_AUTHOR("Aloisio Almeida Jr <aloisio.almeida@openbossa.org>");
612*4882a593Smuzhiyun MODULE_AUTHOR("Waldemar Rymarkiewicz <waldemar.rymarkiewicz@tieto.com>");
613*4882a593Smuzhiyun MODULE_DESCRIPTION("PN533 USB driver ver " VERSION);
614*4882a593Smuzhiyun MODULE_VERSION(VERSION);
615*4882a593Smuzhiyun MODULE_LICENSE("GPL");
616