diff options
author | Scott Wood <scottwood@freescale.com> | 2014-04-07 23:49:35 (GMT) |
---|---|---|
committer | Scott Wood <scottwood@freescale.com> | 2014-04-07 23:49:35 (GMT) |
commit | 62b8c978ee6b8d135d9e7953221de58000dba986 (patch) | |
tree | 683b04b2e627f6710c22c151b23c8cc9a165315e /drivers/nfc/pn533.c | |
parent | 78fd82238d0e5716578c326404184a27ba67fd6e (diff) | |
download | linux-fsl-qoriq-62b8c978ee6b8d135d9e7953221de58000dba986.tar.xz |
Rewind v3.13-rc3+ (78fd82238d0e5716) to v3.12
Diffstat (limited to 'drivers/nfc/pn533.c')
-rw-r--r-- | drivers/nfc/pn533.c | 604 |
1 files changed, 186 insertions, 418 deletions
diff --git a/drivers/nfc/pn533.c b/drivers/nfc/pn533.c index 2daf04c..5df730b 100644 --- a/drivers/nfc/pn533.c +++ b/drivers/nfc/pn533.c @@ -150,7 +150,6 @@ MODULE_DEVICE_TABLE(usb, pn533_table); #define PN533_CMD_TG_INIT_AS_TARGET 0x8c #define PN533_CMD_TG_GET_DATA 0x86 #define PN533_CMD_TG_SET_DATA 0x8e -#define PN533_CMD_TG_SET_META_DATA 0x94 #define PN533_CMD_UNDEF 0xff #define PN533_CMD_RESPONSE(cmd) (cmd + 1) @@ -374,8 +373,6 @@ struct pn533 { struct delayed_work poll_work; struct work_struct mi_rx_work; struct work_struct mi_tx_work; - struct work_struct mi_tm_rx_work; - struct work_struct mi_tm_tx_work; struct work_struct tg_work; struct work_struct rf_work; @@ -390,7 +387,6 @@ struct pn533 { struct pn533_poll_modulations *poll_mod_active[PN533_POLL_MOD_MAX + 1]; u8 poll_mod_count; u8 poll_mod_curr; - u8 poll_dep; u32 poll_protocols; u32 listen_protocols; struct timer_list listen_timer; @@ -726,32 +722,32 @@ static void pn533_recv_response(struct urb *urb) break; /* success */ case -ECONNRESET: case -ENOENT: - dev_dbg(&dev->interface->dev, - "The urb has been canceled (status %d)\n", - urb->status); + nfc_dev_dbg(&dev->interface->dev, + "The urb has been canceled (status %d)", + urb->status); goto sched_wq; case -ESHUTDOWN: default: - nfc_err(&dev->interface->dev, - "Urb failure (status %d)\n", urb->status); + nfc_dev_err(&dev->interface->dev, + "Urb failure (status %d)", urb->status); goto sched_wq; } in_frame = dev->in_urb->transfer_buffer; - dev_dbg(&dev->interface->dev, "Received a frame\n"); + nfc_dev_dbg(&dev->interface->dev, "Received a frame."); print_hex_dump_debug("PN533 RX: ", DUMP_PREFIX_NONE, 16, 1, in_frame, dev->ops->rx_frame_size(in_frame), false); if (!dev->ops->rx_is_frame_valid(in_frame, dev)) { - nfc_err(&dev->interface->dev, "Received an invalid frame\n"); + nfc_dev_err(&dev->interface->dev, "Received an invalid frame"); cmd->status = -EIO; goto sched_wq; } if (!pn533_rx_frame_is_cmd_response(dev, in_frame)) { - nfc_err(&dev->interface->dev, - "It it not the response to the last command\n"); + nfc_dev_err(&dev->interface->dev, + "It it not the response to the last command"); cmd->status = -EIO; goto sched_wq; } @@ -781,29 +777,29 @@ static void pn533_recv_ack(struct urb *urb) break; /* success */ case -ECONNRESET: case -ENOENT: - dev_dbg(&dev->interface->dev, - "The urb has been stopped (status %d)\n", - urb->status); + nfc_dev_dbg(&dev->interface->dev, + "The urb has been stopped (status %d)", + urb->status); goto sched_wq; case -ESHUTDOWN: default: - nfc_err(&dev->interface->dev, - "Urb failure (status %d)\n", urb->status); + nfc_dev_err(&dev->interface->dev, + "Urb failure (status %d)", urb->status); goto sched_wq; } in_frame = dev->in_urb->transfer_buffer; if (!pn533_std_rx_frame_is_ack(in_frame)) { - nfc_err(&dev->interface->dev, "Received an invalid ack\n"); + nfc_dev_err(&dev->interface->dev, "Received an invalid ack"); cmd->status = -EIO; goto sched_wq; } rc = pn533_submit_urb_for_response(dev, GFP_ATOMIC); if (rc) { - nfc_err(&dev->interface->dev, - "usb_submit_urb failed with result %d\n", rc); + nfc_dev_err(&dev->interface->dev, + "usb_submit_urb failed with result %d", rc); cmd->status = rc; goto sched_wq; } @@ -827,6 +823,8 @@ static int pn533_send_ack(struct pn533 *dev, gfp_t flags) /* spec 7.1.1.3: Preamble, SoPC (2), ACK Code (2), Postamble */ int rc; + nfc_dev_dbg(&dev->interface->dev, "%s", __func__); + dev->out_urb->transfer_buffer = ack; dev->out_urb->transfer_buffer_length = sizeof(ack); rc = usb_submit_urb(dev->out_urb, flags); @@ -929,7 +927,7 @@ static int __pn533_send_async(struct pn533 *dev, u8 cmd_code, struct pn533_cmd *cmd; int rc = 0; - dev_dbg(&dev->interface->dev, "Sending command 0x%x\n", cmd_code); + nfc_dev_dbg(&dev->interface->dev, "Sending command 0x%x", cmd_code); cmd = kzalloc(sizeof(*cmd), GFP_KERNEL); if (!cmd) @@ -956,8 +954,8 @@ static int __pn533_send_async(struct pn533 *dev, u8 cmd_code, goto unlock; } - dev_dbg(&dev->interface->dev, "%s Queueing command 0x%x\n", - __func__, cmd_code); + nfc_dev_dbg(&dev->interface->dev, "%s Queueing command 0x%x", __func__, + cmd_code); INIT_LIST_HEAD(&cmd->queue); list_add_tail(&cmd->queue, &dev->cmd_queue); @@ -1170,14 +1168,14 @@ static void pn533_send_complete(struct urb *urb) break; /* success */ case -ECONNRESET: case -ENOENT: - dev_dbg(&dev->interface->dev, - "The urb has been stopped (status %d)\n", - urb->status); + nfc_dev_dbg(&dev->interface->dev, + "The urb has been stopped (status %d)", + urb->status); break; case -ESHUTDOWN: default: - nfc_err(&dev->interface->dev, "Urb failure (status %d)\n", - urb->status); + nfc_dev_err(&dev->interface->dev, + "Urb failure (status %d)", urb->status); } } @@ -1454,8 +1452,8 @@ static int pn533_target_found(struct pn533 *dev, u8 tg, u8 *tgdata, struct nfc_target nfc_tgt; int rc; - dev_dbg(&dev->interface->dev, "%s: modulation=%d\n", - __func__, dev->poll_mod_curr); + nfc_dev_dbg(&dev->interface->dev, "%s - modulation=%d", __func__, + dev->poll_mod_curr); if (tg != 1) return -EPROTO; @@ -1477,8 +1475,8 @@ static int pn533_target_found(struct pn533 *dev, u8 tg, u8 *tgdata, rc = pn533_target_found_type_b(&nfc_tgt, tgdata, tgdata_len); break; default: - nfc_err(&dev->interface->dev, - "Unknown current poll modulation\n"); + nfc_dev_err(&dev->interface->dev, + "Unknown current poll modulation"); return -EPROTO; } @@ -1486,14 +1484,14 @@ static int pn533_target_found(struct pn533 *dev, u8 tg, u8 *tgdata, return rc; if (!(nfc_tgt.supported_protocols & dev->poll_protocols)) { - dev_dbg(&dev->interface->dev, - "The Tg found doesn't have the desired protocol\n"); + nfc_dev_dbg(&dev->interface->dev, + "The Tg found doesn't have the desired protocol"); return -EAGAIN; } - dev_dbg(&dev->interface->dev, - "Target found - supported protocols: 0x%x\n", - nfc_tgt.supported_protocols); + nfc_dev_dbg(&dev->interface->dev, + "Target found - supported protocols: 0x%x", + nfc_tgt.supported_protocols); dev->tgt_available_prots = nfc_tgt.supported_protocols; @@ -1550,8 +1548,7 @@ static int pn533_start_poll_complete(struct pn533 *dev, struct sk_buff *resp) u8 nbtg, tg, *tgdata; int rc, tgdata_len; - /* Toggle the DEP polling */ - dev->poll_dep = 1; + nfc_dev_dbg(&dev->interface->dev, "%s", __func__); nbtg = resp->data[0]; tg = resp->data[1]; @@ -1627,130 +1624,37 @@ static struct sk_buff *pn533_alloc_poll_tg_frame(struct pn533 *dev) #define PN533_CMD_DATAEXCH_HEAD_LEN 1 #define PN533_CMD_DATAEXCH_DATA_MAXLEN 262 -static void pn533_wq_tm_mi_recv(struct work_struct *work); -static struct sk_buff *pn533_build_response(struct pn533 *dev); - static int pn533_tm_get_data_complete(struct pn533 *dev, void *arg, struct sk_buff *resp) { - struct sk_buff *skb; - u8 status, ret, mi; - int rc; + u8 status; - dev_dbg(&dev->interface->dev, "%s\n", __func__); + nfc_dev_dbg(&dev->interface->dev, "%s", __func__); - if (IS_ERR(resp)) { - skb_queue_purge(&dev->resp_q); + if (IS_ERR(resp)) return PTR_ERR(resp); - } status = resp->data[0]; - - ret = status & PN533_CMD_RET_MASK; - mi = status & PN533_CMD_MI_MASK; - skb_pull(resp, sizeof(status)); - if (ret != PN533_CMD_RET_SUCCESS) { - rc = -EIO; - goto error; - } - - skb_queue_tail(&dev->resp_q, resp); - - if (mi) { - queue_work(dev->wq, &dev->mi_tm_rx_work); - return -EINPROGRESS; - } - - skb = pn533_build_response(dev); - if (!skb) { - rc = -EIO; - goto error; - } - - return nfc_tm_data_received(dev->nfc_dev, skb); - -error: - nfc_tm_deactivated(dev->nfc_dev); - dev->tgt_mode = 0; - skb_queue_purge(&dev->resp_q); - dev_kfree_skb(resp); - - return rc; -} - -static void pn533_wq_tm_mi_recv(struct work_struct *work) -{ - struct pn533 *dev = container_of(work, struct pn533, mi_tm_rx_work); - struct sk_buff *skb; - int rc; - - dev_dbg(&dev->interface->dev, "%s\n", __func__); - - skb = pn533_alloc_skb(dev, 0); - if (!skb) - return; - - rc = pn533_send_cmd_direct_async(dev, - PN533_CMD_TG_GET_DATA, - skb, - pn533_tm_get_data_complete, - NULL); - - if (rc < 0) - dev_kfree_skb(skb); - - return; -} - -static int pn533_tm_send_complete(struct pn533 *dev, void *arg, - struct sk_buff *resp); -static void pn533_wq_tm_mi_send(struct work_struct *work) -{ - struct pn533 *dev = container_of(work, struct pn533, mi_tm_tx_work); - struct sk_buff *skb; - int rc; - - dev_dbg(&dev->interface->dev, "%s\n", __func__); - - /* Grab the first skb in the queue */ - skb = skb_dequeue(&dev->fragment_skb); - if (skb == NULL) { /* No more data */ - /* Reset the queue for future use */ - skb_queue_head_init(&dev->fragment_skb); - goto error; + if (status != 0) { + nfc_tm_deactivated(dev->nfc_dev); + dev->tgt_mode = 0; + dev_kfree_skb(resp); + return 0; } - /* last entry - remove MI bit */ - if (skb_queue_len(&dev->fragment_skb) == 0) { - rc = pn533_send_cmd_direct_async(dev, PN533_CMD_TG_SET_DATA, - skb, pn533_tm_send_complete, NULL); - } else - rc = pn533_send_cmd_direct_async(dev, - PN533_CMD_TG_SET_META_DATA, - skb, pn533_tm_send_complete, NULL); - - if (rc == 0) /* success */ - return; - - dev_err(&dev->interface->dev, - "Error %d when trying to perform set meta data_exchange", rc); - - dev_kfree_skb(skb); - -error: - pn533_send_ack(dev, GFP_KERNEL); - queue_work(dev->wq, &dev->cmd_work); + return nfc_tm_data_received(dev->nfc_dev, resp); } static void pn533_wq_tg_get_data(struct work_struct *work) { struct pn533 *dev = container_of(work, struct pn533, tg_work); + struct sk_buff *skb; int rc; - dev_dbg(&dev->interface->dev, "%s\n", __func__); + nfc_dev_dbg(&dev->interface->dev, "%s", __func__); skb = pn533_alloc_skb(dev, 0); if (!skb) @@ -1772,7 +1676,7 @@ static int pn533_init_target_complete(struct pn533 *dev, struct sk_buff *resp) size_t gb_len; int rc; - dev_dbg(&dev->interface->dev, "%s\n", __func__); + nfc_dev_dbg(&dev->interface->dev, "%s", __func__); if (resp->len < ATR_REQ_GB_OFFSET + 1) return -EINVAL; @@ -1780,8 +1684,8 @@ static int pn533_init_target_complete(struct pn533 *dev, struct sk_buff *resp) mode = resp->data[0]; cmd = &resp->data[1]; - dev_dbg(&dev->interface->dev, "Target mode 0x%x len %d\n", - mode, resp->len); + nfc_dev_dbg(&dev->interface->dev, "Target mode 0x%x len %d\n", + mode, resp->len); if ((mode & PN533_INIT_TARGET_RESP_FRAME_MASK) == PN533_INIT_TARGET_RESP_ACTIVE) @@ -1796,8 +1700,8 @@ static int pn533_init_target_complete(struct pn533 *dev, struct sk_buff *resp) rc = nfc_tm_activated(dev->nfc_dev, NFC_PROTO_NFC_DEP_MASK, comm_mode, gb, gb_len); if (rc < 0) { - nfc_err(&dev->interface->dev, - "Error when signaling target activation\n"); + nfc_dev_err(&dev->interface->dev, + "Error when signaling target activation"); return rc; } @@ -1811,7 +1715,7 @@ static void pn533_listen_mode_timer(unsigned long data) { struct pn533 *dev = (struct pn533 *)data; - dev_dbg(&dev->interface->dev, "Listen mode timeout\n"); + nfc_dev_dbg(&dev->interface->dev, "Listen mode timeout"); dev->cancel_listen = 1; @@ -1826,12 +1730,13 @@ static int pn533_rf_complete(struct pn533 *dev, void *arg, { int rc = 0; - dev_dbg(&dev->interface->dev, "%s\n", __func__); + nfc_dev_dbg(&dev->interface->dev, "%s", __func__); if (IS_ERR(resp)) { rc = PTR_ERR(resp); - nfc_err(&dev->interface->dev, "RF setting error %d", rc); + nfc_dev_err(&dev->interface->dev, "%s RF setting error %d", + __func__, rc); return rc; } @@ -1849,7 +1754,7 @@ static void pn533_wq_rf(struct work_struct *work) struct sk_buff *skb; int rc; - dev_dbg(&dev->interface->dev, "%s\n", __func__); + nfc_dev_dbg(&dev->interface->dev, "%s", __func__); skb = pn533_alloc_skb(dev, 2); if (!skb) @@ -1862,136 +1767,25 @@ static void pn533_wq_rf(struct work_struct *work) pn533_rf_complete, NULL); if (rc < 0) { dev_kfree_skb(skb); - nfc_err(&dev->interface->dev, "RF setting error %d\n", rc); + nfc_dev_err(&dev->interface->dev, "RF setting error %d", rc); } return; } -static int pn533_poll_dep_complete(struct pn533 *dev, void *arg, - struct sk_buff *resp) -{ - struct pn533_cmd_jump_dep_response *rsp; - struct nfc_target nfc_target; - u8 target_gt_len; - int rc; - - if (IS_ERR(resp)) - return PTR_ERR(resp); - - rsp = (struct pn533_cmd_jump_dep_response *)resp->data; - - rc = rsp->status & PN533_CMD_RET_MASK; - if (rc != PN533_CMD_RET_SUCCESS) { - /* Not target found, turn radio off */ - queue_work(dev->wq, &dev->rf_work); - - dev_kfree_skb(resp); - return 0; - } - - dev_dbg(&dev->interface->dev, "Creating new target"); - - nfc_target.supported_protocols = NFC_PROTO_NFC_DEP_MASK; - nfc_target.nfcid1_len = 10; - memcpy(nfc_target.nfcid1, rsp->nfcid3t, nfc_target.nfcid1_len); - rc = nfc_targets_found(dev->nfc_dev, &nfc_target, 1); - if (rc) - goto error; - - dev->tgt_available_prots = 0; - dev->tgt_active_prot = NFC_PROTO_NFC_DEP; - - /* ATR_RES general bytes are located at offset 17 */ - target_gt_len = resp->len - 17; - rc = nfc_set_remote_general_bytes(dev->nfc_dev, - rsp->gt, target_gt_len); - if (!rc) { - rc = nfc_dep_link_is_up(dev->nfc_dev, - dev->nfc_dev->targets[0].idx, - 0, NFC_RF_INITIATOR); - - if (!rc) - pn533_poll_reset_mod_list(dev); - } -error: - dev_kfree_skb(resp); - return rc; -} - -#define PASSIVE_DATA_LEN 5 -static int pn533_poll_dep(struct nfc_dev *nfc_dev) -{ - struct pn533 *dev = nfc_get_drvdata(nfc_dev); - struct sk_buff *skb; - int rc, skb_len; - u8 *next, nfcid3[NFC_NFCID3_MAXSIZE]; - u8 passive_data[PASSIVE_DATA_LEN] = {0x00, 0xff, 0xff, 0x00, 0x3}; - - dev_dbg(&dev->interface->dev, "%s", __func__); - - if (!dev->gb) { - dev->gb = nfc_get_local_general_bytes(nfc_dev, &dev->gb_len); - - if (!dev->gb || !dev->gb_len) { - dev->poll_dep = 0; - queue_work(dev->wq, &dev->rf_work); - } - } - - skb_len = 3 + dev->gb_len; /* ActPass + BR + Next */ - skb_len += PASSIVE_DATA_LEN; - - /* NFCID3 */ - skb_len += NFC_NFCID3_MAXSIZE; - nfcid3[0] = 0x1; - nfcid3[1] = 0xfe; - get_random_bytes(nfcid3 + 2, 6); - - skb = pn533_alloc_skb(dev, skb_len); - if (!skb) - return -ENOMEM; - - *skb_put(skb, 1) = 0x01; /* Active */ - *skb_put(skb, 1) = 0x02; /* 424 kbps */ - - next = skb_put(skb, 1); /* Next */ - *next = 0; - - /* Copy passive data */ - memcpy(skb_put(skb, PASSIVE_DATA_LEN), passive_data, PASSIVE_DATA_LEN); - *next |= 1; - - /* Copy NFCID3 (which is NFCID2 from SENSF_RES) */ - memcpy(skb_put(skb, NFC_NFCID3_MAXSIZE), nfcid3, - NFC_NFCID3_MAXSIZE); - *next |= 2; - - memcpy(skb_put(skb, dev->gb_len), dev->gb, dev->gb_len); - *next |= 4; /* We have some Gi */ - - rc = pn533_send_cmd_async(dev, PN533_CMD_IN_JUMP_FOR_DEP, skb, - pn533_poll_dep_complete, NULL); - - if (rc < 0) - dev_kfree_skb(skb); - - return rc; -} - static int pn533_poll_complete(struct pn533 *dev, void *arg, struct sk_buff *resp) { struct pn533_poll_modulations *cur_mod; int rc; - dev_dbg(&dev->interface->dev, "%s\n", __func__); + nfc_dev_dbg(&dev->interface->dev, "%s", __func__); if (IS_ERR(resp)) { rc = PTR_ERR(resp); - nfc_err(&dev->interface->dev, "%s Poll complete error %d\n", - __func__, rc); + nfc_dev_err(&dev->interface->dev, "%s Poll complete error %d", + __func__, rc); if (rc == -ENOENT) { if (dev->poll_mod_count != 0) @@ -1999,8 +1793,8 @@ static int pn533_poll_complete(struct pn533 *dev, void *arg, else goto stop_poll; } else if (rc < 0) { - nfc_err(&dev->interface->dev, - "Error %d when running poll\n", rc); + nfc_dev_err(&dev->interface->dev, + "Error %d when running poll", rc); goto stop_poll; } } @@ -2019,7 +1813,7 @@ static int pn533_poll_complete(struct pn533 *dev, void *arg, goto done; if (!dev->poll_mod_count) { - dev_dbg(&dev->interface->dev, "Polling has been stopped\n"); + nfc_dev_dbg(&dev->interface->dev, "Polling has been stopped."); goto done; } @@ -2032,7 +1826,7 @@ done: return rc; stop_poll: - nfc_err(&dev->interface->dev, "Polling operation has been stopped\n"); + nfc_dev_err(&dev->interface->dev, "Polling operation has been stopped"); pn533_poll_reset_mod_list(dev); dev->poll_protocols = 0; @@ -2062,13 +1856,8 @@ static int pn533_send_poll_frame(struct pn533 *dev) mod = dev->poll_mod_active[dev->poll_mod_curr]; - dev_dbg(&dev->interface->dev, "%s mod len %d\n", - __func__, mod->len); - - if (dev->poll_dep) { - dev->poll_dep = 0; - return pn533_poll_dep(dev->nfc_dev); - } + nfc_dev_dbg(&dev->interface->dev, "%s mod len %d\n", + __func__, mod->len); if (mod->len == 0) { /* Listen mode */ cmd_code = PN533_CMD_TG_INIT_AS_TARGET; @@ -2079,7 +1868,7 @@ static int pn533_send_poll_frame(struct pn533 *dev) } if (!skb) { - nfc_err(&dev->interface->dev, "Failed to allocate skb\n"); + nfc_dev_err(&dev->interface->dev, "Failed to allocate skb."); return -ENOMEM; } @@ -2087,7 +1876,7 @@ static int pn533_send_poll_frame(struct pn533 *dev) NULL); if (rc < 0) { dev_kfree_skb(skb); - nfc_err(&dev->interface->dev, "Polling loop error %d\n", rc); + nfc_dev_err(&dev->interface->dev, "Polling loop error %d", rc); } return rc; @@ -2101,9 +1890,9 @@ static void pn533_wq_poll(struct work_struct *work) cur_mod = dev->poll_mod_active[dev->poll_mod_curr]; - dev_dbg(&dev->interface->dev, - "%s cancel_listen %d modulation len %d\n", - __func__, dev->cancel_listen, cur_mod->len); + nfc_dev_dbg(&dev->interface->dev, + "%s cancel_listen %d modulation len %d", + __func__, dev->cancel_listen, cur_mod->len); if (dev->cancel_listen == 1) { dev->cancel_listen = 0; @@ -2124,23 +1913,21 @@ static int pn533_start_poll(struct nfc_dev *nfc_dev, u32 im_protocols, u32 tm_protocols) { struct pn533 *dev = nfc_get_drvdata(nfc_dev); - struct pn533_poll_modulations *cur_mod; u8 rand_mod; - int rc; - dev_dbg(&dev->interface->dev, - "%s: im protocols 0x%x tm protocols 0x%x\n", - __func__, im_protocols, tm_protocols); + nfc_dev_dbg(&dev->interface->dev, + "%s: im protocols 0x%x tm protocols 0x%x", + __func__, im_protocols, tm_protocols); if (dev->tgt_active_prot) { - nfc_err(&dev->interface->dev, - "Cannot poll with a target already activated\n"); + nfc_dev_err(&dev->interface->dev, + "Cannot poll with a target already activated"); return -EBUSY; } if (dev->tgt_mode) { - nfc_err(&dev->interface->dev, - "Cannot poll while already being activated\n"); + nfc_dev_err(&dev->interface->dev, + "Cannot poll while already being activated"); return -EBUSY; } @@ -2159,26 +1946,20 @@ static int pn533_start_poll(struct nfc_dev *nfc_dev, rand_mod %= dev->poll_mod_count; dev->poll_mod_curr = rand_mod; - cur_mod = dev->poll_mod_active[dev->poll_mod_curr]; - - rc = pn533_send_poll_frame(dev); - - /* Start listen timer */ - if (!rc && cur_mod->len == 0 && dev->poll_mod_count > 1) - mod_timer(&dev->listen_timer, jiffies + PN533_LISTEN_TIME * HZ); - - return rc; + return pn533_send_poll_frame(dev); } static void pn533_stop_poll(struct nfc_dev *nfc_dev) { struct pn533 *dev = nfc_get_drvdata(nfc_dev); + nfc_dev_dbg(&dev->interface->dev, "%s", __func__); + del_timer(&dev->listen_timer); if (!dev->poll_mod_count) { - dev_dbg(&dev->interface->dev, - "Polling operation was not running\n"); + nfc_dev_dbg(&dev->interface->dev, + "Polling operation was not running"); return; } @@ -2192,10 +1973,11 @@ static int pn533_activate_target_nfcdep(struct pn533 *dev) struct pn533_cmd_activate_response *rsp; u16 gt_len; int rc; + struct sk_buff *skb; struct sk_buff *resp; - dev_dbg(&dev->interface->dev, "%s\n", __func__); + nfc_dev_dbg(&dev->interface->dev, "%s", __func__); skb = pn533_alloc_skb(dev, sizeof(u8) * 2); /*TG + Next*/ if (!skb) @@ -2211,8 +1993,8 @@ static int pn533_activate_target_nfcdep(struct pn533 *dev) rsp = (struct pn533_cmd_activate_response *)resp->data; rc = rsp->status & PN533_CMD_RET_MASK; if (rc != PN533_CMD_RET_SUCCESS) { - nfc_err(&dev->interface->dev, - "Target activation failed (error 0x%x)\n", rc); + nfc_dev_err(&dev->interface->dev, + "Target activation failed (error 0x%x)", rc); dev_kfree_skb(resp); return -EIO; } @@ -2231,38 +2013,39 @@ static int pn533_activate_target(struct nfc_dev *nfc_dev, struct pn533 *dev = nfc_get_drvdata(nfc_dev); int rc; - dev_dbg(&dev->interface->dev, "%s: protocol=%u\n", __func__, protocol); + nfc_dev_dbg(&dev->interface->dev, "%s - protocol=%u", __func__, + protocol); if (dev->poll_mod_count) { - nfc_err(&dev->interface->dev, - "Cannot activate while polling\n"); + nfc_dev_err(&dev->interface->dev, + "Cannot activate while polling"); return -EBUSY; } if (dev->tgt_active_prot) { - nfc_err(&dev->interface->dev, - "There is already an active target\n"); + nfc_dev_err(&dev->interface->dev, + "There is already an active target"); return -EBUSY; } if (!dev->tgt_available_prots) { - nfc_err(&dev->interface->dev, - "There is no available target to activate\n"); + nfc_dev_err(&dev->interface->dev, + "There is no available target to activate"); return -EINVAL; } if (!(dev->tgt_available_prots & (1 << protocol))) { - nfc_err(&dev->interface->dev, - "Target doesn't support requested proto %u\n", - protocol); + nfc_dev_err(&dev->interface->dev, + "Target doesn't support requested proto %u", + protocol); return -EINVAL; } if (protocol == NFC_PROTO_NFC_DEP) { rc = pn533_activate_target_nfcdep(dev); if (rc) { - nfc_err(&dev->interface->dev, - "Activating target with DEP failed %d\n", rc); + nfc_dev_err(&dev->interface->dev, + "Activating target with DEP failed %d", rc); return rc; } } @@ -2277,14 +2060,16 @@ static void pn533_deactivate_target(struct nfc_dev *nfc_dev, struct nfc_target *target) { struct pn533 *dev = nfc_get_drvdata(nfc_dev); + struct sk_buff *skb; struct sk_buff *resp; + int rc; - dev_dbg(&dev->interface->dev, "%s\n", __func__); + nfc_dev_dbg(&dev->interface->dev, "%s", __func__); if (!dev->tgt_active_prot) { - nfc_err(&dev->interface->dev, "There is no active target\n"); + nfc_dev_err(&dev->interface->dev, "There is no active target"); return; } @@ -2303,8 +2088,8 @@ static void pn533_deactivate_target(struct nfc_dev *nfc_dev, rc = resp->data[0] & PN533_CMD_RET_MASK; if (rc != PN533_CMD_RET_SUCCESS) - nfc_err(&dev->interface->dev, - "Error 0x%x when releasing the target\n", rc); + nfc_dev_err(&dev->interface->dev, + "Error 0x%x when releasing the target", rc); dev_kfree_skb(resp); return; @@ -2326,8 +2111,8 @@ static int pn533_in_dep_link_up_complete(struct pn533 *dev, void *arg, if (dev->tgt_available_prots && !(dev->tgt_available_prots & (1 << NFC_PROTO_NFC_DEP))) { - nfc_err(&dev->interface->dev, - "The target does not support DEP\n"); + nfc_dev_err(&dev->interface->dev, + "The target does not support DEP"); rc = -EINVAL; goto error; } @@ -2336,15 +2121,15 @@ static int pn533_in_dep_link_up_complete(struct pn533 *dev, void *arg, rc = rsp->status & PN533_CMD_RET_MASK; if (rc != PN533_CMD_RET_SUCCESS) { - nfc_err(&dev->interface->dev, - "Bringing DEP link up failed (error 0x%x)\n", rc); + nfc_dev_err(&dev->interface->dev, + "Bringing DEP link up failed (error 0x%x)", rc); goto error; } if (!dev->tgt_available_prots) { struct nfc_target nfc_target; - dev_dbg(&dev->interface->dev, "Creating new target\n"); + nfc_dev_dbg(&dev->interface->dev, "Creating new target"); nfc_target.supported_protocols = NFC_PROTO_NFC_DEP_MASK; nfc_target.nfcid1_len = 10; @@ -2373,6 +2158,7 @@ error: } static int pn533_rf_field(struct nfc_dev *nfc_dev, u8 rf); +#define PASSIVE_DATA_LEN 5 static int pn533_dep_link_up(struct nfc_dev *nfc_dev, struct nfc_target *target, u8 comm_mode, u8 *gb, size_t gb_len) { @@ -2380,19 +2166,20 @@ static int pn533_dep_link_up(struct nfc_dev *nfc_dev, struct nfc_target *target, struct sk_buff *skb; int rc, skb_len; u8 *next, *arg, nfcid3[NFC_NFCID3_MAXSIZE]; + u8 passive_data[PASSIVE_DATA_LEN] = {0x00, 0xff, 0xff, 0x00, 0x3}; - dev_dbg(&dev->interface->dev, "%s\n", __func__); + nfc_dev_dbg(&dev->interface->dev, "%s", __func__); if (dev->poll_mod_count) { - nfc_err(&dev->interface->dev, - "Cannot bring the DEP link up while polling\n"); + nfc_dev_err(&dev->interface->dev, + "Cannot bring the DEP link up while polling"); return -EBUSY; } if (dev->tgt_active_prot) { - nfc_err(&dev->interface->dev, - "There is already an active target\n"); + nfc_dev_err(&dev->interface->dev, + "There is already an active target"); return -EBUSY; } @@ -2462,7 +2249,7 @@ static int pn533_dep_link_down(struct nfc_dev *nfc_dev) { struct pn533 *dev = nfc_get_drvdata(nfc_dev); - dev_dbg(&dev->interface->dev, "%s\n", __func__); + nfc_dev_dbg(&dev->interface->dev, "%s", __func__); pn533_poll_reset_mod_list(dev); @@ -2487,7 +2274,7 @@ static struct sk_buff *pn533_build_response(struct pn533 *dev) struct sk_buff *skb, *tmp, *t; unsigned int skb_len = 0, tmp_len = 0; - dev_dbg(&dev->interface->dev, "%s\n", __func__); + nfc_dev_dbg(&dev->interface->dev, "%s", __func__); if (skb_queue_empty(&dev->resp_q)) return NULL; @@ -2500,8 +2287,8 @@ static struct sk_buff *pn533_build_response(struct pn533 *dev) skb_queue_walk_safe(&dev->resp_q, tmp, t) skb_len += tmp->len; - dev_dbg(&dev->interface->dev, "%s total length %d\n", - __func__, skb_len); + nfc_dev_dbg(&dev->interface->dev, "%s total length %d\n", + __func__, skb_len); skb = alloc_skb(skb_len, GFP_KERNEL); if (skb == NULL) @@ -2528,7 +2315,7 @@ static int pn533_data_exchange_complete(struct pn533 *dev, void *_arg, int rc = 0; u8 status, ret, mi; - dev_dbg(&dev->interface->dev, "%s\n", __func__); + nfc_dev_dbg(&dev->interface->dev, "%s", __func__); if (IS_ERR(resp)) { rc = PTR_ERR(resp); @@ -2542,8 +2329,8 @@ static int pn533_data_exchange_complete(struct pn533 *dev, void *_arg, skb_pull(resp, sizeof(status)); if (ret != PN533_CMD_RET_SUCCESS) { - nfc_err(&dev->interface->dev, - "Exchanging data failed (error 0x%x)\n", ret); + nfc_dev_err(&dev->interface->dev, + "Exchanging data failed (error 0x%x)", ret); rc = -EIO; goto error; } @@ -2601,17 +2388,14 @@ static int pn533_fill_fragment_skbs(struct pn533 *dev, struct sk_buff *skb) break; } - if (!dev->tgt_mode) { - /* Reserve the TG/MI byte */ - skb_reserve(frag, 1); + /* Reserve the TG/MI byte */ + skb_reserve(frag, 1); - /* MI + TG */ - if (frag_size == PN533_CMD_DATAFRAME_MAXLEN) - *skb_push(frag, sizeof(u8)) = - (PN533_CMD_MI_MASK | 1); - else - *skb_push(frag, sizeof(u8)) = 1; /* TG */ - } + /* MI + TG */ + if (frag_size == PN533_CMD_DATAFRAME_MAXLEN) + *skb_push(frag, sizeof(u8)) = (PN533_CMD_MI_MASK | 1); + else + *skb_push(frag, sizeof(u8)) = 1; /* TG */ memcpy(skb_put(frag, frag_size), skb->data, frag_size); @@ -2636,11 +2420,11 @@ static int pn533_transceive(struct nfc_dev *nfc_dev, struct pn533_data_exchange_arg *arg = NULL; int rc; - dev_dbg(&dev->interface->dev, "%s\n", __func__); + nfc_dev_dbg(&dev->interface->dev, "%s", __func__); if (!dev->tgt_active_prot) { - nfc_err(&dev->interface->dev, - "Can't exchange data if there is no active target\n"); + nfc_dev_err(&dev->interface->dev, + "Can't exchange data if there is no active target"); rc = -EINVAL; goto error; } @@ -2703,18 +2487,13 @@ static int pn533_tm_send_complete(struct pn533 *dev, void *arg, { u8 status; - dev_dbg(&dev->interface->dev, "%s\n", __func__); + nfc_dev_dbg(&dev->interface->dev, "%s", __func__); if (IS_ERR(resp)) return PTR_ERR(resp); status = resp->data[0]; - /* Prepare for the next round */ - if (skb_queue_len(&dev->fragment_skb) > 0) { - queue_work(dev->wq, &dev->mi_tm_tx_work); - return -EINPROGRESS; - } dev_kfree_skb(resp); if (status != 0) { @@ -2735,34 +2514,19 @@ static int pn533_tm_send(struct nfc_dev *nfc_dev, struct sk_buff *skb) struct pn533 *dev = nfc_get_drvdata(nfc_dev); int rc; - dev_dbg(&dev->interface->dev, "%s\n", __func__); + nfc_dev_dbg(&dev->interface->dev, "%s", __func__); - /* let's split in multiple chunks if size's too big */ if (skb->len > PN533_CMD_DATAEXCH_DATA_MAXLEN) { - rc = pn533_fill_fragment_skbs(dev, skb); - if (rc <= 0) - goto error; - - /* get the first skb */ - skb = skb_dequeue(&dev->fragment_skb); - if (!skb) { - rc = -EIO; - goto error; - } - - rc = pn533_send_data_async(dev, PN533_CMD_TG_SET_META_DATA, skb, - pn533_tm_send_complete, NULL); - } else { - /* Send th skb */ - rc = pn533_send_data_async(dev, PN533_CMD_TG_SET_DATA, skb, - pn533_tm_send_complete, NULL); + nfc_dev_err(&dev->interface->dev, + "Data length greater than the max allowed: %d", + PN533_CMD_DATAEXCH_DATA_MAXLEN); + return -ENOSYS; } -error: - if (rc < 0) { + rc = pn533_send_data_async(dev, PN533_CMD_TG_SET_DATA, skb, + pn533_tm_send_complete, NULL); + if (rc < 0) dev_kfree_skb(skb); - skb_queue_purge(&dev->fragment_skb); - } return rc; } @@ -2770,10 +2534,11 @@ error: static void pn533_wq_mi_recv(struct work_struct *work) { struct pn533 *dev = container_of(work, struct pn533, mi_rx_work); + struct sk_buff *skb; int rc; - dev_dbg(&dev->interface->dev, "%s\n", __func__); + nfc_dev_dbg(&dev->interface->dev, "%s", __func__); skb = pn533_alloc_skb(dev, PN533_CMD_DATAEXCH_HEAD_LEN); if (!skb) @@ -2805,8 +2570,8 @@ static void pn533_wq_mi_recv(struct work_struct *work) if (rc == 0) /* success */ return; - nfc_err(&dev->interface->dev, - "Error %d when trying to perform data_exchange\n", rc); + nfc_dev_err(&dev->interface->dev, + "Error %d when trying to perform data_exchange", rc); dev_kfree_skb(skb); kfree(dev->cmd_complete_mi_arg); @@ -2822,7 +2587,7 @@ static void pn533_wq_mi_send(struct work_struct *work) struct sk_buff *skb; int rc; - dev_dbg(&dev->interface->dev, "%s\n", __func__); + nfc_dev_dbg(&dev->interface->dev, "%s", __func__); /* Grab the first skb in the queue */ skb = skb_dequeue(&dev->fragment_skb); @@ -2860,8 +2625,8 @@ static void pn533_wq_mi_send(struct work_struct *work) if (rc == 0) /* success */ return; - nfc_err(&dev->interface->dev, - "Error %d when trying to perform data_exchange\n", rc); + nfc_dev_err(&dev->interface->dev, + "Error %d when trying to perform data_exchange", rc); dev_kfree_skb(skb); kfree(dev->cmd_complete_dep_arg); @@ -2876,9 +2641,10 @@ static int pn533_set_configuration(struct pn533 *dev, u8 cfgitem, u8 *cfgdata, { struct sk_buff *skb; struct sk_buff *resp; + int skb_len; - dev_dbg(&dev->interface->dev, "%s\n", __func__); + nfc_dev_dbg(&dev->interface->dev, "%s", __func__); skb_len = sizeof(cfgitem) + cfgdata_len; /* cfgitem + cfgdata */ @@ -2925,7 +2691,7 @@ static int pn533_pasori_fw_reset(struct pn533 *dev) struct sk_buff *skb; struct sk_buff *resp; - dev_dbg(&dev->interface->dev, "%s\n", __func__); + nfc_dev_dbg(&dev->interface->dev, "%s", __func__); skb = pn533_alloc_skb(dev, sizeof(u8)); if (!skb) @@ -2951,7 +2717,7 @@ static void pn533_acr122_poweron_rdr_resp(struct urb *urb) { struct pn533_acr122_poweron_rdr_arg *arg = urb->context; - dev_dbg(&urb->dev->dev, "%s\n", __func__); + nfc_dev_dbg(&urb->dev->dev, "%s", __func__); print_hex_dump_debug("ACR122 RX: ", DUMP_PREFIX_NONE, 16, 1, urb->transfer_buffer, urb->transfer_buffer_length, @@ -2971,7 +2737,7 @@ static int pn533_acr122_poweron_rdr(struct pn533 *dev) void *cntx; struct pn533_acr122_poweron_rdr_arg arg; - dev_dbg(&dev->interface->dev, "%s\n", __func__); + nfc_dev_dbg(&dev->interface->dev, "%s", __func__); init_completion(&arg.done); cntx = dev->in_urb->context; /* backup context */ @@ -2989,15 +2755,16 @@ static int pn533_acr122_poweron_rdr(struct pn533 *dev) rc = usb_submit_urb(dev->out_urb, GFP_KERNEL); if (rc) { - nfc_err(&dev->interface->dev, - "Reader power on cmd error %d\n", rc); + nfc_dev_err(&dev->interface->dev, + "Reader power on cmd error %d", rc); return rc; } rc = usb_submit_urb(dev->in_urb, GFP_KERNEL); if (rc) { - nfc_err(&dev->interface->dev, - "Can't submit reader poweron cmd response %d\n", rc); + nfc_dev_err(&dev->interface->dev, + "Can't submit for reader power on cmd response %d", + rc); return rc; } @@ -3018,19 +2785,20 @@ static int pn533_rf_field(struct nfc_dev *nfc_dev, u8 rf) rc = pn533_set_configuration(dev, PN533_CFGITEM_RF_FIELD, (u8 *)&rf_field, 1); if (rc) { - nfc_err(&dev->interface->dev, "Error on setting RF field\n"); + nfc_dev_err(&dev->interface->dev, + "Error on setting RF field"); return rc; } return rc; } -static int pn533_dev_up(struct nfc_dev *nfc_dev) +int pn533_dev_up(struct nfc_dev *nfc_dev) { return pn533_rf_field(nfc_dev, 1); } -static int pn533_dev_down(struct nfc_dev *nfc_dev) +int pn533_dev_down(struct nfc_dev *nfc_dev) { return pn533_rf_field(nfc_dev, 0); } @@ -3071,16 +2839,16 @@ static int pn533_setup(struct pn533 *dev) break; default: - nfc_err(&dev->interface->dev, "Unknown device type %d\n", - dev->device_type); + nfc_dev_err(&dev->interface->dev, "Unknown device type %d\n", + dev->device_type); return -EINVAL; } rc = pn533_set_configuration(dev, PN533_CFGITEM_MAX_RETRIES, (u8 *)&max_retries, sizeof(max_retries)); if (rc) { - nfc_err(&dev->interface->dev, - "Error on setting MAX_RETRIES config\n"); + nfc_dev_err(&dev->interface->dev, + "Error on setting MAX_RETRIES config"); return rc; } @@ -3088,7 +2856,8 @@ static int pn533_setup(struct pn533 *dev) rc = pn533_set_configuration(dev, PN533_CFGITEM_TIMING, (u8 *)&timing, sizeof(timing)); if (rc) { - nfc_err(&dev->interface->dev, "Error on setting RF timings\n"); + nfc_dev_err(&dev->interface->dev, + "Error on setting RF timings"); return rc; } @@ -3102,8 +2871,8 @@ static int pn533_setup(struct pn533 *dev) rc = pn533_set_configuration(dev, PN533_CFGITEM_PASORI, pasori_cfg, 3); if (rc) { - nfc_err(&dev->interface->dev, - "Error while settings PASORI config\n"); + nfc_dev_err(&dev->interface->dev, + "Error while settings PASORI config"); return rc; } @@ -3148,8 +2917,8 @@ static int pn533_probe(struct usb_interface *interface, } if (!in_endpoint || !out_endpoint) { - nfc_err(&interface->dev, - "Could not find bulk-in or bulk-out endpoint\n"); + nfc_dev_err(&interface->dev, + "Could not find bulk-in or bulk-out endpoint"); rc = -ENODEV; goto error; } @@ -3172,8 +2941,6 @@ static int pn533_probe(struct usb_interface *interface, INIT_WORK(&dev->mi_rx_work, pn533_wq_mi_recv); INIT_WORK(&dev->mi_tx_work, pn533_wq_mi_send); INIT_WORK(&dev->tg_work, pn533_wq_tg_get_data); - INIT_WORK(&dev->mi_tm_rx_work, pn533_wq_tm_mi_recv); - INIT_WORK(&dev->mi_tm_tx_work, pn533_wq_tm_mi_send); INIT_DELAYED_WORK(&dev->poll_work, pn533_wq_poll); INIT_WORK(&dev->rf_work, pn533_wq_rf); dev->wq = alloc_ordered_workqueue("pn533", 0); @@ -3211,15 +2978,16 @@ static int pn533_probe(struct usb_interface *interface, rc = pn533_acr122_poweron_rdr(dev); if (rc < 0) { - nfc_err(&dev->interface->dev, - "Couldn't poweron the reader (error %d)\n", rc); + nfc_dev_err(&dev->interface->dev, + "Couldn't poweron the reader (error %d)", + rc); goto destroy_wq; } break; default: - nfc_err(&dev->interface->dev, "Unknown device type %d\n", - dev->device_type); + nfc_dev_err(&dev->interface->dev, "Unknown device type %d\n", + dev->device_type); rc = -EINVAL; goto destroy_wq; } @@ -3229,9 +2997,9 @@ static int pn533_probe(struct usb_interface *interface, if (rc < 0) goto destroy_wq; - nfc_info(&dev->interface->dev, - "NXP PN5%02X firmware ver %d.%d now attached\n", - fw_ver.ic, fw_ver.ver, fw_ver.rev); + nfc_dev_info(&dev->interface->dev, + "NXP PN5%02X firmware ver %d.%d now attached", + fw_ver.ic, fw_ver.ver, fw_ver.rev); dev->nfc_dev = nfc_allocate_device(&pn533_nfc_ops, protocols, @@ -3302,7 +3070,7 @@ static void pn533_disconnect(struct usb_interface *interface) usb_free_urb(dev->out_urb); kfree(dev); - nfc_info(&interface->dev, "NXP PN533 NFC device disconnected\n"); + nfc_dev_info(&interface->dev, "NXP PN533 NFC device disconnected"); } static struct usb_driver pn533_driver = { |